如何恢复集群¶
集群中的一个或多个成员可能会离线或无法访问。在这种情况下,无法在此成员上执行任何操作,也无法执行需要跨所有成员更改状态的操作。有关更多信息,请参阅离线成员和容错和集群修复。
如果您可以使离线集群成员恢复联机或从集群中删除它们,则操作将照常恢复。如果这不可行,则有几种方法可以恢复集群,具体取决于导致故障的情况。有关详细信息,请参阅以下部分。
注意
运行incus admin cluster --help
以获取所有可用命令的概述。
从仲裁丢失中恢复¶
每个 Incus 集群都有一定数量的成员(通过cluster.max_voters
配置),这些成员充当分布式数据库的投票成员。如果您永久丢失了这些集群成员中的大多数(例如,您有一个三成员集群并丢失了两个成员),则集群将失去仲裁并变得不可用。但是,如果至少一个数据库成员幸存下来,则可以恢复集群。
为此,请完成以下步骤
登录到集群的任何幸存成员并运行以下命令
sudo incus admin cluster list-database
此命令显示哪些集群成员具有数据库角色之一。
选择列出的仍然联机的数据库成员之一作为新的领导者。登录到该机器(如果它与您已登录的机器不同)。
确保 Incus 守护进程未在机器上运行。
sudo systemctl stop incus.service incus.socket
登录到所有其他仍然联机的集群成员并停止 Incus 守护进程。
在您选定的新领导者服务器上,运行以下命令
sudo incus admin cluster recover-from-quorum-loss
在所有机器上重新启动 Incus 守护进程,从新的领导者开始。
sudo systemctl start incus.socket incus.service
数据库现在应该重新联机。数据库中没有删除任何信息。所有关于您已丢失的集群成员的信息仍然存在,包括其实例的元数据。如果您需要重新创建丢失的实例,这可以帮助您进行进一步的恢复步骤。
要永久删除您已丢失的集群成员,请强制删除它们。请参阅删除集群成员。
恢复地址已更改的集群成员¶
如果集群的某些成员不再可访问,或者由于 IP 地址或侦听端口号更改而导致集群本身无法访问,则可以重新配置集群。
为此,请编辑集群中每个成员的集群配置,并根据需要更改 IP 地址或侦听端口号。在此过程中,您不能删除任何成员。集群配置必须包含完整集群的描述,因此您必须在所有集群成员上对所有集群成员进行更改。
您可以编辑不同成员的成员角色,但存在以下限制
没有
database*
角色的集群成员无法成为投票者,因为它可能缺少全局数据库。至少必须有两个成员保持为投票者(除了两个成员的集群,其中一个投票者就足够了),否则将没有仲裁。
登录到每个集群成员并完成以下步骤
停止 Incus 守护进程。
sudo systemctl stop incus.service incus.socket
运行以下命令
sudo incus admin cluster edit
编辑此集群成员关于集群其余部分的信息的 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>