今天大集群服务宕机,告警信息显示,时钟不同步引发。
时间同步是系统运行必不可少的重要因素,尤其是集群类的系统,更是要求集群内节点时间一致,时间有差距,则会导致服务或进程运行异常。
目前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。注意避开域控。
MaxNegPhaseCorrection和MaxPosPhaseCorrection建议改成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的值,末尾的0x1或0x9,默认的是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 /force和restart-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 /source和w32tm /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