ceph报clock skew detected是明确健康风险信号,必须立即处理——monitor间时差超0.05s将导致paxos失准、peering卡住、osd flapping甚至仲裁丢失;应优先部署内网ntp+强制step校时,而非调大mon_clock_drift_allowed参数。

直接结论:Ceph 报 clock skew detected 不是警告,是明确的健康风险信号,必须立即处理——它大概率意味着 Monitor 之间时间差已超 0.05s,Paxos 协议和心跳机制可能开始失准,继续放任会引发 Peering 卡住、OSD Flapping、甚至仲裁丢失。
怎么确认是不是真偏移,而不是误报
别急着改配置或重启服务,先验证偏差值和方向:
- 执行
ceph health detail,看输出里具体哪几个 mon 出现了clock skew X.XXXXXs > max 0.05s,记下节点名和数值(比如mon.1 clock skew 8.37274s) - 登录对应 mon 节点,运行
ntpq -p查看 NTP 同步状态:如果显示state = reject或offset列绝对值持续 > 100ms,说明 NTP 没真正同步上 - 用
chronyc tracking(chrony)或ntpq -c rv(ntpd)比对本地时间与上游源的 offset;再手动在所有 mon 节点上并行执行date -Iseconds,肉眼比对 UTC 时间是否一致 - 注意:
systemctl status chronyd显示 active ≠ 时间已同步,只代表守护进程在跑
为什么改 mon clock drift allowed 是下策
这个参数能压住告警,但不能解决根本问题,反而掩盖更危险的信号:
- 官方默认
0.05s是经过 Paxos 和 Monitor Store Synchronization 压测得出的安全阈值,调高到2或15后,Monitor 可能收不到彼此的 propose 消息,导致 map 更新延迟、PG stuck in peering - 即使你设了
mon clock drift allowed = 2,只要某次心跳时差瞬时超过该值,仍会触发clock skew detected日志,且后续 timecheck 会指数退避(由mon clock drift warn backoff控制),掩盖真实恶化趋势 - 很多线上案例显示:调大该值后集群“看起来正常”,但随后出现
pg stuck inactive或mon quorum lost,回溯发现就是长期 clock skew 导致 monitor map 分发不一致
正确修复路径:NTP 必须跑在内网,且必须强制 step
外部 NTP(如 pool.ntp.org)在 Ceph 场景下基本不可靠,尤其当网络抖动或 DNS 不稳时,chronyd/ntpd 会进入 slewing 模式缓慢纠偏,而 Ceph 需要的是快速、确定性的时间对齐:
- 选一台稳定主机部署内网 NTP server(推荐 chrony +
makestep 1 -1),所有 mon/osd 节点只指向它,禁用任何公网 upstream - 在所有 Ceph 节点的
/etc/chrony.conf中确保包含:makestep 1.0 -1(允许任意偏移量下强制跳变)、rtcsync(同步硬件时钟)、log tracking measurements statistics(便于事后查 drift 曲线) - 执行
chronyc makestep强制立刻跳变(比systemctl restart chronyd更有效),再等 2–3 分钟,观察chronyc tracking的Offset是否稳定在 ±5ms 内 - 最后才重启 mon:
systemctl restart ceph-mon@<mon-id></mon-id>,不要用ceph-deploy全量推配置,避免覆盖已生效的 NTP 设置
容易被忽略的三个细节
修完之后仍可能复发,往往卡在这几个地方:
- 虚拟机场景下,VMware Tools 或 QEMU Guest Agent 的时间同步功能必须关闭,否则会和 chronyd 冲突,造成时间来回拉扯
- 某些云厂商(如 AWS EC2)的
chrony默认启用了canbepoisoned,需在/etc/chrony.conf中显式加nocanbepoison禁用该行为 -
ceph health不会自动清除旧的 clock skew 告警缓存,即使时间已同步,也要等mon_timecheck_skew_interval(默认 30s)之后的下次检查才会更新状态;可手动触发:ceph daemon mon.<id> timecheck</id>











