Proxmox VE集群管理器pvecm是用于创建一组物理服务器的工具。这样的一组称为集群。我们使用Corosync集群引擎进行可靠的组通信,这样的集群可以包含多达32个物理节点(可能更多,取决于网络延迟)。

pvecm可用于创建新的集群、将节点加入集群、离开集群、获取状态信息以及执行各种其他与集群相关的任务。Proxmox集群文件系统(“pmxcfs”)用于透明地将集群配置分发到所有集群节点。

将节点分组成集群有以下优点:

  • 集中的、基于web的管理
  • 多主集群:每个节点可以完成所有的管理任务
  • pmxcfs:数据库驱动的文件系统,用于存储配置文件,使用corosync在所有节点上实时复制。
  • 在物理主机之间轻松迁移虚拟机和容器
  • 快速部署
  • 集群范围内的服务,如防火墙和HA

5.1、需求

  • 所有节点必须能够通过UDP端口5404和5405彼此连接,以便corosync工作。
  • 日期和时间必须同步。
  • 节点之间使用TCP端口22的SSH隧道。
  • 如果您对高可用性感兴趣,您需要至少有三个节点来实现可靠的仲裁。所有节点都应该具有相同的版本。
  • 我们建议为集群流量使用专用网卡,特别是当您使用共享存储时。
  • 添加节点时,需要输入集群节点的Root密码。 ```bash Note

不能混合Proxmox VE 3。x和更早的Proxmox VE 4。X集群节点。

虽然可以混合使用Proxmox VE 4.4和Proxmox VE 5.0节点,但不支持将其作为生产配置,只能在将整个集群从一个主版本升级到另一个主版本时临时使用。

使用早期版本运行Proxmox VE 6.x集群是不可能的。Proxmox VE 6.x之间的集群协议(corosync)和更早的版本发生了根本性的变化。针对Proxmox VE 5.4的corosync 3 软件包仅用于升级到Proxmox VE 6.0的过程。

  1. <a name="J0Be8"></a>
  2. ## 5.2、准备节点
  3. 首先,在所有节点上安装Proxmox VE。确保每个节点都安装了,并且进行主机名和IP配置。在集群创建后,更改主机名和IP是不可能的。
  4. 虽然在/etc/hosts中引用所有节点名和它们的ip(或通过其他方法解析它们的名称)很常见,但要使集群正常工作,这并不是必要的。但是,它可能很有用,因为您可以通过更容易记住的节点名([另请参阅链接地址类型第5.7.3节](#QfP5s))从一个节点连接到另一个节点。注意,我们总是建议通过集群配置中的IP地址来引用节点。
  5. <a name="tFhrv"></a>
  6. ## 5.3、创建一个集群
  7. 您可以在控制台(通过ssh登录)上创建集群,也可以使用Proxmox VE web接口(Datacenter→cluster)通过API创建集群。
  8. ```bash
  9. Note
  10. 为您的集群使用唯一的名称。此名称稍后无法更改。集群名称遵循与节点名称相同的规则。

5.3.1、通过Web GUI创建

image.png
在“数据中心→集群”下,单击“创建集群”。输入集群名称并从下拉菜单中选择一个网络连接作为主集群网络(链接0),默认为通过节点主机名解析的IP。

要添加第二个链接作为回退,您可以选择Advanced复选框并选择一个额外的网络接口(链接1,参见Corosync Redundancy章节5.8)。

  1. Note
  2. 确保为集群通信选择的网络没有被用于任何高流量负载,比如(网络)存储或实时迁移。虽然集群网络本身生成的数据量很小,但它对延迟非常敏感。检查完整集群网络要求第5.7.1节。

5.3.2、通过命令行创建

通过ssh登录到第一个Proxmox VE节点,执行以下命令:

hp1# pvecm create CLUSTERNAME

检查新的集群使用状态。

hp1# pvecm status

5.3.3、同一网络中的多个集群

可以在同一个物理或逻辑网络中创建多个集群。每个这样的集群必须有一个唯一的名称,以避免集群通信堆栈中可能发生的冲突。这也有助于避免人类的混淆,使集群可以清晰地区分。

虽然corosync集群的带宽要求相对较低,但包的延迟和包每秒(PPS)速率是限制因素。同一网络中的不同集群可以相互竞争这些资源,对于更大的集群,因此使用单独的物理网络基础设施仍然是有意义的。

5.4、向集群中添加节点

  1. 谨慎:
  2. 即将添加到集群的节点不能容纳任何虚拟机。所有现有的配置在加入集群时覆盖/etc/pve,因为客户id可能会冲突。作为一种解决方案,创建客户端(vzdump)的备份,并在将节点添加到集群后将其恢复为不同的ID

