天道不一定酬所有勤
但是,天道只酬勤
Hollis出品的全套Java面试宝典不来了解一下吗?

This ZooKeeper instance is not currently serving requests

Hollis出品的全套Java面试宝典不来了解一下吗?

背景

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通信了。

赞(2)
如未加特殊说明,此网站文章均为原创,转载必须注明出处。HollisChuang's Blog » This ZooKeeper instance is not currently serving requests
Hollis出品的全套Java面试宝典不来了解一下吗?

评论 1

  1. #1

    不错,不错,看看了!

    易路营销8年前 (2016-04-23)回复

HollisChuang's Blog

联系我关于我