集群时钟同步问题
# 1、Linux 集群时钟不同步导致的问题
时钟此处指服务器时间,如果集群中各个服务器时钟不⼀致势必导致⼀系列问题,试想 “集群是各个服务器⼀起团队化作战,⼤家工作都不在⼀个点上,岂不乱了套!”
举⼀个例⼦,电商网站业务中,新增⼀条订单,那么势必会在订单表中增加了⼀条记录,该条记录中应该会有“下单时间”这样的字段,往往我们会在程序中获取当前系统时间插入到数据库或者直接从数据库服务器获取时间。那我们的订单⼦系统是集群化部署,或者我们的数据库也是分库分表的集群化部署,然⽽他们的系统时钟缺不⼀致,⽐如有⼀台服务器的时间是昨天,那么这个时候下单时间就成了昨天,那我们的数据将会混乱!如下
# 2、集群时钟同步配置
集群时钟同步思路
分布式集群中各个服务器节点都可以连接互联网
场景一:各个节点都可以访问互联网,各自同步国家授时中心/时间服务器
操作方式:
#使⽤ ntpdate 网络时间同步命令 ntpdate -u ntp.api.bz #从⼀个时间服务器同步时间
1
2windows 有计划任务
Linux 也有定时任务,crond,可以使⽤ linux 的定时任务,每隔 10 分钟执行⼀次 ntpdate 命令
分布式集群中某⼀个服务器节点可以访问互联网或者所有节点都不能够访问互联网
场景二和场景三:把 node1 作为局域网内的时间服务器,其他服务器从 node1 上同步时间
操作方式:
1)选取集群中的⼀个服务器节点 A(172.17.0.17)作为时间服务器(整个集群时间从这台服务器同步,如果这台服务器能够访问互联网,可以让这台服务器和网络时间保持同步,如果不能就⼿动设置⼀个时间)
- ⾸先设置好 A 的时间
- 把 A 配置为时间服务器(修改/etc/ntp.conf 文件)
1、如果有 restrict default ignore,注释掉它
2、添加如下⼏行内容
restrict 172.17.0.0 mask 255.255.255.0 nomodify notrap # 放开局域网同步功能,172.17.0.0是你的局域网网段
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
3、重启⽣效并配置ntpd服务开机⾃启动
service ntpd restart
chkconfig ntpd on
2
3
4
5
6
7
8
集群中其他节点就可以从 A 服务器同步时间了
ntpdate 172.17.0.17
1
# 3. 使用 Chronyd 同步时间
Chrony 是网络时间协议(NTP)的一种实现,是一个类 Unix 系统上 NTP 客户端和服务器的替代品。Chrony 客户端可以与 NTP servers 同步系统时间,也可以与参考时钟(例如:GPS 接受设备)进行同步,还与手动输入的时间进行同步。同样 Chrony 也可以作为一个 NTPv4(RFC 5905) server 为其他计算机提供时间同步服务。 Chrony 可以更快的同步系统时钟,具有更好的时钟准确度,并且它对于那些不是一直在线的系统很有帮助。Chrony 在 Internet 上同步的两台机器之间的典型精度在几毫秒内,而在 LAN 上的机器之间的精度在几十微秒内。chronyd 更小、更节能,它占用更少的内存且仅当需要时它才唤醒 CPU。即使网络拥塞较长时间,它也能很好地运行。它支持 Linux 上的硬件时间戳,允许在本地网络进行极其准确的同步。Chrony 是自由开源的,并且支持 GNU/Linux 和 BSD 衍生版(比如 FreeBSD、NetBSD)、macOS 和 Solaris 等。
# 3.1 与 ntpd 对比
(1)chronyd 做的比 ntpd 好的 chronyd 可以在时断时续访问参考时间源的环境下工作,而 ntpd 需要定期轮询参考时间源才能正常工作。 即使网络拥塞时间更长,chronyd 也可以运行良好。 chronyd 通常可以更快、更准确地同步时钟。 chronyd 能够快速适应晶体振荡器温度变化引起的时钟频率的突然变化,而 ntpd 可能需要很长时间才能稳定下来。 在默认配置下,为了不影响其他正在运行的程序,chronyd 从不在系统启动同步时钟之后执行时间步进。ntpd 也可以配置为从不步进时间,但它必须使用不同的方法来调整时钟,这有一些缺点,包括对时钟精度的负面影响。 chronyd 可以在更大的范围内调整 Linux 系统上的时钟频率,这使得它甚至可以在时钟损坏或不稳定的机器上运行。例如,在一些虚拟机上。 chronyd 体积更小,占用的内存更少,而且只有在必要的时候才会唤醒 CPU,这对于节能来说是更好的选择。 (2)chronyd 能做的但 ntpd 做不到的 chronyd 提供了对孤立网络的支持,在孤立网络中,时间校正的唯一方法就是手动输入。例如,由管理员查看时钟。chronyd 可以检查在不同的更新中修正的错误,从而估算出计算机增加或减少时间的速度,并在随后使用这个估算来调整计算机时钟。 chronyd 可以计算 RTC 时钟(在计算机关闭时保持时间的时钟)的增益和损耗率。它可以在系统启动时使用这些计算的数据,以及从 RTC 时钟获取的时间调整值来设置系统时间。RTC 时钟设备目前仅在 Linux 系统上可用。 支持 Linux 上的硬件时间戳,允许在本地网络上进行非常精确的同步。 (3)ntpd 做得到但 chronyd 做不到的 ntpd 支持 NTP v4(RFC 5905)的所有同步模式,包括 broadcast、multicast 和 manycast clients and servers 模式。请注意,broadcast 和 multicast 模式(即使有身份验证)与普通 servers and clients 模式相比,更不精确、更不安全,通常应避免使用。 ntpd 支持使用公钥加密的 Autokey 协议(RFC 5906)对服务器进行身份验证。注意,该协议已被证明是不安全的,可能会被 Network Time Security(NTS)取代。 ntpd 包含很多参考时间源的驱动程序,而 chronyd 依赖于其他程序(例如 gpsd),以使用共享内存(SHM)或 Unix domain socket(SOCK)访问参考时间源的数据。 (4)chronyd 与 ntpd,该怎么选 除了由不支持 Chrony 的工具管理或监视的系统,或者具有不能与 Chrony 一起使用的硬件参考时钟的系统之外,其他系统都应该首选 Chrony。 需要使用 Autokey 协议对数据包进行身份验证的系统只能使用 ntpd,因为 chronyd 不支持这个协议。Autokey 协议存在严重的安全问题,应避免使用该协议。使用对称密钥进行身份验证,而不是使用 Autokey,这是 chronyd 和 ntpd 都支持的。Chrony 支持更强的哈希函数,如 SHA256 和 SHA512,而 ntpd 只能使用 MD5 和 SHA1。
# 3.2 服务器端安装
Centos Linux 8.1 默认安装了 chronyd 服务。我们只需要配置即可。
配置文件配置
红色部分是需要服务器配置的,这是基本配置,主要在于实现基本功能。
vi /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
# pool 2.centos.pool.ntp.org iburst
# 同步外部服务器上的时间
server ntp.api.bz iburst
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3
# Enable kernel synchronization of the real-time clock (RTC).
rtcsync
# Allow NTP client access from local network.
# allow 192.168.0.0/16
# 允许哪个网段的客户端同步时间,133这台是服务器。
allow 192.168.94.0/24
# Serve time even if not synchronized to a time source.
# 字面翻译,提供时间即使没有同步一个时间源。
local stratum 10
# Specify file containing keys for NTP authentication.
keyfile /etc/chrony.keys
# Get TAI-UTC offset and leap seconds from the system tz database.
leapsectz right/UTC
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
启动 chronyd,并设置开机自启
[root@node1 ~]# systemctl start chronyd
[root@node1 ~]# systemctl enable chronyd
2
查看时间同步情况,本地能够同步才能够让其他节点进行同步
timedatectl 是一个时间配置工具,用于设定时间、与时间相关的配置等。
[root@node1 ~]# timedatectl
Local time: 五 2020-05-29 11:17:46 EDT
Universal time: 五 2020-05-29 15:17:46 UTC
RTC time: 五 2020-05-29 15:17:46
Time zone: America/New_York (EDT, -0400)
# 当此值为yes代表同步成功,如果为no就代表未同步,或同步失败。
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
[root@filesystem ~]#
2
3
4
5
6
7
8
9
10
查看当前时间是从哪里同步过来的,这里显示的是主机名。不影响。
[root@node1 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* node1 10 7 377 537 +11us[ +25us] +/- 30us
[root@filesystem ~]#
2
3
4
5
6
防火墙配置
防火墙要能放行此服务,关闭防火墙或是放行相应的端口及服务。
# 3.3 客户端配置
配置文件配置
vi /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
# pool 2.centos.pool.ntp.org iburst
server 192.168.94.133 iburst
2
3
4
配置开机自启
[root@node2 ~]# systemctl restart chronyd
[root@node2 ~]# systemctl enable chronyd
2
查看同步状态及信息
[root@node2 ~]# timedatectl
Local time: 五 2020-05-29 11:28:12 EDT
Universal time: 五 2020-05-29 15:28:12 UTC
RTC time: 五 2020-05-29 15:28:12
Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
[root@node1 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* node1 11 6 17 34 -520ns[+7955ns] +/- 15ms
[root@node2 ~]#
2
3
4
5
6
7
8
9
10
11
12
13
14
我们看到是 yes,但是如何判断它是原来的时间还是同步好了。毕竟很多系统不同步时间也是近似的。
- 01
- idea 热部署插件 JRebel 安装及破解,不生效问题解决04-10
- 02
- spark中代码的执行位置(Driver or Executer)12-12
- 03
- 大数据技术之 SparkStreaming12-12