集群时间问题导致的zookeeper集群启动异常

734 阅读3分钟

1. 异常信息

在启动zookeeper集群时,集群启动失败,报错如下:

2021-07-11 20:47:40,010 [myid:2] - INFO  [QuorumPeer[myid=2](plain=[0:0:0:0:0:0:0:0]:2181)(secure=disabled):ZooKeeperServer@166] - Created server with tickTime 2000 minSessionTimeout 4000 maxSessionTimeout 40000 datadir /opt/module/apache-zookeeper-3.5.7-bin/zkData/version-2 snapdir /opt/module/apache-zookeeper-3.5.7-bin/zkData/version-2
2021-07-11 20:47:40,011 [myid:2] - ERROR [QuorumPeer[myid=2](plain=[0:0:0:0:0:0:0:0]:2181)(secure=disabled):Leader@260] - Couldn't bind to hadoop10/172.16.24.10:2888
java.net.BindException: 无法指定被请求的地址 (Bind failed)
	at java.net.PlainSocketImpl.socketBind(Native Method)
	at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
	at java.net.ServerSocket.bind(ServerSocket.java:375)
	at java.net.ServerSocket.bind(ServerSocket.java:329)
	at org.apache.zookeeper.server.quorum.Leader.<init>(Leader.java:254)
	at org.apache.zookeeper.server.quorum.QuorumPeer.makeLeader(QuorumPeer.java:1057)
	at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1265)
2021-07-11 20:47:40,011 [myid:2] - WARN  [QuorumPeer[myid=2](plain=[0:0:0:0:0:0:0:0]:2181)(secure=disabled):QuorumPeer@1269] - Unexpected exception
java.net.BindException: 无法指定被请求的地址 (Bind failed)
	at java.net.PlainSocketImpl.socketBind(Native Method)
	at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
	at java.net.ServerSocket.bind(ServerSocket.java:375)
	at java.net.ServerSocket.bind(ServerSocket.java:329)
	at org.apache.zookeeper.server.quorum.Leader.<init>(Leader.java:254)
	at org.apache.zookeeper.server.quorum.QuorumPeer.makeLeader(QuorumPeer.java:1057)
	at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:1265)

解决方式

在zoo.cfg上配置如下

quorumListenOnAllIPs=true

补充

zooekeeper配置尤为注意

  1. zoo.cfg文件,一定要注意server.A.hostName,一定要和myid对应,上面的问题,后续发现,其实是配置导致的,配置一定要搞清楚。所以无需配置quorumListenOnAllIPs=true即可解决问题

网上说是时间不同问题导致的,我的系统集群刚好时间不同步,不过后续做了时间同步,还是不行,如下记录时间同步 集群时间同步配置

2. 集群时间服务同步

  1. 几个常用的时间服务命令
  1. ntpd服务状态:systemctl status ntpd
  2. ntpd是否允许开机启动:systemctl is-enabled ntpd
  3. 关闭ntpd服务:systemctl stop ntpd
  4. 关闭ntpd自启:systemctl disable ntpd
  5. 开启ntpd开机启动:systemctl enable ntpd
  6. 开启ntpd服务:systemctl start ntpd
  1. 配置集群时间同步思路

以一台服务作为时间同步服务,其它机器的事件定时和同步服务机器进行同步操作

3. 具体操作

0. 前提条件:确保系统已经安装了ntp插件,没有自行安装下载

1. 关闭集群所有ntp服务和自启动

systemctl stop ntpd
systemctl disable ntpd

2. 在作为时间同步服务的机器上,做如下操作

1. 修改文件/etc/ntp.conf

vim /etc/ntp.conf

修改内容如下:
1. 修改1
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
修改为(注意192.168.1.0要修改成你自己的网段)
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

2. 修改2:(集群在局域网中,不使用其他互联网时间)
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
修改为
#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

3. 添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10

2. 修改文件/etc/sysconfig/ntpd

vim /etc/sysconfig/ntpd

增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes

3. 重启ntpd服务

systemctl start ntpd

4. 设置ntpd服务开机启动

systemctl enable ntpd

3. 其他机器配置

1. 编写定时任务
crontab -e

2. 开启每10分钟同步
*/10 * * * * /usr/sbin/ntpdate hadoop10

3. 10分钟后查看
date

4. 其他问题(我当时的集群除了时间不一致,还在不同的时区。所有如果在不同的时区的话,需要更改时区一致)

  1. 使用命令

tzselect

  1. 选择5亚洲
  2. 选择9China
  3. 选择1beijing