Skip to content

系统组的故障恢复

Ignite 3 集群包括两个系统 Raft 组,这两个组对于集群的正常运行都是必不可少的。

对系统 Raft 组执行故障恢复操作可以恢复永久多数损失。当系统 Raft 组失去多数时,它将变得不可用。当 CMG 不可用时,集群本身仍然可用,但有限制:它仍然可以处理大多数操作,但无法加入新节点、启动/重启现有节点以及构建新索引。当 MG 不可用时,集群将不可用,它甚至无法处理 GET/PUT/SQL 请求。

提示

数据分区的故障恢复在单独的章节中介绍。

当多数丢失后,可以在控制台或日志文件的集群日志中看到。当 Raft 组变为不可用时,日志将显示类似下面的内容:Send with retry timed out [retryCount = 11, groupId = cmg_group].Send with retry timed out [retryCount = 11, groupId = metastorage_group].

CMG 故障的指标是节点在restart命令后未启动,这在日志中反映为Local CMG state recovered, starting the CMG,但是后面没有:Successfully joined the cluster

如果节点在 CMG 可用而 MG 不可用时启动,则日志将显示:Metastorage info on start,但是后面没有:Performing MetaStorage recovery

警告

将故障恢复命令应用于系统节点组时要小心,这些命令可能会导致脑裂(将集群拆分为两个集群),所以仅当 CMG/MG 的多数永久丢失时,才使用 recovery 命令作为最后的手段。

1.集群管理组

如果 CMG 失去多数:

  1. 重启 CMG 节点以恢复丢失的多数;

  2. 如果该操作失败,需要使用以下命令(手动或通过 REST)强制分配新的多数:recovery cluster reset --url=<node-url> --cluster-management-group=<new-cmg-nodes>

    该命令将发送到--url参数指定的节点,该节点必须属于new-cmg-nodes Raft 组,此节点将成为修复导体,并发起reset过程。

    上述过程可能会因以下原因而失败:

    • new-cmg-nodes中指定的某些节点不在物理拓扑中;
    • 修复导体没有发起该过程所需的所有信息。
  3. 如果某些节点由于网络原因而关闭或不可用(因此未参与修复):

    • 启动这些节点(或恢复网络连接并重启它们);
    • 使用以下命令(手动或通过 REST)将这些节点迁移到修复的集群:recovery cluster migrate --old-cluster-url=<url-of-old-cluster-node> --new-cluster-url=<url-of-new-cluster-node>

2.元存储组

如果 MG 失去多数:

  1. 重启 MG 节点(或至少重启 Ignite 节点内的 Raft 节点);

  2. 如果该操作失败:

    • 确保每个可以启动的节点都已启动并加入集群;

    • 使用以下命令(手动或通过 REST)强制分配新的多数:recovery cluster reset --url=<existing-node-url> [--cluster-management-group=<new-cmg-nodes>] --metastorage-replication-factor=N

      N是修复后 MG 中投票 Raft 节点的请求数量,如果省略--cluster-management-group,则该命令将从 CMG 领导者获取当前 CMG 投票成员集,如果 CMG 不可用,则该命令会失败。

      该命令将发送到--url指定的节点,此节点将成为修复导体,并发起reset过程。

      如果修复导体无法修复 MG,则必须手动重复该过程(没有故障转移)。

  3. 如果某些节点由于网络原因而关闭或不可用(因此未参与修复):

    • 启动这些节点(或恢复网络连接并重启它们);
    • 使用以下命令(手动或通过 REST)将这些节点迁移到修复的集群:recovery cluster migrate --old-cluster-url=<url-of-old-cluster-node> --new-cluster-url=<url-of-new-cluster-node>

提示

如果其中一个节点的元存储中有一个修订,而参与修复的任何节点上都没有该修订,这意味着其元存储已与MG领导者的元存储不同。这样的节点将不允许加入集群,它的启动将失败,并出现MetastorageDivergedException(错误代码META-7)。这时需要将该节点中的数据清除,然后将其作为空节点加入集群。

18624049226