Proxmox VE集群管理器pvecm是一个创建一组物理服务器的工具。这样的群体称为簇。我们使用 Corosync 集群引擎来实现可靠的群组通信。集群中的节点数量没有明确的限制。实际上,实际可能的节点数量可能受到主机和网络性能的限制。目前(2021 年),有报告称生产中的集群(使用高端企业硬件)拥有超过 50 个节点。
pvecm可用于创建新集群、将节点加入集群、离开集群、获取状态信息以及执行各种其他与集群相关的任务。Prox m o x集群文件系统(“ pmxcfs ”)用于将集群配置透明地分发到所有集群节点。
将节点分组为集群具有以下优点:
基于网络的集中管理
多主集群:每个节点可以完成所有管理任务
使用pmxcfs (数据库驱动的文件系统)来存储配置文件,并使用corosync在所有节点上实时复制
虚拟机和容器在物理主机之间轻松迁移
快速部署
集群范围的服务,例如防火墙和 HA
目录
Toggle5.1. 要求
所有节点必须能够通过 UDP 端口 5405-5412 相互连接,corosync 才能正常工作。
日期和时间必须同步。
节点之间需要 TCP 端口 22 上的 SSH 隧道。
如果您对高可用性感兴趣,则需要至少三个节点才能实现可靠的仲裁。所有节点应具有相同的版本。
我们建议为集群流量使用专用 NIC,尤其是在使用共享存储时。
添加节点时需要集群节点的 root 密码。
仅当节点具有同一供应商的 CPU 时,才支持虚拟机在线迁移。否则它可能会起作用,但这永远无法保证。
无法将 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 的升级过程。 |
5.2. 准备节点
首先,在所有节点上安装 Proxmox VE。确保每个节点都安装了最终的主机名和 IP 配置。创建集群后无法更改主机名和 IP。
虽然在/etc/hosts中引用所有节点名称及其 IP (或通过其他方式使其名称可解析)是很常见的,但这对于集群的工作来说并不是必需的。不过,它可能很有用,因为您可以使用更容易记住的节点名称,通过 SSH 从一个节点连接到另一个节点(另请参阅 链接地址类型)。请注意,我们始终建议在集群配置中通过 IP 地址引用节点。
5.3. 创建集群
您可以在控制台上创建集群(通过ssh登录),也可以使用 Proxmox VE Web 界面(数据中心 → 集群)通过 API 创建集群。
为您的集群使用唯一的名称。此名称以后无法更改。集群名称遵循与节点名称相同的规则。 |
5.3.1. 通过 Web GUI 创建
从 Proxmox VE 6.2 开始,最多可以将 8 个回退链接添加到集群中。要添加冗余链接,请单击“添加”按钮,然后从相应字段中选择链接编号和 IP 地址。在 Proxmox VE 6.2 之前,要添加第二个链接作为后备,您可以选中高级复选框并选择其他网络接口(链接 1,另请参阅Corosync 冗余)。
确保选择用于集群通信的网络不用于任何高流量目的,例如网络存储或实时迁移。虽然集群网络本身产生少量数据,但它对延迟非常敏感。查看完整的 集群网络要求。 |
5.3.2. 通过命令行创建
通过ssh登录到第一个 Proxmox VE 节点并运行以下命令:
hp1# pvecm 创建集群名称
要检查新集群的状态,请使用:
hp1# pvecm 状态
5.3.3. 同一网络中的多个集群
可以在同一物理或逻辑网络中创建多个集群。在这种情况下,每个集群必须有一个唯一的名称,以避免集群通信堆栈中可能发生的冲突。此外,这有助于通过使集群清晰可辨来避免人类混淆。
虽然 corosync 集群的带宽要求相对较低,但数据包的延迟和每秒数据包 (PPS) 速率是限制因素。同一网络中的不同集群可以相互竞争这些资源,因此对于更大的集群使用单独的物理网络基础设施可能仍然有意义。
5.4. 添加节点到集群
加入集群时,/etc/pve中的所有现有配置都会被覆盖。特别是,加入节点不能容纳任何来宾,因为来宾 ID 可能会发生冲突,并且该节点将继承集群的存储配置。要加入现有来宾的节点,作为解决方法,您可以创建每个来宾的备份(使用vzdump)并在加入后使用不同的 ID 恢复它。如果节点的存储布局不同,您将需要重新添加节点的存储,并调整每个存储的节点限制以反映存储实际可用的节点。 |
5.4.1. 通过 GUI 将节点加入集群
要手动输入所有必需的数据,您可以禁用辅助加入 复选框。 |
单击加入按钮后,集群加入过程将立即开始。节点加入集群后,其当前节点证书将被集群证书颁发机构 (CA) 签名的证书替换。这意味着当前会话将在几秒钟后停止工作。然后,您可能需要强制重新加载 Web 界面并使用集群凭据再次登录。
现在您的节点应该在Datacenter → Cluster下可见。
5.4.2. 通过命令行将节点加入集群
通过ssh登录到要加入现有集群的节点。
# pvecm 添加 IP 地址集群
对于IP-ADDRESS-CLUSTER,请使用现有集群节点的 IP 或主机名。建议使用 IP 地址(请参阅链接地址类型)。
要检查集群的状态,请使用:
#pvecm状态
#pvecm状态 集群信息 ~~~~~~~~~~~~~~~~~~~ 名称:产品中心 配置版本:3 运输: 海运 安全验证:开 法定人数信息 ~~~~~~~~~~~~~~~~~~ 日期:2021 年 9 月 14 日星期二 11:06:47 仲裁提供者:corosync_votequorum 节点:4 节点ID:0x00000001 环ID:1.1a8 报价:是 投票信息 ~~~~~~~~~~~~~~~~~~~~~~ 预期票数:4 最高预期:4 总票数:4 法定人数:3 标志: 法定人数 会员信息 ~~~~~~~~~~~~~~~~~~~~~~ Nodeid 投票名称 0x00000001 1 192.168.15.91 0x00000002 1 192.168.15.92(本地) 0x00000003 1 192.168.15.93 0x00000004 1 192.168.15.94
如果您只想要所有节点的列表,请使用:
# pvecm 节点
# pvecm 节点 会员信息 ~~~~~~~~~~~~~~~~~~~~~~ Nodeid 投票名称 1 1 马力1 2 1 hp2(本地) 3 1 马力3 4 1 马力4
5.4.3. 添加具有独立集群网络的节点
当向具有独立集群网络的集群添加节点时,需要使用link0参数来设置该网络上的节点地址:
# pvecm 添加 IP-ADDRESS-CLUSTER --link0 LOCAL-IP-ADDRESS-LINK0
如果要使用Kronosnet 传输层的内置冗余,还可以使用link1参数。
使用 GUI,您可以从 Cluster Join对话框中相应的Link X字段中选择正确的接口。
5.5. 删除集群节点
在继续之前请仔细阅读该过程,因为它可能不是您想要或需要的。 |
从节点中移出所有虚拟机。确保您已制作了要保留的所有本地数据或备份的副本。此外,请确保删除要删除的节点上的所有计划复制作业。
在删除节点之前未能将复制作业删除到该节点将导致复制作业变得不可删除。特别要注意的是,如果复制的虚拟机被迁移,复制会自动切换方向,因此,通过从要删除的节点迁移复制的虚拟机,复制作业将自动设置到该节点。 |
在以下示例中,我们将从集群中删除节点 hp4。
登录到不同的集群节点(不是 hp4),然后发出pvecm Nodes 命令来标识要删除的节点 ID:
hp1# pvecm 节点 会员信息 ~~~~~~~~~~~~~~~~~~~~~~ Nodeid 投票名称 1 1 hp1(本地) 2 1 马力2 3 1 马力3 4 1 马力4
此时,您必须关闭 hp4 的电源,并确保其在当前配置下不会再次开机(在网络中)。
如上所述,在移除节点之前关闭节点电源至关重要 ,并确保它不会以其当前配置再次启动(在现有集群网络中)。如果按原样打开节点电源,集群最终可能会损坏,并且可能很难将其恢复到正常运行状态。 |
关闭节点 hp4 的电源后,我们可以安全地将其从集群中删除。
hp1# pvecm delnode hp4 杀死节点4
此时,您可能会收到一条错误消息,指出Could not Kill node (error = CS_ERR_NOT_EXIST)。这并不意味着节点删除实际失败,而是 corosync 尝试杀死离线节点失败。因此,可以安全地忽略它。 |
使用pvecm Nodes或pvecm status再次检查节点列表。它应该看起来像:
hp1# pvecm 状态 ... 投票信息 ~~~~~~~~~~~~~~~~~~~~~~ 预期票数:3 最高预期:3 总票数:3 法定人数:2 标志: 法定人数 会员信息 ~~~~~~~~~~~~~~~~~~~~~~ Nodeid 投票名称 0x00000001 1 192.168.15.90(本地) 0x00000002 1 192.168.15.91 0x00000003 1 192.168.15.92
如果出于某种原因,您希望该服务器再次加入同一个集群,您必须:
在其上全新安装 Proxmox VE,
然后加入它,如上一节所述。
删除节点后,其 SSH 指纹仍驻留在 其他节点的known_hosts中。如果在重新加入具有相同 IP 或主机名的节点后收到 SSH 错误,请在重新添加的节点上运行一次pvecm updatecerts以在集群范围内更新其指纹。 |
5.5.1. 分离节点无需重新安装
这不是推荐的方法,请谨慎操作。如果您不确定,请使用前面的方法。 |
您还可以将节点从集群中分离出来,而无需从头开始重新安装。但从集群中删除节点后,它仍然可以访问任何共享存储。在开始从集群中删除节点之前必须解决此问题。Proxmox VE 集群无法与另一个集群共享完全相同的存储,因为存储锁定无法跨集群边界工作。此外,还可能导致VMID冲突。
建议您创建一个新的存储,其中只有您要分离的节点可以访问。这可以是 NFS 上的新导出或新的 Ceph 池,仅举几个例子。重要的是完全相同的存储不会被多个集群访问。设置此存储后,将所有数据和虚拟机从该节点移至该存储。然后您就可以将节点从集群中分离出来。
确保所有共享资源完全分离!否则你就会遇到冲突和问题。 |
首先,停止节点上的 corosync 和 pve-cluster 服务:
systemctl 停止 pve 集群 systemctl 停止 corosync
以本地模式再次启动集群文件系统:
pmxcfs-l
删除corosync配置文件:
rm /etc/pve/corosync 。会议 rm -r /etc/corosync /*
您现在可以再次启动文件系统作为正常服务:
杀掉pmxcfs systemctl 启动 pve 集群
该节点现已与集群分离。您可以使用以下命令从集群的任何剩余节点中删除它:
pvecm delnode oldnode
如果该命令由于剩余节点中的仲裁丢失而失败,您可以将预期投票设置为 1 作为解决方法:
pvecm 预期1
然后重复pvecm delnode命令。
现在切换回分离的节点并删除其上所有剩余的集群文件。这确保了该节点可以再次添加到另一个集群而不会出现问题。
rm /var/lib/corosync /*
由于其他节点的配置文件仍在集群文件系统中,您可能也需要清理它们。在绝对确保您拥有正确的节点名称后,您可以简单地从/etc/pve/nodes/NODENAME递归删除整个目录。
节点的 SSH 密钥将保留在authorized_key文件中。这意味着节点仍然可以通过公钥身份验证相互连接。您应该通过从/etc/pve/priv/authorized_keys文件中删除相应的密钥来解决此问题 。 |
5.6. 法定人数
Proxmox VE 使用基于仲裁的技术在所有集群节点之间提供一致的状态。
法定人数是分布式事务必须获得的最小投票数才能被允许在分布式系统中执行操作。
——来自维基百科
在网络分区的情况下,状态更改需要大多数节点在线。如果集群失去法定人数,则会切换到只读模式。
Proxmox VE 默认为每个节点分配一票。 |
5.7. 集群网络
集群网络是集群的核心。通过它发送的所有消息都必须按照各自的顺序可靠地传递到所有节点。在 Proxmox VE 中,这部分是由 corosync 完成的,corosync 是一个高性能、低开销、高可用性开发工具包的实现。它为我们的去中心化配置文件系统(pmxcfs)提供服务。
5.7.1. 网络要求
Proxmox VE集群堆栈需要所有节点之间的延迟低于5毫秒(LAN性能)的可靠网络才能稳定运行。虽然在节点数较少的设置中,延迟较高的网络可能会正常工作,但这并不能得到保证,并且在节点数超过 3 个且延迟超过 10 毫秒左右的情况下,这种情况不太可能发生。
其他成员不应大量使用网络,因为虽然 corosync 不使用太多带宽,但它对延迟抖动很敏感;理想情况下,corosync 在其自己的物理隔离网络上运行。特别是不要使用共享网络进行同步和存储(除非作为冗余配置中潜在的低优先级回退)。
在设置集群之前,最好检查网络是否适合该目的。为了保证集群网络中各节点之间能够相互连接,可以使用ping 工具测试节点之间的连通性。
如果启用了 Proxmox VE 防火墙,将自动生成 corosync 的接受规则 – 无需手动操作。
Corosync在3.0版本之前使用Multicast(在Proxmox VE 6.0中引入)。现代版本依赖Kronosnet进行集群通信,目前仅支持常规 UDP 单播。 |
您仍然可以通过在corosync.conf中将传输设置为udp或udpu来启用多播或旧单播,但请记住,这将禁用所有加密和冗余支持。因此不建议这样做。 |
5.7.2. 独立的集群网络
当创建没有任何参数的集群时,corosync集群网络通常与Web界面和虚拟机网络共享。根据您的设置,甚至存储流量也可能通过同一网络发送。建议更改这一点,因为 corosync 是一个时间关键的实时应用程序。
设置新网络
首先,您必须设置一个新的网络接口。它应该位于物理上独立的网络上。确保您的网络满足 集群网络要求。
集群创建时分开
这可以通过 用于创建新集群的pvecm create命令的linkX参数来实现。
如果您在 10.10.10.1/25 上设置了一个具有静态地址的附加 NIC,并且希望通过此接口发送和接收所有集群通信,您可以执行:
pvecm 创建测试--link 0 10.10 。10.1
要检查一切是否正常工作,请执行:
systemctl 状态 corosync
然后,按照上述步骤添加 具有独立集群网络的节点。
集群创建后分离
如果您已经创建了一个集群并希望将其通信切换到另一个网络而不重建整个集群,则可以执行此操作。这一更改可能会导致集群中出现短暂的仲裁丢失,因为节点必须重新启动 corosync 并在新网络上一个接一个地出现。
首先检查如何编辑corosync.conf 文件。然后,打开它,您应该会看到一个类似于以下内容的文件:
记录{ 调试:关闭 to_syslog:是的 } 节点列表{ 节点{ 姓名:到期 节点ID:2 法定投票数:1 ring0_addr:到期 } 节点{ 姓名: 特雷 节点ID:3 法定投票数:1 ring0_地址:tre } 节点{ 姓名:乌诺 节点ID:1 法定投票数:1 ring0_addr:uno } } 法定人数{ 提供者:corosync_votequorum } 图腾{ cluster_name:测试集群 配置版本:3 ip_版本:ipv4-6 安全: 上 版本:2 界面 { 链接数量: 0 } }
ringX_addr实际上指定了一个corosync链接地址。“ring”这个名称是旧版 corosync 版本的残余,保留它是为了向后兼容。 |
您要做的第一件事是在节点条目中添加名称属性(如果您还没有看到它们)。这些必须与节点名称匹配。
然后将所有节点的ring0_addr属性中的所有地址替换为新地址。您可以在此处使用纯 IP 地址或主机名。如果您使用主机名,请确保它们可从所有节点解析(另请参阅 链接地址类型)。
在本例中,我们希望将集群通信切换到10.10.10.1/25网络,因此我们分别更改每个节点的ring0_addr 。
也可以使用完全相同的过程来更改其他ringX_addr值。但是,我们建议一次仅更改一个链接地址,以便在出现问题时更容易恢复。 |
增加config_version属性后,新的配置文件应如下所示:
记录{ 调试:关闭 to_syslog:是的 } 节点列表{ 节点{ 姓名:到期 节点ID:2 法定投票数:1 环0_地址:10.10.10.2 } 节点{ 姓名: 特雷 节点ID:3 法定投票数:1 环0_地址:10.10.10.3 } 节点{ 姓名:乌诺 节点ID:1 法定投票数:1 环0地址:10.10.10.1 } } 法定人数{ 提供者:corosync_votequorum } 图腾{ cluster_name:测试集群 配置版本:4 ip_版本:ipv4-6 安全: 上 版本:2 界面 { 链接数量: 0 } }
然后,在最后检查所有更改的信息是否正确后,我们保存它并再次按照 编辑 corosync.conf 文件部分使其生效。
更改将实时应用,因此不一定需要重新启动 corosync。如果您还更改了其他设置,或者注意到 corosync 抱怨,您可以选择触发重新启动。
在单个节点上执行:
systemctl 重新启动 corosync
现在检查一切是否正常:
systemctl 状态 corosync
如果 corosync 再次开始工作,请在所有其他节点上重新启动它。然后他们将在新网络上一一加入集群成员资格。
5.7.3. Corosync 地址
corosync 链接地址(为了向后兼容,在 corosync.conf中由ringX_addr表示)可以通过两种方式指定:
IPv4/v6地址可以直接使用。推荐使用它们,因为它们是静态的并且通常不会被粗心地更改。
主机名将使用getaddrinfo进行解析,这意味着默认情况下,将首先使用 IPv6 地址(如果可用)(另请参阅 man gai.conf)。请记住这一点,尤其是在将现有集群升级到 IPv6 时。
应谨慎使用主机名,因为可以在不触及 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。
为了提供有用的故障转移,每个链路都应该位于其自己的物理网络连接上。 |
根据优先级设置使用链接。您可以通过在 corosync.conf 的相应接口部分中设置knet_link_priority来配置此优先级,或者最好在使用pvecm创建集群时使用优先级参数:
# pvecm 创建集群名称 --link0 10.10.10.1,优先级=15 --link1 10.20.20.1,优先级=20
这将导致首先使用link1 ,因为它具有更高的优先级。
如果没有手动配置优先级(或者两条链路具有相同的优先级),则将按照链路编号的顺序使用链路,编号较小的优先级较高。
即使所有链路都正常工作,只有具有最高优先级的链路才会看到 corosync 流量。链路优先级不能混合,这意味着具有不同优先级的链路将无法相互通信。
由于除非所有较高优先级都发生故障,否则较低优先级链路不会看到流量,因此将用于其他任务(虚拟机、存储等)的网络指定为低优先级链路成为一种有用的策略。如果最坏的情况发生,更高的延迟或更拥挤的连接可能比完全没有连接要好。
5.8.1. 向现有集群添加冗余链接
要将新链接添加到正在运行的配置,请首先检查如何 编辑 corosync.conf 文件。
然后,将新的ringX_addr添加到节点列表部分中的每个节点。确保您的X对于您添加到的每个节点都是相同的,并且对于每个节点来说都是唯一的。
最后,将一个新的界面(如下所示)添加到您的图腾 部分,将X替换为上面选择的链接号。
假设您添加了编号为 1 的链接,新的配置文件可能如下所示:
记录{ 调试:关闭 to_syslog:是的 } 节点列表{ 节点{ 姓名:到期 节点ID:2 法定投票数:1 环0_地址:10.10.10.2 环1_地址:10.20.20.2 } 节点{ 姓名: 特雷 节点ID:3 法定投票数:1 环0_地址:10.10.10.3 环1_地址:10.20.20.3 } 节点{ 姓名:乌诺 节点ID:1 法定投票数:1 环0地址:10.10.10.1 环1_地址:10.20.20.1 } } 法定人数{ 提供者:corosync_votequorum } 图腾{ cluster_name:测试集群 配置版本:4 ip_版本:ipv4-6 安全: 上 版本:2 界面 { 链接数量: 0 } 界面 { 链接数量:1 } }
一旦您按照最后的步骤 编辑 corosync.conf 文件,新链接就会启用。不需要重新启动。您可以使用以下命令检查 corosync 是否加载了新链接:
日志ctl -b -u corosync
通过暂时断开一个节点上的旧链接并确保其状态在断开连接时保持在线来测试新链接可能是一个好主意:
pvecm状态
如果您看到健康的集群状态,则意味着您的新链接正在使用。
5.9. SSH 在 Proxmox VE 集群中的作用
Proxmox VE 利用 SSH 隧道来实现各种功能。
代理控制台/shell 会话(节点和来宾)
当连接到节点 A 时使用节点 B 的 shell 时,会连接到节点 A 上的终端代理,该代理又通过非交互式 SSH 隧道连接到节点 B 上的登录 shell。
安全模式 下的 VM 和 CT 内存和本地存储迁移。
在迁移过程中,源节点和目标节点之间会建立一条或多条SSH隧道,以交换迁移信息并传输内存和磁盘内容。
存储复制
由于自动执行.bashrc和同级文件而导致的陷阱 如果您有自定义.bashrc或在登录时由配置的 shell 执行的类似文件,则一旦成功建立会话,ssh将自动运行它。这可能会导致一些意外的行为,因为这些命令可能是在上述任何操作上以 root 权限执行的。这可能会导致可能出现问题的副作用! 为了避免此类复杂情况,建议在 /root/.bashrc中添加检查以确保会话是交互式的,然后才运行 .bashrc命令。 您可以在.bashrc文件的开头添加此代码段: # 如果不以交互方式运行,请提前退出以避免副作用! 案例$-in *我*) ;; *) 返回;; 埃萨克 |
5.10. Corosync 外部投票支持
本节介绍了在 Proxmox VE 集群中部署外部投票器的方法。配置后,集群可以承受更多节点故障,而不会违反集群通信的安全属性。
为此,需要涉及两项服务:
在每个 Proxmox VE 节点上运行的 QDevice 守护进程
在独立服务器上运行的外部投票守护程序
因此,即使在较小的设置(例如 2+1 节点)中,您也可以获得更高的可用性。
5.10.1. QDevice 技术概述
Corosync 仲裁设备 (QDevice) 是在每个集群节点上运行的守护进程。它根据外部运行的第三方仲裁者的决定,向集群的仲裁子系统提供配置数量的投票。它的主要用途是允许集群承受比标准仲裁规则允许的更多的节点故障。这可以安全地完成,因为外部设备可以看到所有节点,从而仅选择一组节点进行投票。仅当所述节点集在收到第三方投票后可以(再次)达到法定人数时,才会执行此操作。
目前,仅支持QDevice Net作为第三方仲裁器。这是一个守护进程,如果它可以通过网络到达分区成员,它会为集群分区提供投票。它在任何时候只会对集群的一个分区进行投票。它旨在支持多个集群,并且几乎无需配置和状态。新集群是动态处理的,运行 QDevice 的主机上不需要配置文件。
对外部主机的唯一要求是它需要对集群进行网络访问并具有可用的 corosync-qnetd 软件包。我们为基于 Debian 的主机提供了一个软件包,其他 Linux 发行版也应该通过各自的软件包管理器提供一个可用的软件包。
与 corosync 本身不同,QDevice 通过 TCP/IP 连接到集群。该守护进程还可以在集群的 LAN 外部运行,并且不限于 corosync 的低延迟要求。 |
5.10.2. 支持的设置
我们支持具有偶数个节点的集群的 QDevices,并建议将其用于 2 节点集群(如果它们应提供更高的可用性)。对于节点数为奇数的集群,我们目前不鼓励使用 QDevice。其原因是 QDevice 为每种集群类型提供的投票有所不同。偶数编号的集群可以获得一次额外投票,这只会提高可用性,因为如果 QDevice 本身发生故障,您将处于与根本没有 QDevice 相同的位置。
另一方面,对于奇数编号的集群大小,QDevice 提供 (N-1)票 — 其中N对应于集群节点数。这种替代行为是有道理的;如果它只多投一票,集群可能会陷入裂脑状态。该算法允许除一个(当然还有 QDevice 本身)之外的所有节点发生故障。然而,这样做有两个缺点:
如果 QNet 守护程序本身发生故障,则其他节点可能不会发生故障,或者群集会立即失去仲裁。例如,在具有 15 个节点的集群中,在集群变得不合格之前,其中 7 个节点可能会发生故障。但是,如果此处配置了 QDevice 并且它本身发生故障,则15 个节点中没有一个节点会发生故障。在这种情况下,QDevice 几乎充当单点故障。
除了一个节点加上 QDevice 之外的所有节点都可能发生故障,这一事实一开始听起来很有希望,但这可能会导致 HA 服务的大量恢复,从而可能使单个剩余节点超载。此外,如果只有((N-1)/2)个或更少的节点保持在线, Ceph 服务器将停止提供服务。
如果您了解其缺点和影响,您可以自行决定是否要在奇数集群设置中使用此技术。
5.10.3. QDevice-Net 设置
我们建议以非特权用户身份运行任何为 corosync-qdevice 提供投票的守护程序。Proxmox VE 和 Debian 提供了一个已配置为执行此操作的软件包。守护程序和集群之间的流量必须加密,以确保 QDevice 在 Proxmox VE 中安全集成。
首先,在外部服务器上安装corosync-qnetd软件包
外部# apt install corosync-qnetd
以及所有集群节点上的corosync-qdevice包
pve# apt install corosync-qdevice
完成此操作后,请确保集群中的所有节点都在线。
现在,您可以通过在 Proxmox VE 节点之一上运行以下命令来设置 QDevice:
pve# pvecm qdevice 设置 <QDEVICE-IP>
集群中的 SSH 密钥将自动复制到 QDevice。
如果在此步骤中要求您输入密码,请确保外部服务器上的 SSH 配置允许 root 通过密码登录。如果您收到诸如主机密钥验证失败之类的错误。在此阶段,运行pvecm updatecerts可以解决该问题。 |
输入密码并成功完成所有步骤后,您将看到“完成”。您可以验证 QDevice 是否已设置:
pve# pvecm 状态 ... 投票信息 ~~~~~~~~~~~~~~~~~~~~~ 预期票数:3 最高预期:3 总票数:3 法定人数:2 标志: Quorate Qdevice 会员信息 ~~~~~~~~~~~~~~~~~~~~~~ Nodeid 投票 Qdevice 名称 0x00000001 1 A、V、NMW 192.168.22.180(本地) 0x00000002 1 A、V、NMW 192.168.22.181 0x00000000 1 个 Q 设备
QDevice 状态标志
如上所示,QDevice 的状态输出通常包含三列:
A / NA:活着或不活着。指示与外部corosync-qndetd守护程序的通信是否有效 。
V / NV:QDevice 是否会为节点投票。在脑裂情况下,节点之间的 corosync 连接已关闭,但它们仍然可以与外部corosync-qnetd守护进程通信,只有一个节点将获得投票。
MW / NMW:大师获胜(MV)或失败(NMW)。默认值为NMW,请参阅 [ 11 ]。
NR:QDevice 未注册。
5.10.4. 经常问的问题
打破平局
如果出现平局,即两个相同大小的集群分区无法看到彼此但可以看到 QDevice,则 QDevice 会随机选择其中一个分区并对其进行投票。
可能的负面影响
对于节点数为偶数的集群,使用 QDevice 时不会产生负面影响。如果无法工作,就相当于根本没有QDevice。
QDevice 设置后添加/删除节点
如果要添加新节点或从具有 QDevice 设置的集群中删除现有节点,则需要先删除 QDevice。之后就可以正常添加或删除节点了。一旦您再次拥有偶数节点数的集群,您就可以按照前面所述再次设置 QDevice。
删除 QDevice
如果您使用官方pvecm工具添加 QDevice,则可以通过运行以下命令将其删除:
pve# pvecm qdevice 删除
5.11. Corosync配置
/etc/pve/corosync.conf文件在 Proxmox VE 集群中发挥着核心作用。它控制集群成员资格及其网络。有关它的更多信息,请查看 corosync.conf 手册页:
男人corosync 。会议
对于节点成员资格,您应该始终使用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 . 会议。新的
然后,使用您最喜欢的编辑器(例如nano或 vim.tiny )打开配置文件,这些编辑器预安装在每个 Proxmox VE 节点上。
配置更改后始终增加config_version号;忽略这一点可能会导致问题。 |
进行必要的更改后,创建当前工作配置文件的另一个副本。如果新配置无法应用或导致其他问题,这可用作备份。
cp /etc/pve/corosync 。conf /etc/pve/corosync . 会议。巴克
然后用新的配置文件替换旧的配置文件:
mv /etc/pve/corosync . 会议。新的 /etc/pve/corosync 。会议
您可以使用以下命令检查是否可以自动应用更改:
systemctl 状态 corosync 日志ctl -b -u corosync
如果更改无法自动应用,您可能需要通过以下方式重新启动 corosync 服务:
systemctl 重新启动 corosync
如果出现错误,请检查下面的故障排除部分。
5.11.2. 故障排除
问题:必须配置 quorum.expected_votes
当 corosync 开始失败并且您在系统日志中收到以下消息时:
[...] corosync[1647]:[QUORUM]仲裁提供程序:corosync_votequorum 初始化失败。 corosync[1647]:[SERV]服务引擎“corosync_quorum”由于某种原因无法加载 “配置错误:必须配置nodelist或quorum.expected_votes!” [...]
这意味着您在配置中为 corosyncringX_addr 设置的主机名无法解析。
不合格时写入配置
如果您需要在没有仲裁的节点上更改/etc/pve/corosync.conf ,并且您了解自己在做什么,请使用:
pvecm 预期1
这会将预期投票数设置为 1 并使集群达到法定人数。然后,您可以修复您的配置,或将其恢复到上次工作的备份。
如果 corosync 无法再启动,这还不够。在这种情况下,最好在 /etc/corosync/corosync.conf中编辑 corosync 配置的本地副本,以便 corosync 可以重新启动。确保在所有节点上,此配置具有相同的内容,以避免裂脑情况。
5.11.3。Corosync 配置术语表
- 环X_地址
这为节点之间的 Kronosnet 连接命名了不同的链接地址。
5.12. 集群冷启动
很明显,当所有节点都离线时,集群是不合格的。这是停电后的常见情况。
使用不间断电源(“UPS”,也称为“备用电池”)来避免这种状态始终是一个好主意,特别是如果您想要 HA。 |
节点启动时,pve-guests服务启动并等待仲裁。一旦达到法定人数,它就会启动所有设置了onboot 标志的 guest 虚拟机。
当您打开节点时,或者断电后恢复供电时,某些节点可能会比其他节点启动得更快。请记住,来宾启动会延迟,直到达到法定人数为止。
5.13。访客 VMID 自动选择
创建新来宾时,Web 界面将自动向后端请求免费的 VMID。搜索的默认范围是100到1000000(低于架构强制允许的最大 VMID)。
有时,管理员希望在单独的范围内分配新的 VMID,例如轻松地将临时虚拟机与手动选择 VMID 的虚拟机分开。其他时候,它只是希望提供一个稳定长度的 VMID,为此将下限设置为(例如100000)可以提供更多空间。
为了适应这一用例,可以通过datacenter.cfg配置文件设置下边界、上边界或两个边界,该文件可以在 Web 界面中的Datacenter → Options下进行编辑。
该范围仅用于 next-id API 调用,因此它不是硬性限制。 |
5.14。访客迁移
将虚拟来宾迁移到其他节点是集群中的一项有用功能。有一些设置可以控制此类迁移的行为。这可以通过配置文件 datacenter.cfg完成,或者通过 API 或命令行参数进行特定迁移。
来宾是否在线或离线,或者是否具有本地资源(如本地磁盘),都会有所不同。
有关虚拟机迁移的详细信息,请参见 《QEMU/KVM 迁移》章节。
有关容器迁移的详细信息,请参见 容器迁移章节。
5.14.1. 迁移类型
迁移类型定义迁移数据是否应通过加密(安全)通道或未加密(不安全)通道发送。将迁移类型设置为不安全意味着虚拟客户机的 RAM 内容也以未加密的方式传输,这可能会导致客户机内部关键数据(例如密码或加密密钥)的信息泄露。
因此,如果您无法完全控制网络并且无法保证没有人窃听,我们强烈建议您使用安全通道。
存储迁移不遵循此设置。目前,它始终通过安全通道发送存储内容。 |
加密需要大量的计算能力,因此经常将此设置更改为不安全以实现更好的性能。对现代系统的影响较小,因为它们在硬件中实现了 AES 加密。在可以传输 10 Gbps 或更高速度的快速网络中,性能影响尤其明显。
5.14.2. 移民网络
默认情况下,Proxmox VE 使用发生集群通信的网络来发送迁移流量。这不是最佳的,因为敏感的集群流量可能会被中断,并且该网络可能没有节点上可用的最佳带宽。
设置迁移网络参数允许对所有迁移流量使用专用网络。除了内存之外,这还会影响离线迁移的存储流量。
迁移网络设置为使用 CIDR 表示法的网络。这样做的优点是您不必为每个节点设置单独的 IP 地址。Proxmox VE 可以从 CIDR 形式指定的网络中确定目标节点上的真实地址。为了实现这一点,必须指定网络,以便每个节点在各自的网络中只有一个 IP。
例子
我们假设我们有一个三节点设置,具有三个独立的网络。一种用于与互联网的公共通信,一种用于集群通信,还有一种速度非常快,我们希望将其用作迁移的专用网络。
此类设置的网络配置可能如下所示:
iface eno1 inet 手册 # 公共网络 自动虚拟机BR0 iface vmbr0 inet 静态 地址192.XY57/24 网关 192.XY1 桥接端口 eno1 桥接 stp 关闭 桥FD 0 # 集群网络 自动 eno2 iface eno2 inet 静态 地址10.1.1.1/24 # 快速网络 自动 eno3 iface eno3 inet 静态 地址10.1.2.1/24
这里,我们将使用网络10.1.2.0/24作为迁移网络。对于单个迁移,您可以使用 命令行工具的migration_network参数来执行此操作:
# qm migrate 106 tre --online --migration_network 10.1.2.0/24
要将其配置为集群中所有迁移的默认网络,请设置/etc/pve/datacenter.cfg文件的迁移属性 :
# 使用专用迁移网络 迁移:安全,网络=10.1.2.0/24
在/etc/pve/datacenter.cfg中设置迁移网络时,必须始终设置迁移类型。 |