找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1014

积分

0

好友

130

主题
发表于 昨天 19:06 | 查看: 0| 回复: 0

将两台 Proxmox VE (PVE) 服务器整合成一个集群,看似只是在 Web 界面上点击几下“加入集群”那么简单。但实际上,这背后启动的是一场需要 7×24 小时持续进行、分秒必争的精密“对话”。本文将从抓包的视角出发,把这复杂的通信过程拆解为五条清晰的信息流,让你直观地理解节点间到底交换了什么数据,以及整套机制为何如此设计。

一、心跳与选票:确认“你还活着”

  • 协议:Corosync,使用 UDP 端口 5404/5405
  • 频率:每秒一次
  • 内容示例
    seq=38721, vote=1, online=2/2
  • 核心作用
    1. 节点间相互通报状态:“我持有1张选票,当前集群共有2个在线节点”。
    2. 若连续丢失超过5个心跳包,对方节点即被标记为“离线”(DOWN),这会触发法定票数(quorum)的重新计算。
    3. 在只有两个节点的场景下,任何一方失联都会导致整个集群进入“只读冻结”状态,这是防止集群脑裂(Split-Brain)的首要机制。

二、配置数据库同步:确保配置全局一致

  • 协议:pmxcfs (基于 SQLite 与 FUSE 的集群文件系统)
  • 延迟:通常小于 100 毫秒
  • 内容示例
    txn_id=0x7f3e, diff="..."
    对端回应:
    ack=0x7f3e, crc32=0xa4f2c1e8
  • 核心作用
    1. 保证所有节点上的 /etc/pve 配置目录内容实时、完全一致。
    2. 任何配置变更(事务)都必须获得集群中“多数节点”的确认(ACK)后才能提交。在两节点环境下,若其中一台失联,配置库会立即变为只读,彻底杜绝双主写入导致的数据混乱。

三、资源状态与 HA 评分:决定虚拟机调度

  • 协议:CRM/LRM (基于 Corosync 令牌传递)
  • 内容示例
    ha_state: vm-100=started, load=0.8, mem=42%
    故障转移时:
    takeover: vm-100, reason=node_fail
  • 核心作用
    1. 成功获取分布式锁的节点将成为“指定协调器”(Designated Coordinator, DC)。它会根据一个评分公式(例如:score = 100 - 负载百分比 - 内存使用百分比 - IO延迟)将虚拟机调度到最空闲的节点上。
    2. 当检测到节点心跳丢失后,大约经过 60 秒会触发恢复流程:关闭故障节点上的虚拟机 → 在对端节点上冷启动 → 发送免费 ARP 通告以完成 IP 地址漂移,从而实现高可用(HA)故障转移。

四、存储锁与磁盘心跳:网络的备用仲裁者

  • 主要场景:使用共享 SAN 或 LUN 存储时。
  • 内容示例
    SCSI reservation: PR OUT—Register & Reserve
    scsi_res: key=0x1234, owner=nodeA
  • 核心作用
    1. 节点向共享磁盘注册一个“持久化保留”(Persistent Reservation)密钥,防止多个节点同时写入同一块磁盘,确保数据安全。
    2. 当网络心跳完全失效时,节点会转而读写磁盘上的特定扇区,通过这种“磁盘心跳”继续交换存活信号。
    3. 如果网络心跳和磁盘心跳全部中断,那么持有更多磁盘锁(或特定类型锁)的节点将赢得资源的启动权,而另一个节点则会通过自我隔离(fence)机制退出,这是避免脑裂的第二重保险,深刻体现了集群高可用设计的严密性。

五、SSH 密钥与文件复制:建立初始信任关系

  • 触发条件:仅在新节点加入集群时执行一次。
  • 内容示例
    ssh-rsa AAAAB3NzaC1yc2E... root@nodeA
    rsync /etc/pve/* root@nodeB:/etc/pve/
  • 核心作用
    1. 将本机的 SSH 公钥写入对端节点的 /etc/pve/priv/authorized_keys 文件中,实现节点间基于密钥的无密码互信登录。这为后续的冷迁移、快照操作和备份任务做好了准备。
    2. 首次加入时,通过 rsync 全量同步一次配置数据库,确保双方起点一致。此后的所有配置变更都将通过 pmxcfs 的实时事务机制同步,不再依赖 SSH。

一张图总结五种信息流

┌--------------┐        1.心跳/选票       ┌--------------┐
│   PVE-nodeA  │<----------------------->│   PVE-nodeB  │
└------┬-------┘                         └------┬-------┘
       │ 2.配置事务(diff+ack)                    │
       │<----------------------------------------->│
       │ 3.资源状态/HA评分                        │
       │<----------------------------------------->│
       │ 4.存储锁/磁盘心跳(共享LUN)               │
       │<----------------------------------------->│
       │ 5.SSH密钥&rsync(仅首次)               │
       │<----------------------------------------->│

结语

两台 PVE 服务器成功组建集群后,便会通过上述“心跳-配置-资源-存储-身份”五条通道展开持续对话。这套对话的核心逻辑可以概括为:“确认存活” → “同步配置” → “调度资源” → “仲裁磁盘” → “建立互信”。

凭借法定人数(quorum)机制与磁盘心跳的双重仲裁,这套设计即使在仅有两节点的、理论上最脆弱的网络环境中,也能严格保证“挂掉一台不乱写数据,全部挂掉不双开服务”的底线。这种稳固的基础通信层,为 PVE 集群实现在线迁移、高可用故障转移以及后续的横向扩展奠定了坚实根基。对这类底层机制的理解,能帮助运维人员更精准地排查集群问题,欢迎在云栈社区交流更多虚拟化与集群管理的实践经验。




上一篇:深入解析Go方法集合:接口实现的底层逻辑与实战
下一篇:强化学习Reward Hacking详解:模型为何钻奖励漏洞而非学会目标
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-31 01:59 , Processed in 0.272770 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表