diff --git a/manual/chinese/Creating_a_cluster/Setting_up_replication/Understanding_cluster_status_and_node_states.md b/manual/chinese/Creating_a_cluster/Setting_up_replication/Understanding_cluster_status_and_node_states.md new file mode 100644 index 0000000000..f0fbae51f4 --- /dev/null +++ b/manual/chinese/Creating_a_cluster/Setting_up_replication/Understanding_cluster_status_and_node_states.md @@ -0,0 +1,619 @@ +# 理解集群状态和节点状态 + +## 快速参考 + +集群状态显示两个关键值,帮助您了解集群的健康状况: + +- `cluster_%_status` - 集群是否可以接受写入 +- `cluster_%_node_state` - 该特定节点的当前状态 +### PRIMARY 状态 +## 状态值 + + +当集群状态显示为 `PRIMARY` 时,集群具有法定人数,可以接受读写操作。这是正常的操作状态。 + + +##### SQL: + + +SHOW STATUS LIKE 'cluster_%_status'; +SHOW STATUS LIKE 'cluster_%_node_state'; +```sql +``` + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_status | primary | +``` + + + +`PRIMARY` 状态意味着: +### cluster_%_status +* 集群中的大多数节点已连接并且正在通信 +- **`primary`** - 正常运行,可读写 +- **`non-primary`** - 丢失仲裁,**写入被阻止** +- **`disconnected`** - 节点孤立,尝试重新连接 +* 允许进行写操作,并将被复制 +### cluster_%_node_state +* 集群正常运行 +- **`synced`** - 正常运行 +- **`joining`** - 节点加入集群(临时状态) +- **`donor`** - 帮助其他节点加入(临时状态) +- **`closed`** - 节点停止 +- **`destroyed`** - 节点崩溃,需要重启 +* 保持法定人数 +## 常见场景 + +| 发生情况 | cluster_%_status | cluster_%_node_state | 处理方法 | +|----------|------------------|---------------------|----------| +| 正常运行 | `primary` | `synced` | 无需操作 | +| 大多数节点宕机 | `non-primary` | `synced` | 启动引导或等待 | +| 节点启动中 | `disconnected` | `joining` → `synced` | 等待 | +| 节点崩溃 | 状态各异 | `destroyed` | 重启节点 | +| 网络分区(多数) | `primary` | `synced` | 正常继续运行 | +| 网络分区(少数) | `non-primary` | `synced` | 等待或引导启动 | +### NON_PRIMARY 状态 +## 从仲裁丢失中恢复 + + +当大多数节点宕机并且状态显示为 `non-primary` 时: +当集群状态显示为 `NON_PRIMARY` 时,集群已失去法定人数。这是一个关键状态,写操作被阻止以防止脑裂场景的发生。 + + +##### SQL: + + +-- 检查哪个节点具有最高序列号 + +-- 引导集群(仅在最佳节点上运行) +```sql +SHOW STATUS LIKE 'cluster_%_status' +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_status | non-primary | ++----------------------------+-------+ +``` + + +SET CLUSTER posts GLOBAL 'pc.bootstrap' = 1 + +`NON_PRIMARY` 状态发生在: +* 集群中的超过一半的节点不可达 +* 网络分区已将集群拆分 +* 当前节点组无法形成多数 + +**关键**:在此状态下,写操作被拒绝。可能需要手动干预,使用引导命令: + + + + +##### SQL: + + + +```sql +SET CLUSTER posts GLOBAL 'pc.bootstrap' = 1 +``` + + + +```json +POST /cli -d " +SET CLUSTER posts GLOBAL 'pc.bootstrap' = 1 +" +``` + + + +### DISCONNECTED 状态 + + +当集群状态显示为 `DISCONNECTED` 时,该节点未连接到任何集群组件,并正试图重新连接。 + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_status' +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_status | disconnected | ++----------------------------+-------+ +``` + + + +`DISCONNECTED` 状态通常发生在: +* 节点启动之前,尚未加入集群 +* 网络连接问题 +* 集群形成问题 +* 暂时与其他集群成员隔离 + +## cluster_%_node_state 值 + +`cluster_%_node_state` 变量显示该特定节点在集群中的当前操作状态。 + +### synced 状态 + + +当节点状态显示为 `synced` 时,节点已完全同步并处于操作状态。这是正常的工作状态。 + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_node_state' +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_node_state | synced | ++----------------------------+-------+ +``` + + + +`synced` 状态意味着: +* 所有事务都正在正常复制 +* 节点正在为集群法定人数做贡献 +* 数据与其他集群成员一致 + +### joining 状态 + + +当节点状态显示为 `joining` 时,节点正在加入集群并接收状态同步。 + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_node_state' +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_node_state | joining | ++----------------------------+-------+ +``` + + + +在 `joining` 状态期间: +* 节点正在接收集群状态 (IST 或 SST) +* 节点尚无法处理读或写请求 +* 状态传输正在进行中 +* 完成后,节点将转变为 `synced` + +### donor 状态 + + +当节点状态显示为 `donor` 时,节点正在向加入的节点提供状态传输。 + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_node_state' +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_node_state | donor | ++----------------------------+-------+ +``` + + + +在 `donor` 状态期间: +* 节点继续处理请求,但可能会出现延迟 +* 正在向另一节点提供状态传输 (SST) +* 传输完成后节点返回 `synced` +* 性能可能会暂时受到影响 + +### closed 状态 + + +当节点状态显示为 `closed` 时,节点已关闭或尚未启动。 + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_node_state' +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_node_state | closed | ++----------------------------+-------+ +``` + + + +`closed` 状态表示: +* 节点已干净地关闭 +* 节点尚未启动 +* 这是加入集群前的初始状态 +* 在计划维护期间的正常状态 + +### destroyed 状态 + + +当节点状态显示为 `destroyed` 时,节点遇到错误并异常关闭。 + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_node_state' +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_node_state | destroyed | ++----------------------------+-------+ +``` + + + +`destroyed` 状态表示: +* 发生了严重问题,需要调查 +* 节点可能需要手动干预以重新启动 +* 可能存在数据损坏或系统故障 +* 在重新启动之前查看日志以获取错误详情 + +## 不同场景下的状态组合 + +### 正常操作 + +| 场景 | cluster_%_status | cluster_%_node_state | 描述 | +|----------|------------------|---------------------|-------------| +| 健康的集群 | `primary` | `synced` | 正常操作,可以读/写 | +| 节点启动中 | `disconnected` → `primary` | `closed` → `joining` → `synced` | 正常启动序列 | +| 新节点加入 | `primary` | `donor` (帮助节点), `joining` (新节点) | SST 正在进行中 | + +### 网络问题 + +| 场景 | cluster_%_status | cluster_%_node_state | 需要采取的行动 | +|----------|------------------|---------------------|-----------------| +| 少数分区 (5 个节点中的 2 个) | `non-primary` | `synced` | 等待网络或引导 | +| 多数分区 (5 个节点中的 3 个) | `primary` | `synced` | 继续正常操作 | +| 完全隔离 | `disconnected` | `synced` | 检查网络连接 | + + +| 场景 | cluster_%_status | cluster_%_node_state | 影响 | +| 单个节点故障 (5 节点集群) | `primary` | `synced` | 集群正常继续 | +| 节点宕机 | 视情况而定 | `destroyed` | 节点需要重启/恢复 | +### 关键故障场景 + + +当集群中的大多数节点不可用时,剩余节点将显示 `NON_PRIMARY` 状态并拒绝写操作。 + +在一个5节点集群中,3个及以上节点失败时: + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_status'; +SHOW STATUS LIKE 'cluster_%_node_state'; +SHOW STATUS LIKE 'cluster_%_size'; +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_status | non-primary | +| cluster_posts_node_state | synced | +| cluster_posts_size | 2 | +``` + + + +要从该场景恢复,识别 `last_committed` 值最高的节点并引导启动它: + + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_last_committed'; +SET CLUSTER posts GLOBAL 'pc.bootstrap' = 1; + + + ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_last_committed | 1547 | ++----------------------------+-------+ +``` + + +```json +POST /cli -d " +SHOW STATUS LIKE 'cluster_%_last_committed'; +SET CLUSTER posts GLOBAL 'pc.bootstrap' = 1; +" +``` + + + +#### 网络分区(防止脑裂) + + +在网络分区场景中,只有拥有多数的分区保持 `PRIMARY` 状态: + +**多数分区(5节点集群中3个节点):** + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_status'; +SHOW STATUS LIKE 'cluster_%_size'; +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_status | primary | +| cluster_posts_size | 3 | ++----------------------------+-------+ +``` + +**少数分区(5节点集群中2个节点):** + + + +```sql +SHOW STATUS LIKE 'cluster_%_status'; +SHOW STATUS LIKE 'cluster_%_size'; +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_status | non-primary | +| cluster_posts_size | 2 | ++----------------------------+-------+ +``` + + + +### 常见事件中的状态转换 + +#### 新节点加入(成功) +``` +New Node: disconnected/closed → disconnected/joining → primary/synced +Donor Node: primary/synced → primary/donor → primary/synced +Other Nodes: primary/synced (unchanged) +``` + +#### 网络分区恢复 +``` +Minority Partition: non-primary/synced → primary/synced (when reconnected) +Majority Partition: primary/synced (unchanged throughout) +``` + +#### 整个集群完全丧失后的手动恢复 +``` +First node: disconnected/closed → primary/synced (after pc.bootstrap=1) +Other nodes: disconnected/closed → primary/joining → primary/synced +``` + +### 监控集群健康状态 + + +为了监控集群健康状态并识别问题,请检查这些关键状态变量: + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_status'; +SHOW STATUS LIKE 'cluster_%_node_state'; +SHOW STATUS LIKE 'cluster_%_size'; +SHOW STATUS LIKE 'cluster_%_last_committed'; +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_status | primary | +| cluster_posts_node_state | synced | +| cluster_posts_size | 3 | +| cluster_posts_last_committed | 1547 | ++----------------------------+-------+ +``` + + + + +查看配置节点与可见节点的差异: + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_nodes_set'; +SHOW STATUS LIKE 'cluster_%_nodes_view'; +``` + + + +```sql ++----------------------------+--------------------------------------------------------+ +| Counter | Value | ++----------------------------+--------------------------------------------------------+ +| cluster_posts_nodes_set | 10.10.0.1:9312,10.10.1.1:9312,10.10.2.1:9312 | +| cluster_posts_nodes_view | 10.10.0.1:9312:replication,10.10.1.1:9312:replication | ++----------------------------+--------------------------------------------------------+ +``` + + + +这显示一个节点(10.10.2.1:9312)已配置但当前对集群不可见,表明可能存在连接问题。 + +## 常见问题排查 + +### 写操作被拒绝 + + +当集群状态为 `NON_PRIMARY` 时,写操作将被拒绝: + + +##### SQL: + + + +```sql +INSERT INTO posts:articles VALUES (1, 'test article'); +``` + + + +```sql +ERROR 1064 (42000): cluster posts is not ready, not primary state (replication error) +``` + + + +**解决方案**:检查集群状态,等待法定人数恢复或如果节点永久不可用则手动引导启动。 + +### 节点卡在 joining 状态 + + +如果节点长时间处于 `joining` 状态: + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_node_state'; +SHOW STATUS LIKE 'cluster_%_local_recv_queue'; +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_node_state | joining | +| cluster_posts_local_recv_queue | 150 | ++----------------------------+-------+ +``` + + + +这可能表示: +* SST 期间网络带宽问题 +* 大量数据集传输中 +* 捐献节点性能问题 + +检查捐献节点状态及节点间的网络连接。 + +### 集群规模不匹配 + + +当 `cluster_%_size` 与预期节点数不符时: + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_size'; +SHOW STATUS LIKE 'cluster_%_nodes_view'; +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_size | 2 | +| cluster_posts_nodes_view | 10.10.0.1:9312:replication,10.10.1.1:9312:replication | ++----------------------------+-------+ +``` + + + +这表明一些配置的节点目前无法访问。检查缺失节点的网络连接和节点状态。 + + diff --git a/manual/english/Creating_a_cluster/Setting_up_replication/Understanding_cluster_status_and_node_states.md b/manual/english/Creating_a_cluster/Setting_up_replication/Understanding_cluster_status_and_node_states.md new file mode 100644 index 0000000000..ff46d29fe2 --- /dev/null +++ b/manual/english/Creating_a_cluster/Setting_up_replication/Understanding_cluster_status_and_node_states.md @@ -0,0 +1,94 @@ +# Understanding cluster status and node states + +## Quick reference + +The cluster status shows two key values that help you understand your cluster's health: + +- `cluster_%_status` - whether the cluster can accept writes +- `cluster_%_node_state` - what this specific node is doing + +## Status values + + + + +##### SQL: + + +```sql +SHOW STATUS LIKE 'cluster_%_status'; +SHOW STATUS LIKE 'cluster_%_node_state'; +``` + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_status | primary | +| cluster_posts_node_state | synced | ++----------------------------+-------+ +``` + + + +### cluster_%_status + +- **`primary`** - Normal operation, can read and write +- **`non-primary`** - Lost quorum, **writes blocked** +- **`disconnected`** - Node isolated, trying to reconnect + +### cluster_%_node_state + +- **`synced`** - Normal operation +- **`joining`** - Node joining cluster (temporary) +- **`donor`** - Helping another node join (temporary) +- **`closed`** - Node stopped +- **`destroyed`** - Node crashed, needs restart + +## Common scenarios + +| What happened | cluster_%_status | cluster_%_node_state | What to do | +|---------------|------------------|---------------------|------------| +| Normal operation | `primary` | `synced` | Nothing | +| Most nodes down | `non-primary` | `synced` | Bootstrap or wait | +| Node starting | `disconnected` | `joining` → `synced` | Wait | +| Node crashed | varies | `destroyed` | Restart node | +| Network partition (majority) | `primary` | `synced` | Continue normally | +| Network partition (minority) | `non-primary` | `synced` | Wait or bootstrap | + +## Recovery from quorum loss + + +When most nodes are down and status shows `non-primary`: + + +##### SQL: + + +```sql +-- Check which node has highest sequence number +SHOW STATUS LIKE 'cluster_%_last_committed'; +-- Bootstrap the cluster (run on best node only) +SET CLUSTER posts GLOBAL 'pc.bootstrap' = 1; +``` + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_last_committed | 1547 | ++----------------------------+-------+ +``` + + +```json +POST /cli -d " +SET CLUSTER posts GLOBAL 'pc.bootstrap' = 1 +" +``` + + + + diff --git a/manual/russian/Creating_a_cluster/Setting_up_replication/Understanding_cluster_status_and_node_states.md b/manual/russian/Creating_a_cluster/Setting_up_replication/Understanding_cluster_status_and_node_states.md new file mode 100644 index 0000000000..280b6b2c92 --- /dev/null +++ b/manual/russian/Creating_a_cluster/Setting_up_replication/Understanding_cluster_status_and_node_states.md @@ -0,0 +1,619 @@ +# Понимание статуса кластера и состояний узлов + +## Быстрая справка + +Статус кластера показывает два ключевых значения, которые помогают понять состояние вашего кластера: + +- `cluster_%_status` - может ли кластер принимать записи +- `cluster_%_node_state` - что делает этот конкретный узел +### Статус PRIMARY +## Значения статуса + + +Когда статус кластера показывает `PRIMARY`, кластер имеет кворум и может принимать операции как на чтение, так и на запись. Это нормальное рабочее состояние. + + +##### SQL: + + +SHOW STATUS LIKE 'cluster_%_status'; +SHOW STATUS LIKE 'cluster_%_node_state'; +```sql +``` + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_status | primary | +``` + + + +Статус `PRIMARY` означает: +### cluster_%_status +* Большинство узлов в кластере подключены и обмениваются данными +- **`primary`** - Нормальная работа, чтение и запись разрешены +- **`non-primary`** - Потерян кворум, **записи заблокированы** +- **`disconnected`** - Узел изолирован, пытается переподключиться +* Операции записи разрешены и будут реплицироваться +### cluster_%_node_state +* Кластер функционирует нормально +- **`synced`** - Нормальная работа +- **`joining`** - Узел присоединяется к кластеру (временно) +- **`donor`** - Помогает другому узлу присоединиться (временно) +- **`closed`** - Узел остановлен +- **`destroyed`** - Узел аварийно завершил работу, требуется перезапуск +* Кворум поддерживается +## Распространённые сценарии + +| Что произошло | cluster_%_status | cluster_%_node_state | Что делать | +|---------------|------------------|---------------------|------------| +| Нормальная работа | `primary` | `synced` | Ничего | +| Большинство узлов недоступно | `non-primary` | `synced` | Загрузить заново или ждать | +| Запуск узла | `disconnected` | `joining` → `synced` | Ждать | +| Авария узла | разное | `destroyed` | Перезапустить узел | +| Сетевая сегментация (большинство) | `primary` | `synced` | Работать как обычно | +| Сетевая сегментация (меньшинство) | `non-primary` | `synced` | Ждать или загрузить заново | +### Статус NON_PRIMARY +## Восстановление после потери кворума + + +Когда большинство узлов недоступно и статус показывает `non-primary`: +Когда статус кластера показывает `NON_PRIMARY`, кластер потерял кворум. Это критическое состояние, при котором операции записи блокируются, чтобы предотвратить сценарии разделения мозга. + + +##### SQL: + + +-- Проверить, у какого узла самый высокий номер последовательности + +-- Загрузить кластер заново (запускать только на лучшем узле) +```sql +SHOW STATUS LIKE 'cluster_%_status' +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_status | non-primary | ++----------------------------+-------+ +``` + + +SET CLUSTER posts GLOBAL 'pc.bootstrap' = 1 + +Статус `NON_PRIMARY` возникает когда: +* Более половины узлов в кластере недоступны +* Произошло разделение сети, разбившее кластер +* Текущая группа узлов не может сформировать большинство + +**Критично**: операции записи в этом состоянии отклоняются. Может потребоваться ручное вмешательство с помощью команды bootstrap: + + + + +##### SQL: + + + +```sql +SET CLUSTER posts GLOBAL 'pc.bootstrap' = 1 +``` + + + +```json +POST /cli -d " +SET CLUSTER posts GLOBAL 'pc.bootstrap' = 1 +" +``` + + + +### Статус DISCONNECTED + + +Когда статус кластера показывает `DISCONNECTED`, узел не подключён ни к одному компоненту кластера и пытается переподключиться. + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_status' +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_status | disconnected | ++----------------------------+-------+ +``` + + + +Статус `DISCONNECTED` обычно встречается при: +* Запуске узла до присоединения к кластеру +* Проблемах с сетевым подключением +* Ошибках формирования кластера +* Временной изоляции от других участников кластера + +## Значения cluster_%_node_state + +Переменная `cluster_%_node_state` показывает текущее рабочее состояние данного конкретного узла в кластере. + +### Состояние synced + + +Когда состояние узла показывает `synced`, узел полностью синхронизирован и работает. Это нормальное рабочее состояние. + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_node_state' +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_node_state | synced | ++----------------------------+-------+ +``` + + + +Состояние `synced` означает: +* Все транзакции реплицируются нормально +* Узел поддерживает кворум кластера +* Данные согласованы с другими участниками кластера + +### Состояние joining + + +Когда состояние узла показывает `joining`, узел находится в процессе присоединения к кластеру и получения синхронизации состояния. + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_node_state' +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_node_state | joining | ++----------------------------+-------+ +``` + + + +Во время состояния `joining`: +* Узел получает состояние кластера (IST или SST) +* Узел пока не может обслуживать запросы на чтение или запись +* Идёт передача состояния +* Узел перейдет в состояние `synced` после завершения + +### Состояние donor + + +Когда состояние узла показывает `donor`, узел предоставляет передачу состояния для присоединяющегося узла. + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_node_state' +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_node_state | donor | ++----------------------------+-------+ +``` + + + +Во время состояния `donor`: +* Узел продолжает обслуживать запросы, но может испытывать задержки +* Производится передача состояния (SST) другому узлу +* Узел возвращается в состояние `synced` после завершения передачи +* Возможны временные ухудшения производительности + +### Состояние closed + + +Когда состояние узла показывает `closed`, узел выключен или ещё не запущен. + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_node_state' +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_node_state | closed | ++----------------------------+-------+ +``` + + + +Состояние `closed` означает: +* Узел был корректно выключен +* Узел ещё не запущен +* Это начальное состояние перед присоединением к кластеру +* Нормальное состояние во время планового обслуживания + +### Состояние destroyed + + +Когда состояние узла показывает `destroyed`, узел столкнулся с ошибкой и был аварийно завершен. + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_node_state' +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_node_state | destroyed | ++----------------------------+-------+ +``` + + + +Состояние `destroyed` означает: +* Произошла серьёзная проблема, требующая расследования +* Возможно, потребуется ручное вмешательство для перезапуска узла +* Возможна порча данных или сбой системы +* Перед перезапуском следует проверить журналы на предмет ошибок + +## Комбинации статусов в разных сценариях + +### Нормальная работа + +| Сценарий | cluster_%_status | cluster_%_node_state | Описание | +|----------|------------------|---------------------|-------------| +| Здоровый кластер | `primary` | `synced` | Нормальная работа, возможны чтение и запись | +| Запуск узла | `disconnected` → `primary` | `closed` → `joining` → `synced` | Обычная последовательность запуска | +| Присоединение нового узла | `primary` | `donor` (хелпер), `joining` (новый) | Идёт SST | + +### Сетевые проблемы + +| Сценарий | cluster_%_status | cluster_%_node_state | Требуемое действие | +|----------|------------------|---------------------|-----------------| +| Миноритарный разлад (2 из 5 узлов) | `non-primary` | `synced` | Ожидать восстановления сети или выполнять bootstrap | +| Мажоритарный разлад (3 из 5 узлов) | `primary` | `synced` | Продолжать работу в нормальном режиме | +| Полная изоляция | `disconnected` | `synced` | Проверить сетевое подключение | + + +| Сценарий | cluster_%_status | cluster_%_node_state | Влияние | +| Отказ одного узла (кластер из 5 узлов) | `primary` | `synced` | Кластер продолжает работу в нормальном режиме | +| Узел аварийно завершил работу | зависит | `destroyed` | Требуется перезапуск/восстановление узла | +### Критические сценарии сбоев + + +Когда большинство узлов в вашем кластере становятся недоступными, оставшиеся узлы показывают статус `NON_PRIMARY` и отвергают операции записи. + +В кластере из 5 узлов, где 3+ узлов вышли из строя: + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_status'; +SHOW STATUS LIKE 'cluster_%_node_state'; +SHOW STATUS LIKE 'cluster_%_size'; +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_status | non-primary | +| cluster_posts_node_state | synced | +| cluster_posts_size | 2 | +``` + + + +Чтобы выйти из этой ситуации, определите узел с наибольшим значением `last_committed` и загрузите его: + + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_last_committed'; +SET CLUSTER posts GLOBAL 'pc.bootstrap' = 1; + + + ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_last_committed | 1547 | ++----------------------------+-------+ +``` + + +```json +POST /cli -d " +SHOW STATUS LIKE 'cluster_%_last_committed'; +SET CLUSTER posts GLOBAL 'pc.bootstrap' = 1; +" +``` + + + +#### Сетевой разрыв (предотвращение split-brain) + + +В случае сетевого разрыва только сторона с большинством сохраняет статус `PRIMARY`: + +**Сторона большинства (3 узла в кластере из 5 узлов):** + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_status'; +SHOW STATUS LIKE 'cluster_%_size'; +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_status | primary | +| cluster_posts_size | 3 | ++----------------------------+-------+ +``` + +**Сторона меньшинства (2 узла в кластере из 5 узлов):** + + + +```sql +SHOW STATUS LIKE 'cluster_%_status'; +SHOW STATUS LIKE 'cluster_%_size'; +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_status | non-primary | +| cluster_posts_size | 2 | ++----------------------------+-------+ +``` + + + +### Переходы состояний при распространённых событиях + +#### Присоединение нового узла (успешное) +``` +New Node: disconnected/closed → disconnected/joining → primary/synced +Donor Node: primary/synced → primary/donor → primary/synced +Other Nodes: primary/synced (unchanged) +``` + +#### Восстановление после сетевого разрыва +``` +Minority Partition: non-primary/synced → primary/synced (when reconnected) +Majority Partition: primary/synced (unchanged throughout) +``` + +#### Ручное восстановление после полной потери кластера +``` +First node: disconnected/closed → primary/synced (after pc.bootstrap=1) +Other nodes: disconnected/closed → primary/joining → primary/synced +``` + +### Мониторинг состояния кластера + + +Для мониторинга состояния кластера и выявления проблем проверьте эти ключевые статусные переменные: + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_status'; +SHOW STATUS LIKE 'cluster_%_node_state'; +SHOW STATUS LIKE 'cluster_%_size'; +SHOW STATUS LIKE 'cluster_%_last_committed'; +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_status | primary | +| cluster_posts_node_state | synced | +| cluster_posts_size | 3 | +| cluster_posts_last_committed | 1547 | ++----------------------------+-------+ +``` + + + + +Чтобы увидеть разницу между сконфигурированными и видимыми узлами: + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_nodes_set'; +SHOW STATUS LIKE 'cluster_%_nodes_view'; +``` + + + +```sql ++----------------------------+--------------------------------------------------------+ +| Counter | Value | ++----------------------------+--------------------------------------------------------+ +| cluster_posts_nodes_set | 10.10.0.1:9312,10.10.1.1:9312,10.10.2.1:9312 | +| cluster_posts_nodes_view | 10.10.0.1:9312:replication,10.10.1.1:9312:replication | ++----------------------------+--------------------------------------------------------+ +``` + + + +Это показывает, что один узел (10.10.2.1:9312) сконфигурирован, но в данный момент не виден в кластере, что может указывать на проблему с подключением. + +## Устранение распространённых проблем + +### Операции записи отклонены + + +Когда статус кластера `NON_PRIMARY`, операции записи будут отклонены: + + +##### SQL: + + + +```sql +INSERT INTO posts:articles VALUES (1, 'test article'); +``` + + + +```sql +ERROR 1064 (42000): cluster posts is not ready, not primary state (replication error) +``` + + + +**Решение**: Проверьте статус кластера и либо дождитесь восстановления кворума, либо выполните ручную загрузку, если узлы недоступны постоянно. + +### Узел застрял в состоянии joining + + +Если узел находится в состоянии `joining` длительное время: + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_node_state'; +SHOW STATUS LIKE 'cluster_%_local_recv_queue'; +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_node_state | joining | +| cluster_posts_local_recv_queue | 150 | ++----------------------------+-------+ +``` + + + +Это может означать: +* Проблемы с пропускной способностью сети во время SST +* Идёт передача большого объёма данных +* Проблемы с производительностью узла-донора + +Проверьте статус узла-донора и сетевое соединение между узлами. + +### Несовпадение размера кластера + + +Если `cluster_%_size` не соответствует ожидаемому количеству узлов: + + +##### SQL: + + + +```sql +SHOW STATUS LIKE 'cluster_%_size'; +SHOW STATUS LIKE 'cluster_%_nodes_view'; +``` + + + +```sql ++----------------------------+-------+ +| Counter | Value | ++----------------------------+-------+ +| cluster_posts_size | 2 | +| cluster_posts_nodes_view | 10.10.0.1:9312:replication,10.10.1.1:9312:replication | ++----------------------------+-------+ +``` + + + +Это указывает на то, что некоторые сконфигурированные узлы сейчас недоступны. Проверьте сетевое соединение и состояние этих узлов. + + diff --git a/translation.json b/translation.json index 592132a4bb..e256e93fb0 100644 --- a/translation.json +++ b/translation.json @@ -178,5 +178,6 @@ "README.md": "eff1619e48f822a69605ff5e69ab79e6", "Searching/Options.md": "2fb7f43595ee0ce2fca0919a6b0b36bb", "Searching/Full_text_matching/Boolean_optimization.md": "ec69041e4f95354af0641401a37aad06", - "Server_settings/Searchd.md": "6866a5d4584268e2afcffabc2d56a5a5" + "Server_settings/Searchd.md": "6866a5d4584268e2afcffabc2d56a5a5", + "Creating_a_cluster/Setting_up_replication/Understanding_cluster_status_and_node_states.md": "e33bea3de8e1de9740b463a3b25a510e" }