5.4.1、通过GUI加入节点到集群

image.png
在已有的集群节点上登录web界面。在数据中心→集群下,点击顶部的“加入信息”按钮。然后,点击按钮复制信息。或者,手动从信息字段复制字符串。
image.png
接下来,登录到要添加的节点的web界面。在Datacenter→Cluster下,单击Join Cluster。用前面复制的连接信息文本填充信息字段。加入集群所需的大多数设置将自动填写。出于安全原因,集群密码必须手动输入。

  1. 请注意
  2. 要手动输入所有需要的数据,可以禁用辅助加入复选框。

单击Join按钮后,集群Join进程将立即启动。节点加入群集后,其当前节点证书将被来自群集证书颁发机构(CA)签名的证书所替换,这意味着当前会话将在几秒钟后停止工作。然后可能需要强制重新加载web界面,并使用集群凭据重新登录。

现在你的节点应该在Datacenter→Cluster下是可见的。

5.4.2、通过命令行加入节点到集群

通过ssh登录到您想要加入到现有集群中的节点。

hp2# pvecm add IP-ADDRESS-CLUSTER

对于IP- address - cluster,请使用现有集群节点的IP或主机名。建议使用IP地址(参见链接地址类型章节5.7.3)。

查询集群使用状态:

# pvecm status

添加4个节点后的集群状态

  1. hp2# pvecm status
  2. Quorum information
  3. ~~~~~~~~~~~~~~~~~~
  4. Date: Mon Apr 20 12:30:13 2015
  5. Quorum provider: corosync_votequorum
  6. Nodes: 4
  7. Node ID: 0x00000001
  8. Ring ID: 1/8
  9. Quorate: Yes
  10. Votequorum information
  11. ~~~~~~~~~~~~~~~~~~~~~~
  12. Expected votes: 4
  13. Highest expected: 4
  14. Total votes: 4
  15. Quorum: 3
  16. Flags: Quorate
  17. Membership information
  18. ~~~~~~~~~~~~~~~~~~~~~~
  19. Nodeid Votes Name
  20. 0x00000001 1 192.168.15.91
  21. 0x00000002 1 192.168.15.92 (local)
  22. 0x00000003 1 192.168.15.93
  23. 0x00000004 1 192.168.15.94

如果你只想要所有节点的列表,请使用:

# pvecm nodes

列出群集中的节点

  1. hp2# pvecm nodes
  2. Membership information
  3. ~~~~~~~~~~~~~~~~~~~~~~
  4. Nodeid Votes Name
  5. 1 1 hp1
  6. 2 1 hp2 (local)
  7. 3 1 hp3
  8. 4 1 hp4

5.4.3、以独立的集群网络添加节点

将节点添加到具有独立群集网络的群集时,需要使用link0参数设置该网络上的节点地址:

pvecm add IP-ADDRESS-CLUSTER -link0 LOCAL-IP-ADDRESS-LINK0

如果要使用kronosnet传输层的内置冗余部分5.8,还可以使用link1参数。

使用GUI,您可以从群集加入对话框中相应的链路0和链路1字段中选择正确的接口。

5.5、移除集群节点

  1. 警诫。
  2. 在继续操作之前,请仔细阅读程序,因为它可能不是您想要或需要的。

从节点移动所有虚拟机。确保您没有要保留的本地数据或备份,或相应地保存它们。在下面的示例中,我们将从群集中删除节点HP4。

登录到不同的群集节点(不是HP4),然后发出pvem nodes命令以标识要删除的节点ID:

  1. hp2# pvecm nodes
  2. Membership information
  3. ~~~~~~~~~~~~~~~~~~~~~~
  4. Nodeid Votes Name
  5. 1 1 hp1
  6. 2 1 hp2 (local)
  7. 3 1 hp3
  8. 4 1 hp4

此时,您必须关闭HP4的电源,并确保它不会按原样再次通电(在网络中)。

  1. 重要。
  2. 如上所述,重要的是在删除之前关闭节点的电源,并确保它永远不会再次通电(在现有群集网络中)。如果按原样打开节点,您的群集将会崩溃,并且可能很难恢复干净的群集状态。

关闭节点HP4的电源后,我们可以安全地将其从群集中删除。

hp1# pvecm delnode hp4
Killing node 4

