今天大集群服务宕机,告警信息显示,时钟不同步引发。

时间同步是系统运行必不可少的重要因素,尤其是集群类的系统,更是要求集群内节点时间一致,时间有差距,则会导致服务或进程运行异常。

目前Liunx系统主流的时间同步软件有ntp和chrony。ntp在系统中集成比较广泛,chrony则是在rhel7.0、CentOS7.2等版本后才替代ntp的。注意:若系统内同时安装了ntp和chrony服务,那么系统每次启动时会默认关闭ntp服务,即使设置了开机启动,所以请确保系统内只安装所需的时间同步服务。

chrony是网络时间协议(NTP)的通用实现,是一个用于计算机系统中时钟同步的服务。chrony结合了NTP和PTP的特点,可以实现更高精确度的时钟同步,在互联网上同步的两台机器之间的典型精度在几毫秒内,在局域网上精度通常为几十微秒。而且chrony的网络适应性和容错性非常强,可以根据网络延迟和抖动等情况自动调整时钟同步策略,在网络不稳定或上级NTP服务器不可用的情况下仍然可以继续提供时钟同步服务。同时chrony还提供了丰富的配置选项,可以根据需求进行灵活的配置,如选择时间同步服务器、对时间同步通信进行加密、调整同步频率以及每次同步的时间跃进值等。

关于时钟服务,我们所有主机上线,交付的是最新的开源组件chrony。查看了所有主机的状态和时间都是正常的,大胆的推测,大数据集群读取的是ntp.conf的文件(有的已配置这个,有的未配置这个版本),导致服务宕机。我们可以把这个服务看作C/S架构,域内配置NTP服务器,也要配置NTP客户端。

试想:如果双方都认同一个标准,就不会出现这个宕机。反过来,基础架构在采用新技术时,应考虑旧的标准的沿用和兼容,防止沟通不到位的情况。

一、现在来捋一下如何配置chrony主机客户端:

rpm -qa |grep chrony

yum install -y chrony

systemctl enable chronyd #配置为开机启动

vim /etc/chrony.conf  #配置时钟源头210.72.145.44 国家授时中心  server 172.16.5.10 iburst prefer 和 server 210.72.145.44 iburst  

systemctl restart chronyd #重启服务

systemctl status chronyd #查看chrony服务状态是否为运行中“active (running)”

chronyc sources -v #查看上级时钟源的状态和时间同步信息

chronyc tracking #查看时间同步状态

chronyc makestep #立即同步

再来看一下如何配置ntp主机客户端:

yum install ntp -y #NTP客户端安装

cat /etc/ntp.conf   //修改位于20行左右的server几行--->修改为:

server 172.16.5.10 iburst

ntpdate 172.16.5.10 #手动刷新时间

systemctl enable ntpd

systemctl start ntpd

systemctl status ntpd

ntpstat #查看状态

watch ntpq -p

systemctl restart ntpd

systemctl status ntpd

此外,硬件BIOS也会有时钟,这个时钟随着纽扣电池的续航会异动,甚至断电后初始化为远古时间,也会引发异常。

hwclock --show #查看硬件的时间


vim /etc/sysconfig/ntpd #修改配置文件方式,ntp服务,默认只会同步系统时间


SYNC_HWCLOCK=yes  #将OS系统时间写入BIOS,与 hwclock -w 效果相同

考虑到安全,系统防火墙ntp服务开放至指定IP;

firewall-cmd --permanent --remove-service=ntp

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.16.5.10 port protocol=udp port=123 accept'

firewall-cmd --reload

到此一般即可正常运作。

下面以/etc/ntp.conf为例,演示一种更为严谨的客户端配置方式:

driftfile /var/lib/ntp/drift

restrict default kod nomodify notrap nopeer noquery

restrict -6 default kod nomodify notrap nopeer noquery

restrict 172.16.5.10 mask 255.255.255.255 nomodify notrap

restrict 172.16.5.10 nomodify notrap

restrict 210.72.145.44 nomodify notrap

restrict 127.0.0.1

restrict ::1

restrict 192.168.7.102 mask 255.255.255.255 nomodify notrap

restrict 0.0.0.0 mask 0.0.0.0 notrust

interface ignore wildcard

interface listen enp2s0

server 172.16.5.10 prefer

server 210.72.145.44 iburst

二、上面讲的客户端的。组织内应自行构建NTP服务端角色,在这里,我用DC域服务器(windowServer2019)作为时钟服务器:

0,域控服务器配置与国家授时中心同步

gpedit.msc -计算机配置-管理模板-系统-Windows时间服务 #这里应该未配置

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers

空白处右键新建“字符串值”,命名为0,值为:210.72.145.44

1,域控服务器设置权威服务器

reg add "HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Config" /v "AnnounceFlags" /t REG_DWORD /d 5 /f

2、 域控服务器启用 NTPServer

reg add "HKLM\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer" /v "Enabled" /t REG_DWORD /d 1 /f

3、域控服务器配置域的组策略,设置时间同步。Default Domain Policy下添加时间同步策略,将会导致域控服务器也获取并执行策略,上面注册表失效,应新建GPO。注意避开域控。

MaxNegPhaseCorrectionMaxPosPhaseCorrection建议改成4294967295 (16进制0xFFFFFFFF)。此值表示服务始终校正时间。

UpdateInterval,建议小于等于100,比如10、5,此参数指定在逐渐校正时钟时,两次校正之间 W32time 等待的时长。进行逐渐校正时,此服务对时钟进行轻微调整,并等待此时长,然后查看是否需要其他调整,直至校正完成。默认值: 100,即100 个 1/100 秒单位,即 1 秒。

