技术博客

Proxmox VE 高可用集群:HA Manager、节点 Fencing、VIP 漂移实战

详解 Proxmox VE 高可用集群的构建与运维:Corosync 集群通信配置、HA Manager 自动故障转移原理、节点 Fencing(STONITH)防止脑裂、LVM-thin/Ceph 共享存储集成、HA 资源配置与优先级管理,覆盖节点宕机时的自动恢复流程。

ProxmoxHA高可用CorosyncFencing集群虚拟化

Proxmox VE 内置高可用(HA)集群能力:当某台节点宕机时,运行在该节点上的虚拟机自动迁移到其他节点恢复运行。实现这个能力需要三个核心组件:Corosync(集群通信/心跳)、HA Manager(故障检测与编排)、Fencing(隔离故障节点防止脑裂)。

HA 集群架构

3 节点 Proxmox HA 集群(最小配置)

      [节点1 - pve1]        [节点2 - pve2]        [节点3 - pve3]
      VM 101, 102            VM 103, 104            VM 105
           │                      │                      │
           └──────────────────────┴──────────────────────┘
                          Corosync 心跳网络
                          (建议专用网段)
           │                      │                      │
           └──────────────────────┴──────────────────────┘
                          共享存储(Ceph / SAN / NFS)

节点1 宕机时:
  HA Manager 检测到节点1 心跳超时
  执行 Fencing(IPMI 关机/重启节点1)
  等待 Fencing 确认后
  在节点2/3 上启动 VM 101, 102
  整个过程约 60-120 秒

一、集群初始化

创建集群(在第一个节点)

# 在 pve1 上创建集群
pvecm create my-cluster

# 查看集群状态
pvecm status
# Quorum information
# ------------------
# Date:             Wed Jul 22 09:00:00 2026
# Quorum provider:  corosync_votequorum
# Nodes:            1
# Node votes:       1
# Expected votes:   1
# Total votes:      1
# Quorum:           1 (Activity blocked if below)
# Active nodes:     1
# Votes needed for quorum: 1

加入集群(在其他节点)

# 在 pve2 和 pve3 上执行
pvecm add pve1          # 加入 pve1 所在的集群
# 需要输入 pve1 的 root 密码(用于传输集群密钥)

# 加入后验证
pvecm nodes
# Nodeid  Votes  Quorum  Name      State
# 1       1      1       pve1      Online
# 2       1      0       pve2      Online
# 3       1      0       pve3      Online

Corosync 网络配置(双网卡冗余)

# 查看 Corosync 配置
cat /etc/corosync/corosync.conf

# 生产推荐:配置两个心跳接口(防止单网卡故障导致假脑裂)
# 编辑 /etc/corosync/corosync.conf

totem {
  version: 2
  cluster_name: my-cluster
  transport: knet

  interface {
    linknumber: 0
    knet_link_priority: 1      # 主心跳
  }

  interface {
    linknumber: 1
    knet_link_priority: 2      # 备用心跳
  }
}

nodelist {
  node {
    name: pve1
    nodeid: 1
    ring0_addr: 192.168.1.101   # 主心跳 IP
    ring1_addr: 10.0.0.101      # 备用心跳 IP(管理网络)
  }
  node {
    name: pve2
    nodeid: 2
    ring0_addr: 192.168.1.102
    ring1_addr: 10.0.0.102
  }
  node {
    name: pve3
    nodeid: 3
    ring0_addr: 192.168.1.103
    ring1_addr: 10.0.0.103
  }
}

quorum {
  provider: corosync_votequorum
}

# 修改后重启
systemctl restart corosync
pvecm status

二、Fencing 配置(关键!防止脑裂)

Fencing(也叫 STONITH,Shoot The Other Node In The Head)是 HA 的必要条件:当检测到节点故障时,必须先确认该节点已被隔离(关机/重启),才能在其他节点启动它的 VM,否则两个节点同时运行同一 VM 会导致数据损坏。

IPMI/DRAC Fencing(物理服务器推荐)

# 在 Proxmox Web UI 中配置:
# Datacenter → HA → Fencing Devices

# 或通过命令行(使用 pvesh)
pvesh create /cluster/ha/fence \
  --type pve-fence-hardware \
  --hardware-pve-node pve1 \
  --hardware-method ipmi \
  --hardware-address 192.168.1.201 \  # IPMI/DRAC IP
  --hardware-user admin \
  --hardware-password secret

# 验证 Fencing 设备
pvesh get /cluster/ha/fence

配置 HA 模拟 Fencing(无硬件管理口的测试环境)

# 使用 pve-fence-plugin(Proxmox 自带软件 Fencing)
# 仅适合所有节点都能通过 API 互相访问的场景

# 在每个节点安装 watchdog
apt install pve-kernel-helper
modprobe softdog

# 配置 watchdog
echo "softdog" >> /etc/modules-load.d/modules.conf
cat > /etc/pve/watchdog.conf << 'EOF'
WATCHDOG_MODULE=softdog
EOF

systemctl restart pve-ha-lrm

验证 Fencing 工作

# 模拟节点故障(注意:这会真的关掉节点!)
# 先确认 HA 资源已配置

# 查看 HA 状态
ha-manager status

# 临时暂停一个节点的心跳(测试用)
# 在 pve2 上:
systemctl stop corosync

# 观察 pve1 日志
journalctl -u pve-ha-crm -f

# 预期行为:
# pve2 心跳超时(默认 20s)
# HA CRM 等待 Fencing 完成
# pve2 上的 VM 在 pve1/pve3 上重启