使用pvem节点或pvem status再次检查节点列表。它应该类似于:

  1. hp1# pvecm status
  2. Quorum information
  3. ~~~~~~~~~~~~~~~~~~
  4. Date: Mon Apr 20 12:44:28 2015
  5. Quorum provider: corosync_votequorum
  6. Nodes: 3
  7. Node ID: 0x00000001
  8. Ring ID: 1/8
  9. Quorate: Yes
  10. Votequorum information
  11. ~~~~~~~~~~~~~~~~~~~~~~
  12. Expected votes: 3
  13. Highest expected: 3
  14. Total votes: 3
  15. Quorum: 2
  16. Flags: Quorate
  17. Membership information
  18. ~~~~~~~~~~~~~~~~~~~~~~
  19. Nodeid Votes Name
  20. 0x00000001 1 192.168.15.90 (local)
  21. 0x00000002 1 192.168.15.91
  22. 0x00000003 1 192.168.15.92

无论出于何种原因,如果您希望此服务器再次加入同一集群,则必须:

  • 从头开始在其上重新安装Proxmox VE。
  • 然后加入它,如上一节所述。
    1. 注意事项:
    2. 删除该节点后,其SSH指纹仍将驻留在其他节点的KNOWN_HOSTS中。如果您在重新加入具有相同IP或主机名的节点后收到SSH错误,请在重新添加的节点上运行一次pvecm updatecerts,以在整个范围内更新其指纹群集

    5.5.1、分离节点而不重新安装

    1. 警诫:
    2. 这不是推荐的方法,请谨慎操作。如果你不确定,可以使用上面提到的方法。
    您还可以将节点与群集分离,而无需从头开始重新安装。但是,从群集中删除该节点后,它仍可以访问共享存储!在开始从群集中删除节点之前,必须解决此问题。Proxmox VE群集不能与另一个群集共享完全相同的存储,因为存储锁定不能跨越群集边界工作。此外,它还可能导致VMID冲突。

建议您创建一个新存储,其中只有您想要分离的节点才能访问。这可以是NFS上的新导出,也可以是新的Ceph池,仅举几个例子。重要的是,多个群集不能访问完全相同的存储。设置此存储后,将所有数据从节点及其VM移至该节点。然后,您就可以将节点从群集中分离出来了。

  1. 告警。
  2. 确保所有共享资源完全分开!否则,你会遇到冲突和问题。

首先,停止节点上的corSync和pvE-cluster服务:

systemctl stop pve-cluster
systemctl stop corosync

在本地模式下再次启动群集文件系统:

pmxcfs -l

删除corSync配置文件:

rm /etc/pve/corosync.conf
rm -r /etc/corosync/ *

现在,您可以作为正常服务重新启动文件系统:

killall pmxcfs
systemctl start pve-cluster

该节点现在已与群集分离。您可以使用以下命令将其从群集的剩余节点中删除:

pvecm delnode oldnode

如果命令失败,因为群集中的其余节点在现在独立的节点退出时失去了仲裁,您可以将预期投票设置为1作为解决办法:

pvecm expected 1

然后重复pvem delnode命令。

现在切换回分离的节点,在这里删除旧集群留下的所有剩余文件。这可确保节点可以再次添加到另一个群集,而不会出现问题。

rm /var/lib/corosync/ *

由于来自其他节点的配置文件仍在集群文件系统中,因此您可能也需要清理这些文件。只需从/etc/pve/Nodes/NODENAME中删除整个目录递归,但是在删除它之前要检查使用了正确的目录三次。

  1. 警诫。
  2. 节点SSH密钥仍然在AUTHORIZED_KEY文件中,这意味着节点仍然可以通过公钥身份验证相互连接。应该通过删除相应的密钥来修复此问题。
  3. 来自/etc/pve/priv/Authorized_Key文件。

5.6、Quorum(法定人数)

Proxmox VE使用基于仲裁的技术在所有群集节点之间提供一致的状态。

法定人数是为了允许在分布式系统中执行操作而必须获得的分布式事务的最小投票数。
—来自Wikipedia Quorum(分布式计算)

在网络分区的情况下,状态更改要求大多数节点都处于联机状态。 如果群集失去仲裁,它将切换到只读模式。

  1. 注意
  2. Proxmox VE默认情况下为每个节点分配一次投票。

5.7、集群网络

集群网络是集群的核心。通过它发送的所有消息都必须按照各自的顺序可靠地传递到所有节点。在Proxmox VE中,这一部分是由corosync完成的,这是一个高性能、低开销、高可用性的开发工具包的实现。它为我们分散的配置文件系统(pmxcfs)服务。

5.7.1、网络需求

这需要一个延迟低于2毫秒(局域网性能)的可靠网络才能正常工作。该网络不应该被其他成员大量使用,理想情况下corosync在自己的网络上运行。不要使用共享网络进行同步和存储(除非在冗余章节5.8配置中用作潜在的低优先级回退)。

在设置集群之前,最好检查网络是否适合此目的。为了确保集群网络中各节点之间能够相互连接,可以使用ping工具测试节点之间的连通性。

