文章目录
环境
系统平台:N/A
版本:4.5
症状
1、集群主节点状态在starting、running之间频繁来回切换;
2、HAC持续输出警告日志:
WARNING: I am the leader but not owner of the lease;
3、etcd 日志持续输出高时钟漂移告警,节点间时钟偏移达 1 分 13 秒;
{"level":"warn","ts":"2026-06-30T15:16:42.510106333+0800","caller":"rafthttp/probing_status.go:82","msg":"prober found high clock drift","round-tripper-name":"ROUND_TRIPPER_SNAPSHOT","remote-peer-id":"de112373a298a62","clock-drift":"1m13.697308085s","rtt":"481.862µs"}
4、配置时钟同步后,etcd日志正常,HAC集群日志依然报错,集群主节点状态依然在starting、running之间频繁来回切换
问题原因
1、集群各节点系统时钟存在 73 秒大幅漂移,etcd 依赖时间做租约有效期、Raft 集群状态判定,时差导致租约逻辑错乱;
2、主节点本地进程判定自身是集群 Leader,但 etcd 集群因时间差判定主节点租约已过期,锁失效,HAC持续输出租约丢失告警;
3、HAC检测到租约丢失,判定集群状态异常,主动下发指令重启 HGDB 数据库,数据库启动阶段显示starting,启动完成短暂变为running,循环往复;
4、仅配置时钟同步只能修复后续时间偏差,无法清除时差错乱遗留的 etcd 持久化脏数据(过期租约、冲突集群元数据),因此同步时间后告警、节点切换故障依旧存在。
解决方案
1、全节点完成 chrony/NTP 时钟同步校准,消除节点间时钟偏移;
2、各节点停止 HAC 集群、停止 etcd 服务;
sql
#确定集群主备状态
hghactl -c /usr/local/hghac/hghac.yml list
#按照先备后主的顺序关闭hghac服务
systemctl stop hghac.service
#停止所有节点上的etcd服务
systemctl stop etcd.service
3、备份原有 etcd 数据目录,清空 etcd 持久化存储目录
#所有节点备份原来的etcd data目录 (存储路径为etcd.yml中data-dir配置,依据实际配置备份)
mv /usr/local/hghac/etcd/data /usr/local/hghac/etcd/data.bak
4、依次启动 etcd 服务、HAC 集群,由 HAC重新向干净的 etcd 写入元数据
sql
#启动所有节点的etcd服务
systemclt start etcd.service
#检查etcd集群状态
etcdctl endpoint health --write-out=table
按照先主后备的顺序启动hac集群
#启动hghac服务
systemctl start hghac.service
#确定集群主备状态
hghactl -c /usr/local/hghac/hghac.yml list
5、观察日志不再输出租约丢失告警,主节点稳定保持running状态,故障修复。