首批通过分布式安全可靠测评,为关键业务系统打造
ntpdate 强制快速同步时间
更新时间:2026-06-08 02:41
适用版本
OceanBase 数据库 2.x 和 3.x 版本
问题描述
在一些服务器重启或者集群扩容的场景中,如果遇到时钟偏差比较大可以使用 ntpdate 强制与时钟源进行同步。但是 ntpdate 有一个特性就是当时钟偏差不超过 0.5s(500ms)时默认会调用 adjtime 系统调用进行慢同步;超过 0.5s(500ms)时才会调用 settimeofday 系统调用快速强制同步时间。
OceanBase 数据库对时间要求特别敏感,节点时间差不能超过 100ms,所以遇到时钟差在 100ms-500ms 之间的情况就比较棘手,ntpdate 默认也不能快速同步。
问题原因
ntpdate 的默认行为。ntpdate 通过两种方式进行时间调整。如果 ntpdate 确定时钟误差超过 0.5 秒,它将通过调用系统的 settimeofday() 例程简单地调整时间。如果误差小于 0.5 秒,它将通过调用系统的 adjtime() 例程逐渐调整时间。后一种技术在误差小的情况下更准确且不会造成太大干扰,当通过 cron 每隔一两个小时运行 ntpdate 时,它的效果非常好。
通过 -b 参数可以在启动文件的启动时,使用 settimeofday() 系统调用来强制进行时间步进,而不是使用 adjtime() 系统调用进行渐进调整(默认)。在启动时调用时应使用此选项。
解决方法
在没有拉起 OceanBase 服务之前,可以 ntpdate 指定 -b 参数让 ntpdate 强制调用 settimeofday 系统调用快速同步系统时间。
注意
服务运行期间禁止使用 ntpdate 强制跳变同步时间。
以下例子完美解释了此现象:
大于 500ms 快速同步
``` [root@ocp002 ~]# clockdiff ocp001 . host=ocp001 rtt=750(187)ms/0ms delta=3606ms/3606ms Fri Jul 29 11:31:37 2022 [root@ocp002 ~]# ntpdate -u 100.xxx.x.x 29 Jul 11:31:55 ntpdate[19513]: step time server 100.xxx.x.x offset 3.605313 sec [root@ocp002 ~]# clockdiff ocp001 .. host=ocp001 rtt=562(280)ms/0ms delta=1ms/1ms Fri Jul 29 11:31:58 2022 ```默认 500ms 内慢同步
``` [root@ocp002 ~]# clockdiff ocp001 . host=ocp001 rtt=750(187)ms/0ms delta=383ms/383ms Fri Jul 29 10:57:08 2022 [root@ocp002 ~]# ntpdate -u 100.xxx.x.x 29 Jul 10:57:16 ntpdate[18680]: adjust time server 100.xxx.x.x offset 0.381066 sec [root@ocp002 ~]# clockdiff ocp001 . host=ocp001 rtt=750(187)ms/0ms delta=378ms/378ms Fri Jul 29 10:57:18 2022 [root@ocp002 ~]# clockdiff ocp001 .. host=ocp001 rtt=562(280)ms/0ms delta=376ms/376ms Fri Jul 29 10:57:21 2022 [root@ocp002 ~]# clockdiff ocp001 . host=ocp001 rtt=750(187)ms/0ms delta=375ms/375ms Fri Jul 29 10:57:22 2022 [root@ocp002 ~]# clockdiff ocp001 . host=ocp001 rtt=750(187)ms/0ms delta=375ms/375ms Fri Jul 29 10:57:23 2022 [root@ocp002 ~]# clockdiff ocp001 .. host=ocp001 rtt=562(280)ms/0ms delta=374ms/374ms Fri Jul 29 10:57:25 2022 [root@ocp002 ~]# clockdiff ocp001 . host=ocp001 rtt=750(187)ms/0ms delta=373ms/373ms Fri Jul 29 10:57:27 2022 [root@ocp002 ~]# clockdiff ocp001 . host=ocp001 rtt=750(187)ms/0ms delta=373ms/373ms Fri Jul 29 10:57:28 2022 [root@ocp002 ~]# clockdiff ocp001 . host=ocp001 rtt=750(187)ms/0ms delta=372ms/372ms Fri Jul 29 10:57:29 2022 [root@ocp002 ~]# clockdiff ocp001 . host=ocp001 rtt=750(187)ms/0ms delta=372ms/372ms Fri Jul 29 10:57:30 2022 [root@ocp002 ~]# clockdiff ocp001 . host=ocp001 rtt=750(187)ms/0ms delta=371ms/371ms Fri Jul 29 10:57:31 2022 ```500ms 内快速同步
``` [root@ocp002 ~]# clockdiff ocp001 .. host=ocp001 rtt=562(280)ms/0ms delta=403ms/403ms Fri Jul 29 11:02:56 2022 [root@ocp002 ~]# ntpdate -ub 100.xxx.x.x 29 Jul 11:03:10 ntpdate[18769]: step time server 100.xxx.x.x offset 0.402626 sec [root@ocp002 ~]# clockdiff ocp001 . host=ocp001 rtt=750(187)ms/0ms delta=1ms/1ms Fri Jul 29 11:03:12 2022 ```