将两台 Proxmox VE (PVE) 服务器整合成一个集群,看似只是在 Web 界面上点击几下“加入集群”那么简单。但实际上,这背后启动的是一场需要 7×24 小时持续进行、分秒必争的精密“对话”。本文将从抓包的视角出发,把这复杂的通信过程拆解为五条清晰的信息流,让你直观地理解节点间到底交换了什么数据,以及整套机制为何如此设计。
一、心跳与选票:确认“你还活着”
- 协议:Corosync,使用 UDP 端口 5404/5405
- 频率:每秒一次
- 内容示例:
seq=38721, vote=1, online=2/2
- 核心作用:
- 节点间相互通报状态:“我持有1张选票,当前集群共有2个在线节点”。
- 若连续丢失超过5个心跳包,对方节点即被标记为“离线”(DOWN),这会触发法定票数(quorum)的重新计算。
- 在只有两个节点的场景下,任何一方失联都会导致整个集群进入“只读冻结”状态,这是防止集群脑裂(Split-Brain)的首要机制。
二、配置数据库同步:确保配置全局一致
- 协议:pmxcfs (基于 SQLite 与 FUSE 的集群文件系统)
- 延迟:通常小于 100 毫秒
- 内容示例:
txn_id=0x7f3e, diff="..."
对端回应:
ack=0x7f3e, crc32=0xa4f2c1e8
- 核心作用:
- 保证所有节点上的
/etc/pve 配置目录内容实时、完全一致。
- 任何配置变更(事务)都必须获得集群中“多数节点”的确认(ACK)后才能提交。在两节点环境下,若其中一台失联,配置库会立即变为只读,彻底杜绝双主写入导致的数据混乱。
三、资源状态与 HA 评分:决定虚拟机调度
- 协议:CRM/LRM (基于 Corosync 令牌传递)
- 内容示例:
ha_state: vm-100=started, load=0.8, mem=42%
故障转移时:
takeover: vm-100, reason=node_fail
- 核心作用:
- 成功获取分布式锁的节点将成为“指定协调器”(Designated Coordinator, DC)。它会根据一个评分公式(例如:
score = 100 - 负载百分比 - 内存使用百分比 - IO延迟)将虚拟机调度到最空闲的节点上。
- 当检测到节点心跳丢失后,大约经过 60 秒会触发恢复流程:关闭故障节点上的虚拟机 → 在对端节点上冷启动 → 发送免费 ARP 通告以完成 IP 地址漂移,从而实现高可用(HA)故障转移。
四、存储锁与磁盘心跳:网络的备用仲裁者
- 主要场景:使用共享 SAN 或 LUN 存储时。
- 内容示例:
SCSI reservation: PR OUT—Register & Reserve
scsi_res: key=0x1234, owner=nodeA
- 核心作用:
- 节点向共享磁盘注册一个“持久化保留”(Persistent Reservation)密钥,防止多个节点同时写入同一块磁盘,确保数据安全。
- 当网络心跳完全失效时,节点会转而读写磁盘上的特定扇区,通过这种“磁盘心跳”继续交换存活信号。
- 如果网络心跳和磁盘心跳全部中断,那么持有更多磁盘锁(或特定类型锁)的节点将赢得资源的启动权,而另一个节点则会通过自我隔离(fence)机制退出,这是避免脑裂的第二重保险,深刻体现了集群高可用设计的严密性。
五、SSH 密钥与文件复制:建立初始信任关系
- 触发条件:仅在新节点加入集群时执行一次。
- 内容示例:
ssh-rsa AAAAB3NzaC1yc2E... root@nodeA
rsync /etc/pve/* root@nodeB:/etc/pve/
- 核心作用:
- 将本机的 SSH 公钥写入对端节点的
/etc/pve/priv/authorized_keys 文件中,实现节点间基于密钥的无密码互信登录。这为后续的冷迁移、快照操作和备份任务做好了准备。
- 首次加入时,通过 rsync 全量同步一次配置数据库,确保双方起点一致。此后的所有配置变更都将通过 pmxcfs 的实时事务机制同步,不再依赖 SSH。
一张图总结五种信息流
┌--------------┐ 1.心跳/选票 ┌--------------┐
│ PVE-nodeA │<----------------------->│ PVE-nodeB │
└------┬-------┘ └------┬-------┘
│ 2.配置事务(diff+ack) │
│<----------------------------------------->│
│ 3.资源状态/HA评分 │
│<----------------------------------------->│
│ 4.存储锁/磁盘心跳(共享LUN) │
│<----------------------------------------->│
│ 5.SSH密钥&rsync(仅首次) │
│<----------------------------------------->│
结语
两台 PVE 服务器成功组建集群后,便会通过上述“心跳-配置-资源-存储-身份”五条通道展开持续对话。这套对话的核心逻辑可以概括为:“确认存活” → “同步配置” → “调度资源” → “仲裁磁盘” → “建立互信”。
凭借法定人数(quorum)机制与磁盘心跳的双重仲裁,这套设计即使在仅有两节点的、理论上最脆弱的网络环境中,也能严格保证“挂掉一台不乱写数据,全部挂掉不双开服务”的底线。这种稳固的基础通信层,为 PVE 集群实现在线迁移、高可用故障转移以及后续的横向扩展奠定了坚实根基。对这类底层机制的理解,能帮助运维人员更精准地排查集群问题,欢迎在云栈社区交流更多虚拟化与集群管理的实践经验。
|