高可用集群频繁抖动、主备反复切换,本质是健康判断失准或状态同步不稳定,需从“谁在决定切”“依据什么切”“切完发生了什么”三层排查,重点检查心跳与健康探针可靠性、超时参数合理性、数据同步链路持续性及资源水位隐性瓶颈。

高可用集群频繁抖动、主备反复切换,本质是健康判断失准或状态同步不稳定。不是系统“太敏感”,而是故障检测、决策逻辑、资源反馈三者之间出现了错位。排查要从“谁在决定切”、“依据什么切”、“切完发生了什么”三层入手,而不是一上来就查日志或重启服务。
看心跳和健康检查是否被干扰
频繁切换的第一信号,往往是探测机制本身不可靠。Corosync、etcd、MGR 或自研 HA 组件都依赖周期性心跳和健康探针,一旦网络抖动、CPU 短时打满、磁盘 I/O 阻塞,就可能误报节点失联。
- 检查节点间实际延迟:用
ping -c 10 node-b和tcping -x 10 node-b 5432(或对应端口)对比 ICMP 与业务端口响应差异,确认是网络层问题还是服务层卡顿 - 核对超时参数是否过激:比如 Corosync 的
token(默认 1000ms)、join超时、Pacemaker 的monitor interval是否小于实际服务响应波动范围 - 确认监控探针是否真实反映业务可用性:例如只检查 PostgreSQL 进程是否存在,却不校验
pg_is_in_recovery()或连接池连通性,会导致备库明明不可读却被判为“健康”
查日志里每一次切换的触发原因
每次主备切换都会在 HA 组件日志中留下明确决策痕迹。重点不是“切了”,而是“为什么切”。关键字段包括:reason、failed action、quorum loss、node fencing。
- 在 Pacemaker 日志中搜
Transition Summary和Failed actions,看是否某资源(如 VIP、数据库服务)反复 start/stop 失败 - 在 KingbaseES 或 PostgreSQL 流复制日志中查
replication connection terminated或WAL receiver process exited,确认是 WAL 同步中断引发的级联降级 - 在 etcd 日志中找
failed to send out heartbeat on time或snapshot save failed,判断是否因磁盘慢导致 leader 频繁让位
验数据同步链路是否持续可靠
主备能切,不等于能稳住。很多抖动源于“切过去了,但数据没跟上”,新主库立刻承接流量后因同步延迟、锁冲突或 WAL 积压而迅速卡死,触发下一轮故障检测失败。
- Redis:用
info replication查master_last_io_seconds_ago和repl_backlog_active,确认从库是否长期处于“假同步”状态 - KingbaseES/PostgreSQL:查
pg_stat_replication中write_lag、flush_lag、replay_lag,若 replay_lag 持续 >1s,说明从库回放跟不上,切主后极易出问题 - HDFS QJM:检查 JournalNode 日志是否有
QuorumOutOfSyncException或大量edit log gap,表明元数据同步已断裂,NameNode 切换后无法保证视图一致
盯住资源水位和隐性依赖
很多抖动背后没有报错,只有“慢”——慢到探测超时、慢到 WAL 写不进磁盘、慢到心跳包发不出去。这类问题不会直接写“fail”,但会不断拉低健康分。
- 用
iostat -x 1 5观察 %util 和 await,确认磁盘是否持续饱和(尤其 WAL 日志盘) - 查
free -h和cat /proc/meminfo | grep -i oom,避免因内存不足触发 OOM killer 杀掉 WAL sender 或 HA agent - 检查配置中心、DNS、NTP 是否单点:比如所有节点依赖一个未做高可用的 Consul 实例,它抖一下,整个集群的配置感知就乱套

















