ceph集群时间同步是硬性要求,所有节点偏差必须控制在±50ms内;必须使用chronyd而非ntpd或systemd-timesyncd,因其支持快速校正、漂移补偿和断网重试;需构建内网两级ntp架构,并在bootstrap前执行chronyc makestep强制校准。

虚拟化环境中部署 Ceph,时间不同步会导致 OSD 状态抖动、PG 不一致、MGR 服务异常,甚至引发数据丢失。必须让所有节点(包括 MON、MGR、OSD、client)与同一高精度时间源保持 ±50ms 以内偏差——这不是“建议”,是 Ceph 官方硬性要求。
为什么不能只用默认 NTP 或 systemd-timesyncd
Ceph 节点多为虚拟机或容器宿主机,网络延迟波动大、可能休眠、时钟漂移快。默认的 systemd-timesyncd 是 SNTP 客户端,无频率补偿能力;传统 ntpd 启动慢、对大偏差响应迟钝,且在虚拟化中易受 host clock skew 影响。实测中,ntpd 在 VM 克隆后首次启动常需 15 分钟以上才能收敛到 ±100ms,而 Ceph bootstrap 阶段就可能失败。
必须用 chronyd,它支持:
– 快速初始同步(makestep 可秒级校正数分钟偏差)
– 持续补偿硬件时钟漂移(driftfile 记录长期偏移率)
– 对间歇性网络断连有重试和缓存机制
– 与 Cephadm 的 systemd 服务生命周期天然兼容
配置 chrony 作为全局时钟源(含内网层级)
直接让所有 Ceph 节点连公网 NTP 服务器风险高(策略限制、DNS 不稳、丢包率高)。应构建两级结构:
- 选 1–2 台物理机或高可用虚拟机作为内网
stratum 2时间源,它们同步公网权威源(如time1.tencentyun.com、ntp.aliyun.com) - 所有 Ceph 节点(含 cephadm 管理节点)只指向这台内网源,不直连公网
内网源配置关键项(/etc/chrony.conf):
server time1.tencentyun.com iburst minpoll 4 maxpoll 6 server ntp.aliyun.com iburst minpoll 4 maxpoll 6 allow 192.168.10.0/24 # 替换为你的 Ceph 管理/集群网络段 bindcmdaddress 127.0.0.1 bindcmdaddress ::1
客户端节点(所有 Ceph 节点)配置只需保留一行:
server 192.168.10.10 iburst # 内网时间源 IP
务必禁用其他时间服务:
sudo systemctl stop ntpd && sudo systemctl disable ntpdsudo systemctl stop systemd-timesyncd && sudo systemctl disable systemd-timesyncd
cephadm 部署前必须完成的强制校准步骤
Cephadm bootstrap 过程会检查本地时间,若偏差 > 0.5s 直接报错退出,错误信息类似:RuntimeError: Clock skew detected。不能依赖 chronyd 后台自动收敛。
在运行 cephadm bootstrap 前,每台节点必须执行:
- 确保
chronyd已启动:sudo systemctl enable --now chronyd - 立即强制校准(跳过平滑调整):
sudo chronyc makestep—— 这条命令只有在makestep配置允许大步长时才生效,因此需提前在/etc/chrony.conf加入:makestep 1 -1 - 验证结果:
chronyc tracking | grep "Offset\|Skew",确认Offset50ms,Skew1000 ppm - 同步硬件时钟(避免重启后回退):
sudo hwclock --systohc
注意:chronyc makestep 默认只对 >1s 偏差生效,makestep 1 -1 表示“对任意大于 1 秒的偏差都允许跳跃式校正”,这是 Ceph 场景必需的配置。
验证与持续监控要点
Ceph 集群上线后,时间一致性不是“一劳永逸”。需定期检查:
- 用
ceph status查看是否有CLOCK_SKEWhealth warning - 登录各节点执行:
chronyc sources -v(确认有 * 标记的活动源)、chronyc tracking(关注 Offset 和 Last offset) - 在管理节点上批量检查:
ceph orch host ls --format json-pretty | jq -r '.[].hostname' | xargs -I{} ssh {} 'chronyc tracking | head -3'
最容易被忽略的是:Ceph OSD 进程启动时读取一次系统时间,之后不主动刷新;如果 chronyd 后期因网络中断失联超过数小时,OSD 内部计时可能已漂移,但 ceph -s 不报警。必须依赖外部巡检,而非仅信 ceph health。