如果启用了Proxmox VE防火墙,则会自动生成corosync的ACCEPT规则,无需手动操作。

  1. 请注意
  2. Corosync3.0版本之前使用多播(在Proxmox VE 6.0中引入)。现代版本依赖Kronosnet进行集群通信,目前只支持常规的UDP单播。
  3. 谨慎
  4. 您仍然可以启用多播或遗留单播通过设置您的传输到udpudpu在您的corosync.conf5.11.1()节,但请记住,这将禁用所有加密和冗余支持。因此,不建议这样做。

5.7.2、独立的集群网络

创建不带任何参数的集群时,通常会将corosync集群网络共享给Web界面和虚拟机及其流量。根据您的设置,甚至存储流量也可能通过相同的网络发送。因为corosync是一个时间要求很高的实时应用程序,所以建议对此进行修改。

建立一个新的网络

首先,您必须设置一个新的网络接口。它应该在一个物理上独立的网络上。确保您的网络满足集群网络要求第5.7.1节

单独创建集群

这可以通过用于创建新集群的pvecm create命令的linkX参数实现。

如果你已经在10.10.10.1/25上设置了一个静态地址的额外网卡,并且想要通过这个接口发送和接收所有集群通信,你可以执行:

pvecm create test --link0 10.10.10.1

为了检查一切是否正常运行,执行:

systemctl status corosync

然后,按照上面所描述的步骤添加具有独立集群网络的节点,第5.4.3节

创建集群后分离

如果您已经创建了一个集群,并希望将其通信切换到另一个网络,而不需要重新构建整个集群,则可以这样做。此更改可能导致集群中仲裁丢失的持续时间较短,因为节点必须重新启动corosync,并在新网络上一个接一个地出现。

首先查看如何编辑corosync.conf文件5.11.1节。然后,打开它,你应该会看到一个类似于:

  1. logging {
  2. debug: off
  3. to_syslog: yes
  4. }
  5. nodelist {
  6. node {
  7. name: due
  8. nodeid: 2
  9. quorum_votes: 1
  10. ring0_addr: due
  11. }
  12. node {
  13. name: tre
  14. nodeid: 3
  15. quorum_votes: 1
  16. ring0_addr: tre
  17. }
  18. node {
  19. name: uno
  20. nodeid: 1
  21. quorum_votes: 1
  22. ring0_addr: uno
  23. }
  24. }
  25. quorum {
  26. provider: corosync_votequorum
  27. }
  28. totem {
  29. cluster_name: testcluster
  30. config_version: 3
  31. ip_version: ipv4-6
  32. secauth: on
  33. version: 2
  34. interface {
  35. linknumber: 0
  36. }
  37. }
  1. 请注意
  2. ringX_addr实际上指定了一个corosync链接地址,“ring”这个名字是为了向后兼容而保留的旧的corosync版本的残余。

首先要做的是在节点项中添加name属性(如果您还没有看到它们的话)。这些必须与节点名匹配。

然后用新的地址替换所有节点的ring0_addr属性中的所有地址。您可以在这里使用普通IP地址或主机名。如果您使用主机名,请确保它们可以从所有节点解析。(参见链接地址类型第5.7.3节)

在本例中,我们希望将集群通信切换到10.10.10.1/25网络。所以我们分别替换所有的ring0_addr。

  1. 请注意
  2. 同样的过程也可以用来更改其他ringX_addr值,不过我们建议不要一次更改多个地址,以便在出现问题时更容易恢复。

增加config_version属性后,新的配置文件应该像这样:

  1. logging {
  2. debug: off
  3. to_syslog: yes
  4. }
  5. nodelist {
  6. node {
  7. name: due
  8. nodeid: 2
  9. quorum_votes: 1
  10. ring0_addr: 10.10.10.2
  11. }
  12. node {
  13. name: tre
  14. nodeid: 3
  15. quorum_votes: 1
  16. ring0_addr: 10.10.10.3
  17. }
  18. node {
  19. name: uno
  20. nodeid: 1
  21. quorum_votes: 1
  22. ring0_addr: 10.10.10.1
  23. }
  24. }
  25. quorum {
  26. provider: corosync_votequorum
  27. }
  28. totem {
  29. cluster_name: testcluster
  30. config_version: 4
  31. ip_version: ipv4-6
  32. secauth: on
  33. version: 2
  34. interface {
  35. linknumber: 0
  36. }
  37. }

然后,在最后一次检查所有更改的信息是否正确后,我们保存它,并再次按照edit corosync.conf文件第5.11.1节的内容使其生效。

更改将实时应用,因此严格来说,重新启动corosync并不是必要的。如果您还更改了其他设置,或者注意到corosync的抱怨,您可以选择性地触发重新启动。

