时钟同步在分布式系统中起到至关重要的作用,我们需要确保集群服务器中时钟是一致的,避免时钟偏差导致接口token校验以及其他需要用到时间校验的地方出现问题。
安装chronyc
yum install chrony
编辑chrony配置文件,添加或修改 NTP 服务器配置。可以添加多个 NTP 服务器地址,这样在某个服务器不可用时可以使用其他的服务器。
vi /etc/chrony/chrony.conf
server 10.111.32.145 iburst
server 10.111.32.146 iburst
initstepslew 3 10.111.32.145
initstepslew 3 10.111.32.146
driftfile /var/lib/chrony/drift
makestep 1 -1
#maxchange 999999 5 -1
#rtcsync
#hwclockfile /etc/adjtime
rtcfile /var/lib/chrony/rtc
rtconutc
rtcautotrim 1
logdir /var/log/chrony
log measurements statistics tracking rtc
-
server 10.111.32.145 iburst
:server 10.111.32.145
:指定 NTP 服务器的 IP 地址,chrony
将会从该服务器获取时间同步信息。iburst
:快速初始突发模式(initial burst mode)。当chrony
启动或在与服务器失去连接后重新连接时,它会发送一组快速的 NTP 请求(通常是四个请求),以便尽快获得时间同步。这有助于加速首次同步的过程,使系统能够更快地调整到正确的时间。
-
initstepslew 3 10.111.32.145
:initstepslew 3 10.111.32.145
:在启动时强制进行时间同步,允许在启动时最多进行 3 次大的时间调整(step correction),如果系统时间与 NTP 服务器的时间差异太大(通常超过 1 秒)。chrony
会使用10.111.32.145
服务器进行这些调整。initstepslew 3
:表示最多允许 3 次大的时间调整。10.111.32.145
:指定用于这些调整的 NTP 服务器
- makestep
1 -1
意味着任何时间偏差超过 1 秒时,chrony
将立即调整系统时钟,而不会逐渐漂移。
查看当前的轮询间隔和同步状态
chronyc tracking
chronyc sources -v
chronyc tracking
显示系统的同步状态和当前的轮询间隔。
[root@node-1 viper]# chronyc tracking
Reference ID : 0A6F2091 (10.111.32.145)
Stratum : 3
Ref time (UTC) : Thu Aug 08 07:40:43 2024
System time : 0.000000594 seconds fast of NTP time
Last offset : +0.000001099 seconds
RMS offset : 0.000002727 seconds
Frequency : 18.525 ppm fast
Residual freq : +0.024 ppm
Skew : 0.035 ppm
Root delay : 0.000051176 seconds
Root dispersion : 0.000038241 seconds
Update interval : 65.3 seconds
Leap status : Normal
当设置多个 NTP 服务器时,chrony
会根据一系列的算法和条件选择一个最合适的服务器进行时间同步。具体步骤如下:
- 收集数据:
chrony
会从配置文件中定义的所有 NTP 服务器收集时间数据。 - 过滤和选择:
chrony
会评估从各个服务器收集到的数据,过滤掉那些不可靠的或表现不好的服务器。这包括对服务器的响应时间、时间偏差等进行分析。 - 投票算法:经过筛选后的服务器会参与投票,
chrony
使用一种名为“最大频度排序算法”的方法来选择最终的时间源。这个算法会评估每个服务器的时间并选择一个最接近真实时间的服务器。
chrony
会不断监控这些服务器,并在需要时动态调整同步源,以确保系统时间的准确性和稳定性。如果当前的时间源变得不可靠或不可用,chrony
会自动切换到下一个最佳服务器。
[root@node-1 viper]# chronyc sources -v
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current best, '+' = combined, '-' = not combined,
| / 'x' = may be in error, '~' = too variable, '?' = unusable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 10.111.32.145 2 6 17 26 -129ns[ -41ns] +/- 27us
^? 10.111.32.146 0 7 0 - +0ns[ +0ns] +/- 0ns
在 chronyc sources -v
的输出中:
*
表示当前同步的服务器。+
表示备用服务器,表现良好。-
表示服务器可用但未被选择。?
表示服务器不可用。
chrony
动态选择和调整最佳同步服务器,确保系统时间的准确性和稳定性。