三、HA 资源配置

添加 VM 到 HA

# Web UI:VM → More → Manage HA
# 或命令行:

# 添加 VM 101 到 HA 管理
ha-manager add vm:101

# 设置 HA 优先级和偏好节点
ha-manager set vm:101 \
  --state started \               # 期望状态:started/stopped/disabled
  --max_restart 3 \               # 同一节点最多重启次数
  --max_relocate 1 \              # 迁移到其他节点的次数限制
  --group ha-group-a              # HA 资源组

# 查看 HA 资源列表
ha-manager status
# quorum OK
# master pve1 (pve1.my-cluster)
# lrm pve1: active
# lrm pve2: active
# lrm pve3: active
# 
# Resources:
#   vm:101 (VM 101) = started
#     node: pve1
#   vm:102 (VM 102) = started
#     node: pve2

HA 资源组(控制 VM 运行偏好节点)

# 创建 HA 资源组
# Web UI:Datacenter → HA → Groups → Add
# 或:
pvesh create /cluster/ha/groups \
  --group ha-group-a \
  --nodes "pve1:3,pve2:2,pve3:1" \  # 格式:节点名:优先级(数字越大越优先)
  --nofailback 0                     # 原节点恢复后是否自动迁移回去(0=是)

# 将 VM 分配到资源组
ha-manager set vm:101 --group ha-group-a

四、共享存储集成

HA 必须使用共享存储(故障转移后新节点需要能访问 VM 磁盘)。

Ceph 集成(推荐)

# Proxmox 内置 Ceph 管理
# Web UI → Datacenter → Ceph

# 安装 Ceph(在所有节点)
pveceph install --version reef    # Ceph Reef (18.x)

# 初始化(在第一个节点)
pveceph init --network 10.0.1.0/24  # Ceph 专用网络

# 创建 Monitor(每个节点一个)
pveceph createmon                   # 在当前节点创建 Mon
ssh pve2 'pveceph createmon'
ssh pve3 'pveceph createmon'

# 添加 OSD(每个磁盘一个 OSD)
pveceph createosd /dev/sdb          # 专用磁盘给 Ceph,会被格式化
pveceph createosd /dev/sdc

# 创建 Pool(存放 VM 镜像)
pveceph createpool vm-pool \
  --size 3 \                        # 副本数
  --pg_autoscale_mode on

# 创建 RBD 存储
pvesh create /storage \
  --storage ceph-vm \
  --type rbd \
  --pool vm-pool \
  --monhost "pve1,pve2,pve3" \
  --content images,rootdir

# 验证
pvesh get /storage
ceph status
# cluster:
#   id:  xxxxx
#   health: HEALTH_OK
# services:
#   mon: 3 daemons, quorum pve1,pve2,pve3
#   osd: 6 osds: 6 up, 6 in
# data:
#   pools: 1 pools, 128 pgs

五、HA 故障场景演练

场景:节点意外宕机

# 模拟 pve2 突然宕机(在 pve2 上执行)
echo c > /proc/sysrq-trigger   # 触发 kernel panic

# 在 pve1 上观察 HA 日志
journalctl -u pve-ha-crm -f --since "1 min ago"
# ha-manager: Got heartbeat timeout from node pve2 at ...
# ha-manager: Starting fencing process for node pve2
# ha-manager: Fencing of pve2 done
# ha-manager: Relocating vm:103 to pve1
# ha-manager: Started vm:103 on pve1
# ha-manager: Relocating vm:104 to pve3
# ha-manager: Started vm:104 on pve3

# 整个过程时间线(典型值):
# 0s   - 心跳超时检测开始
# 20s  - 确认节点下线(Fencing 开始)
# 40s  - Fencing 完成(IPMI 关机确认)
# 60s  - 在其他节点启动 VM
# 90s  - VM 全部恢复运行

场景:手动维护节点

# 优雅维护:先迁移所有 VM,再停节点
# 在 pve2 上执行
ha-manager crm-command node-maintenance --node pve2

# 或通过 Web UI:Datacenter → HA → Status → 对应节点右键 → Maintenance Mode

# 维护完成后恢复
ha-manager crm-command node-maintenance-leave --node pve2

六、监控与告警

# 实时 HA 状态
watch -n 5 'ha-manager status'

# 查看 HA 日志
journalctl -u pve-ha-crm -u pve-ha-lrm --since "1 hour ago"

# Corosync 网络状态
corosync-quorumtool -s
# Quorum information
# ------------------
# Quorum:         1 (Activity blocked if below)
# Flags:          Quorate

# 集群节点状态
pvecm nodes
pvecm status

# Proxmox 内置告警(7.x+)
# Web UI → Datacenter → Notifications
# 配置 HA 节点故障邮件告警:
pvesh create /cluster/notifications/endpoints/sendmail \
  --name email-admin \
  --mailto "admin@company.com" \
  --mailto-user root@pam

小结

Proxmox HA 集群的三个核心是:Corosync 提供心跳检测和仲裁(>=3 节点才有仲裁能力);Fencing 是数据安全的保障(没有 Fencing 的 HA 等于没有 HA,因为会脑裂);共享存储 是 VM 能在任意节点启动的前提(Ceph 是 Proxmox 官方推荐方案)。生产配置关键点:心跳网络要与业务网络分离(专用心跳链路);Fencing 必须配置(IPMI/DRAC 是最可靠的方式);HA 资源组设置节点优先级(控制 VM 在哪个节点优先运行)。