在单个节点上执行:

systemctl restart corosync

现在检查一下是否一切正常:

systemctl status corosync

如果再次运行corosync,正确的在所有其他节点上重新启动corosync。然后,它们将在新网络上一个接一个地加入集群成员。

5.7.3、Corosync地址

一个corosync链接地址(为了向后兼容,在corosync.conf中由ringX_addr表示)可以通过两种方式指定:

  • IPv4/v6地址将被直接使用。推荐使用它们,因为它们是静态的,通常不会随意更改。
  • 主机名将使用getaddrinfo来解析,这意味着默认情况下,IPv6地址将首先被使用,如果可用的话(参见man gai.conf)。请记住这一点,特别是在将现有集群升级到IPv6时。
  1. 谨慎
  2. 应该小心使用主机名,因为它们解析到的地址可以在没有修改的情况下更改
  3. 触及corosync或它运行的节点——这可能会导致地址改变而不考虑对corosync的影响。

如果主机名是首选的,建议使用专门用于corosync的单独的静态主机名。另外,确保集群中的每个节点都能正确解析所有主机名。

由于支持Proxmox VE 5.1,主机名将在输入时解析。只有解析后的IP才会保存到配置中。

在早期版本中加入集群的节点可能仍然使用corosync.conf中未解析的主机名。如上所述,用ip或单独的主机名替换它们可能是个好主意。

5.8、Corosync冗余

默认情况下,Corosync通过集成的kronosnet层支持冗余网络(它不支持传统的udp/udpu传输)。它可以通过指定多个链接地址来启用,可以通过pvecm的——linkX参数,在GUI中作为链接1(创建集群或添加新节点时),也可以通过在corosync.conf中指定多个ringX_addr来启用。

  1. 请注意
  2. 为了提供有用的故障转移,每个链路都应该在自己的物理网络连接上。

链路的使用取决于优先级的设置。可以通过配置knet_link_priority 在corosync.conf中相应的接口部分。在使用pvecm创建集群时,最好使用priority参数:

# pvecm create CLUSTERNAME --link0 10.10.10.1,priority=15 --link1 10.20.20.1,priority=20

这将导致link1首先被使用,因为它具有更高的优先级。

如果没有手动配置优先级(或者两个链路具有相同的优先级),链路将按照它们的顺序使用数字,较低的数字具有较高的优先级。

即使所有的链路都在工作,也只有具有最高优先级的链路才能看到同步流量。链路优先级不能混合,即具有不同优先级的链路不能相互通信。、

因为低优先级的链路将不会看到流量,除非所有高优先级的都失败了,它成为一个有用的策略,甚至指定网络用于其他任务(虚拟机,存储,等等)。低优先级的链接。如果出现最坏的情况,更高的延迟或更拥塞的连接可能比根本没有连接要好。

5.8.1、向现有集群添加冗余链接

要添加一个新的链接到一个正在运行的配置,首先检查如何编辑corosync.conf文件第5.11.1节

然后,向nodelist部分中的每个节点添加一个新的ringX_addr。确保X对于添加到的每个节点都是相同的,并且对于每个节点都是唯一的。

最后,添加一个新界面,如下所示,到你的图腾部分,用上面选择的链接号替换X。

假设您添加了一个带有1号链接的链接,新的配置文件可能如下所示:

  1. logging {
  2. debug: off
  3. to_syslog: yes
  4. }
  5. nodelist {
  6. node {
  7. name: due
  8. nodeid: 2
  9. quorum_votes: 1
  10. ring0_addr: 10.10.10.2
  11. ring1_addr: 10.20.20.2
  12. }
  13. node {
  14. name: tre
  15. nodeid: 3
  16. quorum_votes: 1
  17. ring0_addr: 10.10.10.3
  18. ring1_addr: 10.20.20.3
  19. }
  20. node {
  21. name: uno
  22. nodeid: 1
  23. quorum_votes: 1
  24. ring0_addr: 10.10.10.1
  25. ring1_addr: 10.20.20.1
  26. }
  27. }
  28. quorum {
  29. provider: corosync_votequorum
  30. }
  31. totem {
  32. cluster_name: testcluster
  33. config_version: 4
  34. ip_version: ipv4-6
  35. secauth: on
  36. version: 2
  37. interface {
  38. linknumber: 0
  39. }
  40. interface {
  41. linknumber: 1
  42. }
  43. }

只要您按照最后的步骤编辑corosync.conf文件第5.11.1节,新的链接就会启用。不需要重新启动。你可以检查corosync是否加载了新的链接:

journalctl -b -u corosync

