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

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.10 或 0.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 定义服务资源(比如 apache 或 pgsql)后,如果没显式声明 required-providers,Pacemaker 可能误判依赖关系,在节点切换或监控失败时反复 stop/start,日志里出现大量 operation monitor failed 和 transition 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 操作(比如卡在 start 的 pgsql)。此时 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=60s和fencing(如stonith-enabled=true+ssh或ipmilan)防止双主 - 检查
corosync-quorumtool -s输出中的Quorate字段,别只信pcs status顶部那行 “Cluster Summary”
真正麻烦的从来不是配置写几行,而是某个 bindnetaddr 算错一位、某次 cleanup 没看清 pending 状态、或者把 ignore 当成银弹用在了不该用的地方。










