Linux 高可用与集群架构实战

1次阅读

判断 pacemaker + corosync 集群真正“在线”,需执行 crm status –full 并比对 corosync-quorumtool -s 输出是否一致,同时用 pcs Resource show –full 检查 failed/block 状态,并通过 journalctl -u pacemaker 查看 pacemaker-controld/attrd 错误日志。

Linux 高可用与集群架构实战

怎么判断 Pacemaker + Corosync 集群真正“在线”而不是假活

集群节点显示 online 不代表服务可用,常见假活是 Corosync 通信正常、Pacemaker 进程在跑,但资源代理(如 ocf:heartbeat:IPaddr2)已崩溃或被反复重启。

实操建议:

  • 别只看 crm status,必须加 --full 参数:运行 crm status --full,重点检查 Online: 后面的节点列表是否和 corosync-quorumtool -s 输出一致;不一致说明 Pacemaker 没同步到最新法定人数状态
  • 查资源真实状态用 pcs resource show --full,注意 failedblocked 状态——后者常因约束冲突或依赖未就绪导致,不是资源本身出错
  • 检查日志不能只翻 /var/log/cluster/corosync.log,要同步 grep pacemaker-controldattrd 进程输出:journalctl -u pacemaker --since "5 minutes ago" | grep -E "(Error|warn|fail)"

DRBD 主从切换后 NFS 共享挂载失败的典型原因

DRBD 切换后 mount.nfsStale file handle 或直接超时,多数不是网络问题,而是 NFS server 端没正确重载导出表或内核 NFS 模块状态残留。

实操建议:

  • DRBD 切换完成后,必须手动触发 exportfs -ra,再检查 cat /var/lib/nfs/etab 是否包含新主节点的实际 IP 和路径;旧 IP 条目残留会导致客户端反复尝试错误地址
  • 如果用了 nohide 或嵌套导出,确保 /etc/exports 中每个子目录都显式声明了 fsid=,否则 NFSv4 客户端可能无法重建文件句柄
  • 避免在 DRBD 资源里直接启动 nfs-server 服务,改用 ocf:heartbeat:nfsnotify 代理——它会在导出更新后主动通知内核清理 stale handle 缓存

Keepalived + lvs 实战中 realserver 健康检查总失败的排查点

Keepalived 的 HTTP_GETTCP_CHECK 显示 realserver “DOWN”,但 curl 或 telnet 手动测试完全正常,问题往往出在检查逻辑与实际服务监听行为不匹配。

实操建议:

  • 确认 realserver 上监听的是 0.0.0.0:port 而非 127.0.0.1:port——Keepalived 健康检查走的是 VIP 所在网卡的本地路由,不会命中 loopback
  • 若用 HTTP_GET,检查返回码是否为 200:nginx 默认 404 页面也返回 404,但 Keepalived 默认只认 200;需加 status_code 200 404 显式允许
  • 不要在 realserver 上开防火墙(如 ufwiptables)却只放行业务端口,健康检查端口(默认同业务端口)也必须放行;更稳妥的做法是用 ipset 白名单只允许可信 director IP

etcd 集群跨机房部署时 leader 频繁变更的底层诱因

三个节点分别在 A/B/C 机房,网络延迟波动稍大(比如跨城专线偶尔 >100ms),etcd 就频繁换 leader,不是配置太激进,而是心跳与选举超时参数没按 RTT 校准。

实操建议:

  • ETCD_HEARTBEAT_INTERVAL 必须 ≥ 2× 实测最大 RTT(单位 ms),ETCD_ELECTION_TIMEOUT 必须 ≥ 5× 最大 RTT;例如 RTT 峰值 80ms,则至少设为 160400
  • 禁用 ETCD_AUTO_COMPACTION_RETENTION 自动压缩,改用定时 etcdctl compact + etcdctl defrag 组合——自动压缩会阻塞 Raft 日志写入,放大网络抖动影响
  • 跨机房 etcd 节点间务必用 --initial-advertise-peer-urls 指向对方公网/专线 IP,别用 hostname 或内网 DNS;DNS 解析失败或缓存过期会直接导致 peer 连接中断

集群里最麻烦的从来不是单点故障,而是半同步状态下的状态不一致——比如 Corosync 成员视图分裂后 Pacemaker 还在发 fencing 指令,或者 etcd quorum 残留旧 term 但新 leader 已提交数据。这些边界情况不会报错,只会让日志里出现看似无关的 warning,得盯住 quorumtermin_quorum 这类关键词。

text=ZqhQzanResources