通过暂时断开一个节点上的旧链路来测试新链路可能是一个好主意,并确保它的状态在断开连接时保持在线:

pvecm status

如果您看到健康的集群状态,则意味着您的新链接正在被使用。

5.9、SSH在Proxmox VE集群中的作用

Proxmox VE为各种特性利用SSH隧道。

  • 代理控制台/shell会话(节点和来宾)
    • 当连接到节点A时,为节点B使用shell时,连接到节点A上的终端代理,该终端代理又通过非交互式SSH隧道连接到节点B上的登录shell。
  • 虚拟机和CT的内存和本地存储迁移采用安全模式。
    • 在迁移过程中,在源节点和目标节点之间建立一个或多个SSH隧道,以便交换迁移信息并传输内存和磁盘内容。
  • 存储复制

由于自动执行.bashrc和同级文件而产生的陷阱
如果您有一个定制的.bashrc文件,或者类似的文件,在被配置的shell登录时执行,ssh将在会话成功建立后自动运行它。这可能会导致一些意想不到的行为,因为这些命令可能以root权限对上述任何操作执行。这可能会导致不良的副作用!为了避免这样的麻烦,建议在/root/中添加一个检查。确保会话是交互式的,然后才运行.bashrc命令。你可以在.bashrc文件的开头添加以下代码片段:
# Early exit if not running interactively to avoid side-effects!
case $- in
*i*) ;;
*) return;;
esac


5.10、Corosync外部投票支持

本节描述在Proxmox VE集群中部署外部投票者的方法。配置后,集群可以支持更多的节点故障,而不会违反集群通信的安全属性。

要实现这一点,需要两种服务:

  • 一个所谓的qdevice守护进程,运行在每个Proxmox VE节点上
  • 外部投票守护进程,运行在独立的服务器上。

因此,您甚至可以在较小的设置(例如2+1节点)中获得更高的可用性。

5.10.1、QDevice技术概述

Corosync仲裁设备(QDevice)是运行在每个集群节点上的守护进程。它根据外部运行的第三方仲裁员的决定向集群仲裁子系统提供配置的投票数量。它的主要用途是允许集群承受比标准仲裁规则允许的更多的节点故障。这可以安全地完成,因为外部设备可以看到所有节点,因此只能选择一组节点进行投票。只有当收到第三方投票时,上述节点集(再次)具有quorum时,才会这样做。

目前仅支持QDevice Net作为第三方仲裁。它是一个守护进程,如果它可以通过网络到达分区成员,它将为集群分区提供投票。它在任何时候都只给集群的一个分区投票。它被设计成支持多个集群,几乎不需要配置和状态。新的集群是动态处理的,在运行QDevice的主机上不需要配置文件。

外部主机的唯一要求是需要对集群进行网络访问,并且需要一个可用的corosync-qnetd包。我们为基于Debian的主机提供了这样的包,其他Linux发行版也应该通过它们各自的包管理器提供一个包。

  1. 请注意
  2. corosync本身不同的是,QDevice通过TCP/IP连接到集群。守护进程甚至可以在集群LAN之外运行,并且可能有超过2毫秒的延迟。

5.10.2、支持设置

对于偶数节点的集群,我们支持qdevice,如果两个节点的集群能够提供更高的可用性,我们建议使用qdevice。对于节点数为奇数的集群,我们目前不鼓励使用QDevices。原因是QDevice为每种集群类型提供的投票不同。偶数编号的集群获得一个额外的投票,这样我们只能增加可用性,例如,如果QDevice本身失败,我们将处于与没有QDevice相同的情况。

现在,对于奇数的集群大小,QDevice提供(N-1)票——其中N对应于集群节点数。这种差异是有意义的,如果我们只有一个额外的投票,群集可能进入分裂大脑的情况。这个算法允许除了一个节点(当然还有QDevice本身)之外的所有节点失败。这有两个缺点:

  • 如果QNet守护进程本身发生故障,则不会有其他节点发生故障,或者集群立即丢失仲裁。例如,在一个有15个节点的集群中,在集群变成查询之前,7可能会失败。但是,如果在这里配置了一个QDevice并且该QDevice自身发生故障,那么15个节点中没有一个节点可能发生故障。在这种情况下,QDevice几乎是一个单点故障。

  • 事实上,除了一个节点加上QDevice之外的所有节点都可能会失败,这在一开始听起来很有希望,但这可能会导致大量HA服务的恢复,从而使剩下的单个节点过载。当只有(N-1)/2个节点在线时,ceph服务器会停止服务。

如果您了解这种技术的缺点和影响,您可以自己决定是否应该在奇数编号的集群设置中使用这种技术。

5.10.3、QDevice-Net设置

