必须用ntpd或chronyd平滑同步而禁用ntpdate,因ntpdate跳变校时会直接修改系统时间,导致redis误判gossip心跳超时、节点失联并触发fail或强制failover;ntpd/chronyd渐进校时可将offset控制在±5ms内,避免ttl错乱、脏读及rdb加载异常。

必须用 ntpd 或 chronyd 做平滑同步,禁用 ntpdate;所有节点只认内网一台 NTP Server,不能各自直连公网。
为什么 ntpdate 会触发 Redis 故障
ntpdate 是“跳变校时”——它直接修改系统时间,哪怕只差 200ms,也会让 Redis 认为 Gossip 心跳超时、节点失联,进而触发误判 FAIL? 或强制 CLUSTER FAILOVER。日志里频繁出现 node timeout 或 clock drift 就是典型信号。
-
ntpd/chronyd是“渐进校时”,靠微调晶振频率把偏移慢慢拉回,offset 控制在 ±5ms 内时,Redis 的cluster-node-timeout和 Lua 中的TIME()才不会出错 - 主从间时间差 > 1s 时,
TTL返回值可能为-2(key 已被删)或-1(key 不存在但未删),但从库GET还能取到旧值——这是脏读,不是 bug - RDB 快照加载时,若从库时间快于主库,已过期的 key 会被直接丢弃,导致数据量和过期行为双错乱
内网自建 NTP Server 的关键配置项
选一台稳定节点(比如管理机或主 Redis 节点)当 Server,其他全配成 Client。Server 端 /etc/ntp.conf 必须包含:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
-
server 127.127.1.0+fudge 127.127.1.0 stratum 10:启用本地时钟作为兜底源 -
restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap:放行内网段,restrict default ignore必须注释掉,否则请求全被拒 -
/etc/sysconfig/ntpd里设SYNC_HWCLOCK=yes:防止重启后硬件时钟归零
Client 端只需保留一行:server 192.168.10.100(填 Server IP),删掉所有其他 server 行。
验证是否真同步,别只看 date
date 显示一样 ≠ 时间稳住。真正要看的是协议层状态和 Redis 行为反馈:
- 运行
ntpq -p:输出中带*的 server 行,且offset持续在 ±5ms 内才算可靠 - 执行
ntpq -c rv:关注sys_jitteroffset 波动小、无panic日志 - 查 Redis 日志:搜
FAIL? no、node timeout、clock drift,高频出现说明某节点已漂移 - 交替执行
redis-cli -c -h node1 ping和redis-cli -c -h node2 ping:响应延迟突增常伴随 Gossip 异常,背后大概率是时间不同步
真正麻烦的不是配不配得上,而是配完没人盯 ntpq -p 输出。集群跑一周后,某个节点 offset 悄悄跑到 ±50ms,故障时根本想不到是时间惹的祸。










