分布式系统、集群的时间同步

来源:互联网 发布:全境封锁优化设置 编辑:程序博客网 时间:2024/06/10 08:43

 Linux服务器运行久时,系统时间就会存在一定的误差,一般情况下可以使用date命令进行时间设置,但在做数据库集群分片等操作时对多台机器的时间差是有要求的,此时就需要使用ntpdate进行时间同步。

第一种情况:连的上外网

先看几条重要命令:

date命令
date :查看当前时间,结果如下:Tue Mar 4 01:36:45 CST 2014
date -s 09:38:40 :设置当前时间,结果如下:Tue Mar 4 09:38:40 CST 2014

ntpdate命令
ntpdate -u 210.72.145.44 :网络时间同步命令

注意:若不加上-u参数, 会出现以下提示:no server suitable for synchronization found
-u:从man ntpdate中可以看出-u参数可以越过防火墙与主机同步;
210.72.145.44:中国国家授时中心的官方服务器。

ntp常用服务器
中国国家授时中心:210.72.145.44
NTP服务器(上海) :ntp.api.bz

美国:time.nist.gov 
复旦:ntp.fudan.edu.cn 
微软公司授时主机(美国) :time.windows.com 
台警大授时中心(台湾):asia.pool.ntp.org

经测试中国国家授时中心与NTP上海服务器可以正常同步时间,注意需要加上-u参数!

第二种情况:连不上外网,比如:自己搭建的用来学习的集群中所有机器需要同步时间:


思路:可以把其中一台配置为时间服务器,其他机器通过定时任务来同步时间

开始:


Linux自带了ntp服务 -- /etc/init.d/ntpd,这个服务不仅可以设置让本机和某台/某些机器做时间同步,他本身还可以扮演一个time server的角色,让其他机器和他同步时间。

配置文件就是/etc/ntp.conf。

为了测试,设置让node2 -- 192.168.1.102和node1 -- 192.168.1.101做时间同步。
第一步,
node1做time server,node1本身不和其他机器时间同步,就是取本地时间。
所以,先把node1机器的时间调准了:

[root@node1 ~]date -s 08/03/2011 
[root@node1 ~]date -s 11:12:00

[root@node1 ~]clock -w
[root@node1 ~]hwclock --systohc

后两个命令是把设置的时间写到硬件时间中去(也就是CMOS里面的时间)。

注意这两个命令的效果是一样的,执行其中一条即可:因为clock(已过时)==hwclock  -w == --systohc

第二步,
将node1配置成一个time server,修改/etc/ntp.conf
[root@node1 ~]vi /etc/ntp.conf
其他的配置不怎么需要改,只需要关注restrict的配置:

1. 注释掉原来的restrict default ignore这一行,这一行本身是不响应任何的ntp更新请求,其实也就是禁用了本机的ntp server的功能,所以需要注释掉。

2. 加入下面3行: 

restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap(注释:用于让192.168.1.0/24网段上的机器能和本机做时间同步

server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10

后两行是让本机的ntpd和本地硬件时间同步。

当然,我们也可以添加server xxx.xxx.xxx.xxx,让他和其他的time server时间同步。

4. /etc/init.d/ntpd restart或者 service ntpd restart

5. chkconfig ntpd on 设置开机自启动

6. 修改iptables配置,将tcp和udp 123端口开放,这是ntp需要的端口,在/etc/services中可以查到这个端口。


第三步,
这样node1就成为一台time server了,现在我们配置node2这台机器(这里我们用定时任务来定时同步时间)

首先关掉这台机器上的ntpd服务:

service ntpd stop(本次关掉) 

chkconfig ntpd off(再关掉开机自启动);

否则会报错:

[root@sv1 logs]# ntpdate node1
 1 Sep 20:09:19 ntpdate[2614]: the NTP socket is in use, exiting

好,开始写定时任务:

[root@sv1 logs]# crontab -e
#synchronize time with node1
*/5 * * * * /usr/sbin/ntpdate nimbus >/dev/null 2>&1

意思是每5分钟同步一次时间;

好了,搞定!

1 0