我们建议以非特权用户的身份运行任何为corosync-qdevice提供投票的守护进程。Proxmox VE和Debian提供了一个已经配置为这样做的包。守护进程和集群之间的通信必须加密,以确保在Proxmox VE中实现安全的QDevice集成。

首先,在外部服务器上安装corosync-qnetd包

external# apt install corosync-qnetd

以及所有集群节点上的corosync-qdevice包

pve# apt install corosync-qdevice

在此之后,确保集群上的所有节点都处于在线状态。

现在,通过在一个Proxmox VE节点上运行以下命令,您可以轻松地设置QDevice:

pve# pvecm qdevice setup <QDEVICE-IP>

集群中的SSH密钥将自动复制到QDevice。

  1. 请注意
  2. 如果在此步骤中要求您输入密码,请确保外部服务器上的SSH配置允许通过密码进行根用户登录

在您输入密码并成功完成所有步骤后,您将看到“Done”。您现在可以查看状态:

  1. pve# pvecm status
  2. ...
  3. Votequorum information
  4. ~~~~~~~~~~~~~~~~~~~~~
  5. Expected votes:3
  6. Highest expected: 3
  7. Total votes:3
  8. Quorum:2
  9. Flags:Quorate Qdevice
  10. Membership information
  11. ~~~~~~~~~~~~~~~~~~~~~~
  12. Nodeid Votes Qdevice Name
  13. 0x00000001 1 A,V,NMW 192.168.22.180 (local)
  14. 0x00000002 1 A,V,NMW 192.168.22.181
  15. 0x00000000 1 Qdevice

这意味着QDevice已经设置好了。

5.10.4、常见问题

领带打破

在tie的情况下,两个大小相同的集群分区除了QDevice之外无法看到对方,QDevice随机选择其中一个分区并投票给它。

可能的负面影响

对于节点数为偶数的集群,在设置QDevice时不会产生负面影响。如果它不能工作,你就和没有QDevice一样好。

在QDevice安装后添加/删除节点

如果您想在具有QDevice设置的集群中添加一个新节点或删除一个现有节点,您需要首先删除QDevice。之后,就可以正常添加或删除节点了。再次拥有一个节点数为偶数的集群后,您可以按照上面所述再次设置QDevice。

删除QDevice

如果你使用官方的pvecm工具添加QDevice,你可以通过运行以下命令删除它:

pve# pvecm qdevice remove

5.11、Corosync配置

/etc/pve/corosync.conf文件在Proxmox VE集群中起着核心作用。它控制着集群成员及其网络。要了解更多信息,请查看corosync.conf手册页:

man corosync.conf

对于节点成员,您应该始终使用Proxmox VE提供的pvecm工具。您可能必须手动编辑配置文件以进行其他更改。以下是一些最好的实践技巧。

5.11.1、编辑corosync.conf

编辑corosync.conf文件并不总是非常简单。在每个集群节点上有两个,一个在/etc/pve/corosync.conf中,另一个在/etc/corosync/corosync.conf中。编辑一个在我们的集群文件系统中,将把更改传播到本地文件系统,但反之亦然。

一旦文件发生变化,配置就会自动更新。这意味着可以集成到运行的corosync中的更改将立即生效。因此,您应该始终复制并编辑它,以避免触发一些不必要的更改由中间安全。

cp /etc/pve/corosync.conf /etc/pve/corosync.conf.new

然后用您喜欢的编辑器nano和vim打开配置文件。例如,tiny被预先安装在任何Proxmox VE节点上。

  1. 请注意
  2. 在配置更改时总是增加config_version号,忽略这个可能会导致问题。

在进行必要的更改之后,创建当前工作配置文件的另一个副本。如果新配置应用失败或在其他方面出现问题,这可以作为备份。

cp /etc/pve/corosync.conf /etc/pve/corosync.conf.bak

然后将新的配置文件移到旧的配置文件上:

mv /etc/pve/corosync.conf.new /etc/pve/corosync.conf

你可以用命令来检查

systemctl status corosync
journalctl -b -u corosync

是否可以自动应用更改。如果没有,你可能需要通过以下方式重启corosync服务:

systemctl restartcorosync

关于错误,请检查下面的故障排除一节。

5.11.2、故障排除

问题:**quorum.expected_votes必须配置

当corosync开始失败时,你在系统日志中得到如下消息:

  1. [...]
  2. corosync[1647]:[QUORUM] Quorum provider: corosync_votequorum failed to initialize.
  3. corosync[1647]:[SERV] Service engine corosync_quorum failed to load for reason
  4. configuration error: nodelist or quorum.expected_votes must be configured!’
  5. [...]

这意味着您在配置中为corosync ringX_addr设置的主机名无法解析。

