分布式集群时钟同步问题及解决方案

1,994 阅读2分钟

文章内容输出来源:拉勾教育Java高薪训练营

时钟不同步导致的问题

这里的时钟说的是服务器的时间,集群是多个实力共同工作,如果集群中各个服务器之间的时间不一致,势必会出现一系列严重的问题。

例如下单业务中,新增一条订单,通常会在订单表中插入一条订单记录,订单记录中应该会有**“下单时间”**这样的字段,而这个字段的值往往是在程序中获取当前系统时间插入数据库或者直接从数据库服务器获取时间,若订单系统是集群化部署,或者数据库是分库分表的集群化部署,而他们的时钟是不同步的,那么数据将会变得混乱。

集群时钟同步配置

时钟同步配置分为以下3种情况:

  • 场景1、分布式集群中的各个服务器节点都可以访问互联网

    • 思路
    • 操作
    # 使用 ntpdate 网络时间同步命令
    ntpdate -u ntp.api.bz # 从一个时间服务器同步时间
    
  • 场景2、分布式集群中某⼀个(或几个但不是全部)服务器节点可以访问互联⽹

    • 思路
    • 操作
      • 选取集群中的⼀个可以访问互联网的服务器节点A(172.17.0.17)作为时间服务器,让这台服务器和⽹络时间保持同步
      # 使用 ntpdate 网络时间同步命令
      ntpdate -u ntp.api.bz # 从一个时间服务器同步时间
      
      • 把服务器节点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
      
      • 集群中其他节点就可以从A服务器同步时间了
      ntpdate 172.17.0.17
      
  • 场景3、分布式集群中的所有节点都不能够访问互联⽹

    • 思路

    与场景2基本相同,唯一的不同是需要手动设置服务器节点A的时钟。