背景
Zookeeper集群中有11台机器,突然有一台机器挂掉了。由于在不断报警,我就先把这台机器下掉了。为了保证其稳定性,所以还要扩容一台机器。其实就是要把之前的那台机器替换掉。
在其中一台机器挂掉之前,配置如下(数据都是我编的):
server.1=192.168.1.101:2555:3555
server.2=192.168.1.102:2555:3555
server.3=192.168.1.103:2555:3555
server.4=192.168.1.104:2555:3555
server.5=192.168.2.1:2555:3555
server.6=192.168.2.2:2555:3555
server.7=192.168.2.3:2555:3555
server.8=192.168.2.4:2555:3555
server.9=192.168.2.5:2555:3555
server.10=192.168.3.1:2555:3555
server.11=192.168.1.100:2555:3555
其中192.168.2.1
机器挂掉了,我要把它换成192.168.122.111
。
扩容过程
申请机器
安装JDK
安装Zookeeper
配置Zookeeper
192.168.122.111
机器:
server.1=192.168.1.101:2555:3555
server.2=192.168.1.102:2555:3555
server.3=192.168.1.103:2555:3555
server.4=192.168.1.104:2555:3555
server.5=192.168.122.111:2555:3555
server.6=192.168.2.2:2555:3555
server.7=192.168.2.3:2555:3555
server.8=192.168.2.4:2555:3555
server.9=192.168.2.5:2555:3555
server.10=192.168.3.1:2555:3555
server.11=192.168.1.100:2555:3555
配置好之后我就尝试着启动。 /home/admin/bin/zookeeperctl start
,然后我查看启动情况:
$ echo ruok | nc 127.0.0.1 2181
imok
$ echo srvr | nc 127.0.0.1 2181
This ZooKeeper instance is not currently serving requests
$ echo stat | nc 127.0.0.1 2181
This ZooKeeper instance is not currently serving requests
$ echo wchs | nc 127.0.0.1 2181
This ZooKeeper instance is not currently serving requests
网上有几个关于这个问题的解答:
在zookeeper的启动日志里面你会发现这样的日志: Have smaller server identifier, so dropping the connection. 如果真的出现了这个问题, 也没关系, 但是需要先将报出该问题的实例起着,然后按照myid从小到大依次重启zk实例即可. 是的,我们确实碰到了这个问题, 因为我们稍后会将机房3的那个zk实例的myid变为0,并最后加入到11台实例的集群中,最后一直报这个问题.Zookeeper 扩容实战
当集群里的结点只剩下一台,或者不足半数时,就会出现这个错误提示。通常在,只启动第一台zookeeper时会报这个错误。在zookeeper server的日志里,会有类似的日志:
Exception causing close of session 0x0 due to java.io.IOException: ZooKeeperServer not runningzookeeper运维
但是,和我的情况都不一样,首先,该集群中并不是只有这一台机器,还有另外十台机器在运行。其次,我觉得也和myid无关。
解决
虽然上面的答案并没有解决我的问题,但是给了我提示,虽然集群中并不是只有这一台机器,但是报这个错误的原因应该是,他认为集群中只有他自己这台机器。那为什么他会这么认为呢?答案就是,Leader的配置中并没有该机器的信息。也就是说在Leader机器的zoo.cfg中配置还是旧的,指向的还是旧的地址。
所以,要想把该机器假如集群,应该把所有的机器的配置文件全部修改,然后重启。
建议操作顺序:
先重启新机器、再重启集群中的follower机器、再重启leader机器
重启时,逐个重启
重启过程中,先stop、再修改配置文件、再start
每个机器重启之后都要查看状态是否OK
当Leader机器被关闭时,首先会进行Leader选举,那么这个过程中就会把刚刚扩容的那台机器加进来了。以后也就可以和Leader通信了。
不错,不错,看看了!