PhaseCorrectRate,此参数控制 W32time 校正客户端计算机本地时钟差异的速度,校正目的是与作为准确示例从 NTP 服务器接受的时间示例相匹配。值越小时钟校正速度越慢;值越大时钟校正速度越快。默认值: 7 (标量)。此值不建议小于7,我试过设置1、7、14,设置1的时候,自动校时挺慢的,可能需要等2分钟左右,设置7的时候一般需要等1分钟左右,大部分在1分钟内自动校时,设置14的时候基本都在1分钟内自动校时(平均半分钟左右)。

关于单台机器自身MaxNegPhaseCorrection、MaxPosPhaseCorrection以及UpdateInterval、PhaseCorrectRate的具体情况,执行这几句命令查看

reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config"|findstr PhaseCorrection

reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\Config"|findstr UpdateInterval

reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\Config"|findstr PhaseCorrectRate

请注意,如果是域中的机器,组策略(HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\W32Time\Config)的优先级是高于本地服务(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config),2个路径都得查

例如下图,真正起作用的是组策略里的配置(从域控拉下来的Windows时间服务全局配置很重要)

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\W32Time\Config"|findstr "PhaseCorrection UpdateInterval PhaseCorrectRate"

reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config"|findstr "PhaseCorrection UpdateInterval PhaseCorrectRate"

单机修改这几个参数的话,执行这几句命令,但我们这里说的是在域控上配置组策略,建议在图形界面配置

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\Config" /v MaxNegPhaseCorrection /t reg_dword /d 0xFFFFFFFF /f

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\Config" /v MaxPosPhaseCorrection /t reg_dword /d 0xFFFFFFFF /f

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\Config" /v UpdateInterval /t reg_dword /d 5 /f

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w32time\Config" /v PhaseCorrectRate /t reg_dword /d 14 /f

②域控新建GPO之ntp客户端

注意下图NtpServer的值,末尾的0x10x9,默认的是time.windows.com,0x9,域名改成域控制器的计算机全名(执行sysdm.cpl查看),关于末尾的0x几,参考https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc779560(v=ws.10)?redirectedfrom=MSDN

③不论全局配置,还是NTP客户端配置,配置过程中都有EventLogFlags这个参数,默认值并不一定是3,如果要日志详细些,那就配3

此值是一个位掩码,控制可以记录到事件查看器系统日志中的事件。若此值设置为 0x1,则指示每次检测到时间跳转时 W32time 都将创建一个事件。若此值设置为 0x2,则指示每次更改时间源时 W32time 都将创建一个事件。此值是一个位掩码值,因此将其设置为 0x3 (0x1 与 0x2 的和)时指示同时记录时间跳转和时间源更改。

4、域内成员同步策略(在域成员机上操作)

组策略配好后,先在域控机器上powershell执行restart-service w32time,然后在域成员机上powershell执行gpupdate /forcerestart-service w32time,再然后在域成员机上执行

cmd.exe /c "gpresult /H GPReport.html /f && GPReport.html"

然后点右上侧的"全部显示",然后搜"时间服务",如果能看到下面这3处(全局配置设置、配置 Windows NTP 客户端、启用 Windows NTP 客户端)说明已经配置好了。如果没搜到"时间服务",注意在域控上看下是否忘记执行下图这个动作了,在域控上执行dsa.msc把入域的成员机拉入到新建的组织单位里,然后在成员机上重新执行

gpupdate /force;restart-service w32time;cmd.exe /c "gpresult /H GPReport.html /f && GPReport.html"

5、域内成员验证配置(在域成员机上操作)

gpupdate /force

restart-service w32time

w32tm /query /source (多执行几次确保同步到新的源)

w32tm /query /peers

w32tm /query /status

w32tm /query /configuration

运行timedate.cpl改个错误的时间,然后执行w32tm /query /source (多执行几次确保同步到新的源,如下图),然后执行w32tm /resync /rediscover /nowait 校正时间,执行命令后等几秒应该就能同步,一次不行就多执行几次,或者不用执行w32tm /resync /rediscover /nowait,就耐心等待一两分钟左右就自动校正时间了。

【注意事项】

域成员第一次执行gpupdate /force拉取域控上配置的组策略之前,首先确保域成员执行w32tm /query /sourcew32tm /query /peers的结果唯一包含域控制器全名(域控上执行sysdm.cpl查看),而没有其他地址。

如果执行了一二十次w32tm /query /source,结果一直是Local CMOS CLOCK,执行下这几句命令恢复预设值

net stop w32time

w32tm /unregister

w32tm /register

net start w32time

然后确保跟域控时间相同或很接近,然后再执行gpupdate /force,如果执行报下面的错了,

再次在域控上powershell执行restart-service w32time,然后在域成员机再次执行gpupdate /force,如果还是报这个错,那就在域成员机上执行下面这几句命令,如果还是不行,就重启下机器再试(我自己遇到的各种特殊情况都在这里作说明了,其他特殊情况自求多福自己研究下吧,这篇文档已经很细节了)。

net stop w32time

w32tm /unregister

w32tm /register

sc.exe triggerinfo w32time delete

sc.exe config w32time start=

sc.exe triggerinfo w32time start/networkon stop/networkoff

net start w32time

gpupdate /force

沟通标准和定义标准的一样重要---时钟引起的异常_客户端