如何恢复集群

集群中的一个或多个成员可能会离线或无法访问。在这种情况下,无法在此成员上执行任何操作,也无法执行需要跨所有成员更改状态的操作。有关更多信息,请参阅离线成员和容错集群修复

如果您可以使离线集群成员恢复联机或从集群中删除它们,则操作将照常恢复。如果这不可行,则有几种方法可以恢复集群,具体取决于导致故障的情况。有关详细信息,请参阅以下部分。

注意

运行incus admin cluster --help以获取所有可用命令的概述。

从仲裁丢失中恢复

每个 Incus 集群都有一定数量的成员(通过cluster.max_voters配置),这些成员充当分布式数据库的投票成员。如果您永久丢失了这些集群成员中的大多数(例如,您有一个三成员集群并丢失了两个成员),则集群将失去仲裁并变得不可用。但是,如果至少一个数据库成员幸存下来,则可以恢复集群。

为此,请完成以下步骤

  1. 登录到集群的任何幸存成员并运行以下命令

    sudo incus admin cluster list-database
    

    此命令显示哪些集群成员具有数据库角色之一。

  2. 选择列出的仍然联机的数据库成员之一作为新的领导者。登录到该机器(如果它与您已登录的机器不同)。

  3. 确保 Incus 守护进程未在机器上运行。

    sudo systemctl stop incus.service incus.socket
    
  4. 登录到所有其他仍然联机的集群成员并停止 Incus 守护进程。

  5. 在您选定的新领导者服务器上,运行以下命令

    sudo incus admin cluster recover-from-quorum-loss
    
  6. 在所有机器上重新启动 Incus 守护进程,从新的领导者开始。

    sudo systemctl start incus.socket incus.service
    

数据库现在应该重新联机。数据库中没有删除任何信息。所有关于您已丢失的集群成员的信息仍然存在,包括其实例的元数据。如果您需要重新创建丢失的实例,这可以帮助您进行进一步的恢复步骤。

要永久删除您已丢失的集群成员,请强制删除它们。请参阅删除集群成员

恢复地址已更改的集群成员

如果集群的某些成员不再可访问,或者由于 IP 地址或侦听端口号更改而导致集群本身无法访问,则可以重新配置集群。

为此,请编辑集群中每个成员的集群配置,并根据需要更改 IP 地址或侦听端口号。在此过程中,您不能删除任何成员。集群配置必须包含完整集群的描述,因此您必须在所有集群成员上对所有集群成员进行更改。

您可以编辑不同成员的成员角色,但存在以下限制

  • 没有database*角色的集群成员无法成为投票者,因为它可能缺少全局数据库。

  • 至少必须有两个成员保持为投票者(除了两个成员的集群,其中一个投票者就足够了),否则将没有仲裁。

登录到每个集群成员并完成以下步骤

  1. 停止 Incus 守护进程。

    sudo systemctl stop incus.service incus.socket
    
  2. 运行以下命令

    sudo incus admin cluster edit
    
  3. 编辑此集群成员关于集群其余部分的信息的 YAML 表示形式

    # Latest cowsql segment ID: 1234
    
    members:
      - id: 1             # Internal ID of the member (Read-only)
        name: server1     # Name of the cluster member (Read-only)
        address: 192.0.2.10:8443 # Last known address of the member (Writeable)
        role: voter              # Last known role of the member (Writeable)
      - id: 2             # Internal ID of the member (Read-only)
        name: server2     # Name of the cluster member (Read-only)
        address: 192.0.2.11:8443 # Last known address of the member (Writeable)
        role: stand-by           # Last known role of the member (Writeable)
      - id: 3             # Internal ID of the member (Read-only)
        name: server3     # Name of the cluster member (Read-only)
        address: 192.0.2.12:8443 # Last known address of the member (Writeable)
        role: spare              # Last known role of the member (Writeable)
    

    您可以编辑地址和角色。

在对所有集群成员进行更改后,在所有成员上重新启动 Incus 守护进程。

sudo systemctl start incus.socket incus.service

集群现在应该再次完全可用,所有成员都报告了信息。数据库中没有删除任何信息。所有关于集群成员及其实例的信息仍然存在。

手动更改 Raft 成员资格

在某些情况下,您可能需要手动更改集群的Raft成员配置,以解决一些意外的行为。

例如,如果您有一个被不干净地移除的集群成员,它可能不会显示在incus cluster list中,但仍然是Raft配置的一部分。要查看Raft配置,请运行以下命令

incus admin sql local "SELECT * FROM raft_nodes"

在这种情况下,请运行以下命令以删除剩余的节点

incus admin cluster remove-raft-node <address>