问题描述
场景1:客户服务器,上面部署的业务系统中含有微信支付功能,一年左右,服务器本地时间就会比北京时间慢五分钟,导致无法支付(微信安全策略)。场景2:客户服务器nacos集群(2.x版本),因为集群各服务器时间不一致,导致集群启动后,客户端一直无法正常访问nacos集群并一直提示双写异常。
问题分析
不考虑网络因素,可能由于以下原因导致:
硬件问题:客户服务器是虚拟化的,不是直接在物理机上使用,物理服务器有稳定的硬件时钟,
但虚拟机没有真正的硬件,它的时钟是模拟的“虚拟硬件时钟”,这个虚拟时钟的精确度依赖于主机CPU分配时间片给虚拟机的方式。如果主机负载很高,虚拟机可能会“错过”时钟中断,导致其内部时钟稍微变慢,产生漂移。
内核的“闰秒忽略”:地球的自转实际上在非常缓慢地变慢(主要受月球潮汐引力影响),这意味着一个“太阳日”正在非常轻微地变长。为了确保UTC时间与太阳日(即太阳在天空中的位置)保持一致,科学家们引入了“闰秒”的概念。在2012年左右,Linux内核开发社区发现,在闰秒发生时,许多应用程序(特别是Java应用)会因为看到时间回退一秒(59 -> 60)而崩溃或出现异常。为了避免这个问题,Linux内核采用了一种称为 “闰秒弥散” 或 “闰秒忽略” 的策略。内核不会直接插入一秒,而是会在接下来的很长一段时间内(甚至可达数小时到一整天),故意让系统时钟每秒走得慢一点点(例如,每1000秒慢几毫秒),慢慢“消化”掉这多出来的一秒,结合原本硬件问题,可能导致时间漂移扩大。
解决办法
引入NTP同步时间
Linux安装
sudo yum -y install ntp
配置时钟服务器
vi /etc/ntp.conf
注释掉如下内容
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
替换为中国时间服务器(更多时钟服务器:https://www.ntppool.org/zh/use.html )
server 0.cn.pool.ntp.org
server 1.cn.pool.ntp.org
server 2.cn.pool.ntp.org
server 3.cn.pool.ntp.org
修改后内容如下:
启动:
systemctl restart ntpd
设置开机自启:
systemctl enable ntpd
注意:大概每隔60S左右会同步一次时间,但使用NTP情况下任然可能由于网络延迟导致时间漂移。