写入配置时,没有**Quorate**

如果你需要在一个没有仲裁的节点上修改/etc/pve/corosync.conf,并且你知道该怎么做,使用:

pvecm expected 1

这将预期的投票计数设置为1,并使群集达到法定人数。您现在可以修复您的配置,或者将其恢复到上一个工作备份。

如果corosync不能启动,这是不够的。最好在/etc/corosync/corosync.conf文件中编辑corosync配置文件的本地副本,以便重新启动corosync。确保该配置在所有节点上具有相同的内容,以避免大脑分裂。如果您不确定哪里出了问题,最好向Proxmox社区寻求帮助。

5.11.3、Corosync配置术语表

ringX_addr
这为节点之间的kronosnet连接命名了不同的链接地址。

5.12、集群冷启动

很明显,当所有节点都离线时,集群是不够的。这是停电后的常见情况。

  1. 请注意
  2. 使用不间断电源(“UPS”,也称为“电池备份”)总是一个好主意,以避免这种状态,特别是如果你想要HA

在节点启动时,pve-guests服务启动并等待仲裁。一旦达到法定人数,就启动所有设置了onboot标志的客户机。

当您打开节点或电源故障后电源恢复时,一些节点可能比其他节点启动得更快。请记住,客户启动被延迟,直到你达到法定人数。

5.13、虚拟机迁移

将虚拟客户机迁移到其他节点是集群中的一个有用特性。有一些设置可以控制此类迁移的行为。这可以通过配置文件datacenter.cfg完成,也可以通过API或命令行参数完成特定迁移。

客户机是联机还是脱机,或者它是否有本地资源(如本地磁盘),这是不同的。

关于虚拟机迁移的详细信息,请参见QEMU/KVM迁移章节10.3。

关于容器迁移的详细信息,请参见容器迁移章节11.9。

5.13.1、迁移类型

迁移类型定义迁移数据应该通过加密的(安全的)通道发送还是通过未加密的(不安全的)通道发送。将迁移类型设置为不安全意味着虚拟客户机的RAM内容也会未加密地传输,这可能导致客户机内部关键数据的信息泄露(例如密码或加密密钥)。

因此,如果您对网络没有完全的控制,并且不能保证没有人在窃听它,我们强烈建议您使用安全通道。

  1. 请注意
  2. 存储迁移不遵循此设置。目前,它总是通过安全通道发送存储内容。

加密需要大量的计算能力,因此该设置经常被更改为“不安全”,以获得更好的性能。对现代系统的影响较小,因为它们在硬件上实现了AES加密。在可以传输10gbps或更多的快速网络中,性能影响尤其明显。

5.13.2、迁移网络

默认情况下,Proxmox VE使用集群通信所在的网络发送迁移流量。这不是最佳的,因为敏感的集群通信可能会中断,并且该网络在节点上可能没有最佳可用带宽。

设置迁移网络参数允许对整个迁移流量使用专用网络。除了内存之外,这还会影响脱机迁移的存储流量。

迁移网络以CIDR方式设置为网络。这样做的好处是您不必为每个节点设置单独的IP地址。Proxmox VE可以从CIDR表单中指定的网络确定目标节点上的真实地址。要启用这一点,必须指定网络,以便每个节点都有一个IP,但在各自的网络中只有一个IP。

例子

我们假设我们有一个带有三个独立网络的三节点设置。一个用于与互联网的公共通信,一个用于集群通信,还有一个非常快速的网络,我们想用它作为迁移的专用网络。

这种设置的网络配置可能如下所示:

  1. iface eno1 inet manual
  2. # public network
  3. auto vmbr0
  4. iface vmbr0 inet static
  5. address 192.X.Y.57
  6. netmask 255.255.250.0
  7. gateway 192.X.Y.1
  8. bridge-ports eno1
  9. bridge-stp off
  10. bridge-fd 0
  11. # cluster network
  12. auto eno2
  13. iface eno2 inet static
  14. address10.1.1.1
  15. netmask255.255.255.0
  16. # fast network
  17. auto eno3
  18. iface eno3 inet static
  19. address10.1.2.1
  20. netmask255.255.255.0

在这里,我们将使用网络10.1.2.0/24作为迁移网络。对于单个迁移,您可以使用命令行工具的migration_network参数来完成此操作:

# qm migrate 106 tre --online --migration_network 10.1.2.0/24

要将其配置为集群中所有迁移的默认网络,请设置/etc/pve/datacenter.cfg文件的migration属性:

# use dedicated migration network
migration: secure,network=10.1.2.0/24

  1. 请注意
  2. 当在/etc/pve/datacenter.cfg中设置迁移网络时,必须始终设置迁移类型。