Linux Pacemaker + Corosync 集群实战

2次阅读

bindnetaddr需填网卡所在网络地址而非ip,如192.168.5.10/24应写192.168.5.0;漏配required-providers会导致资源反复重启;pcs cleanup不处理pending操作;no-quorum-policy=ignore在生产环境有数据丢失风险。

Linux Pacemaker + Corosync 集群实战

corosync.conf 里 bindnetaddr 写错会导致节点无法握手

集群启动失败、corosync 日志反复报 Error [MAIN ] Can't bind to Interface,大概率是 bindnetaddr 配置和实际网卡子网不匹配。它不是填本机 IP,而是填“该网卡所在网络的网络地址”(比如网卡是 192.168.5.10/24,就得写 192.168.5.0,不是 192.168.5.100.0.0.0)。

实操建议:

  • ip -br a 确认心跳网卡名和 CIDR,再用 ipcalc 或手动计算网络地址(如 10.0.2.15/24 → 10.0.2.0
  • 多个网卡时,bindnetaddr 必须唯一对应心跳网段;别图省事写 0.0.0.0,Corosync 2.x 起已不支持
  • 改完必须在所有节点同步 /etc/corosync/corosync.conf,且用 corosync-cfgtool -s 验证配置语法

crm configure 中 Resource 配置漏掉 required-providers 会触发资源无限重启

primitive 定义服务资源(比如 apachepgsql)后,如果没显式声明 required-providers,Pacemaker 可能误判依赖关系,在节点切换或监控失败时反复 stop/start,日志里出现大量 operation monitor failedtransition aborted

实操建议:

  • 对需要绑定到特定 IP 的服务(如 VIP + Web),必须加 required-providers=ocf:heartbeat:IPaddr2(注意不是 IPaddr
  • postgresql 资源需搭配 required-providers=ocf:heartbeat:pgsqld,否则健康检查永远超时
  • crm configure show 检查生成的 CIB xml,确认 <rsc_defaults></rsc_defaults> 下有 resource-stickiness,避免飘移过于激进

pcs resource cleanup 不清理 pending 状态的资源操作

pcs resource cleanup 只清除历史失败记录和 inhibit 标记,但不会中断正在执行的 pending 操作(比如卡在 startpgsql)。此时 pcs status 显示 Started (unmanaged)Pending,强行 pcs resource disable 可能引发脑裂。

实操建议:

  • 先看 pcs status --full 找出卡住的资源名和节点,再用 pcs resource debug-start <resource> --debug</resource> 观察实时输出
  • 若确认是挂起状态,用 pcs resource unmanage <resource></resource> 临时脱管,人工干预(如清空 pgsql 数据目录锁文件),再 pcs resource manage
  • 别依赖 pcs cluster stop --all 强停——Corosync 进程可能残留,下次 pcs cluster start 会因 quorum 未达成而拒绝启动

quorum 失效后 no-quorum-policy=ignore 不等于高可用

两节点集群设 no-quorum-policy=ignore 是常见做法,但它只让 Pacemaker 继续调度资源,不解决底层通信断裂带来的数据冲突风险。比如主库节点失联后仍接受写入,恢复连接时没做 WAL 同步校验,直接切主就会丢数据。

实操建议:

  • 仅在测试环境或读多写少的无状态服务中用 ignore;生产 PostgreSQL/mysql 集群必须配 qdevice 或奇数节点,禁用 ignore
  • 若真要用 ignore,务必配合 cluster-delay=60sfencing(如 stonith-enabled=true + sshipmilan)防止双主
  • 检查 corosync-quorumtool -s 输出中的 Quorate 字段,别只信 pcs status 顶部那行 “Cluster Summary”

真正麻烦的从来不是配置写几行,而是某个 bindnetaddr 算错一位、某次 cleanup 没看清 pending 状态、或者把 ignore 当成银弹用在了不该用的地方。

text=ZqhQzanResources