当领导人死亡时,改变动物园pipe理员群体的领导

远远低于你可以finddocker-compose.yml文件。

先决条件:

我使用docker -compose (docker-compose.yml,3 zookeepers)作为一个集群启动3个zookeeper服务器,然后向集群添加4.一个(另一个docker-compose.yml,1个zookeeper) 。 前3名动物园pipe理员之一是领导者,4.如预期的那样,一名是一名追随者。

问题:

当我停止前三名动物园pipe理员(通过docker-compose down ),我“失去”了领导者,我希望这位动物园pipe理员能够担任领导。

发生的唯一事情是zookeeper显示错误,例如:

 WARN Cannot open channel to 3 at election address localhost/127.0.0.1:43888 java.net.ConnectException: Connection refused 

echo stat | nc localhost 52181 | grep Mode echo stat | nc localhost 52181 | grep Mode echo stat | nc localhost 52181 | grep Mode以前返回这个最后一个动物园pipe理员的模式follower ,现在什么都不返回。

仍然runnng动​​物园pipe理员服务器只说,例如:

 INFO Closed socket connection for client /127.0.0.1:43548 (no session established for client) (org.apache.zookeeper.server.NIOServerCnxn) 

解决scheme1:

  • 增加时限并没有帮助,同样的结果:

    ZOOKEEPER_TICK_TIME: 4000

    ZOOKEEPER_INIT_LIMIT: 30

    ZOOKEEPER_SYNC_LIMIT: 15

解决scheme2:

  • 另一种方式aorund:

当我首先启动单个zookeeper服务器(没有其他人已经运行),它只是返回错误消息(见上面的错误),显然是不正确运行,因为echo stat | nc localhost 52181 | grep Mode echo stat | nc localhost 52181 | grep Mode echo stat | nc localhost 52181 | grep Mode再次没有返回。

当我把其他3个动物园pipe理员添加到群集中时,所有的都运行良好,第一个动物园pipe理员服务器是leader

杀害第一个动物园pipe理员离开3跑,其中一个是新的leader

题:

  • 我希望,在集群中留下一个动物园pipe理员,使其成为“领导者”。
  • 它像解决scheme2中所描述的那样“相反的方式”(但是不是一个,而是三个动物园pipe理员正在运行,只有一个被杀死)。
  • 为什么它不像问题中所描述的那样工作,把单个动物园pipe理员分别作为领导者或单个工作的动物园pipe理员服务器?

docker-compose.yml文件:

我使用docker-compose和以下docker-compose.yml启动3个zookeeper服务器:

 --- version: '2' services: zookeeper_1: image: confluentinc/cp-zookeeper:3.1.1 network_mode: host environment: ZOOKEEPER_SERVER_ID: 1 ZOOKEEPER_CLIENT_PORT: 22181 ZOOKEEPER_TICK_TIME: 2000 ZOOKEEPER_INIT_LIMIT: 5 ZOOKEEPER_SYNC_LIMIT: 2 ZOOKEEPER_SERVERS: localhost:22888:23888;localhost:32888:33888;localhost:42888:43888;localhost:52888:53888 zookeeper_2: image: confluentinc/cp-zookeeper:3.1.1 network_mode: host environment: ZOOKEEPER_SERVER_ID: 2 ZOOKEEPER_CLIENT_PORT: 32181 ZOOKEEPER_TICK_TIME: 2000 ZOOKEEPER_INIT_LIMIT: 5 ZOOKEEPER_SYNC_LIMIT: 2 ZOOKEEPER_SERVERS: localhost:22888:23888;localhost:32888:33888;localhost:42888:43888;localhost:52888:53888 zookeeper_3: image: confluentinc/cp-zookeeper:3.1.1 network_mode: host environment: ZOOKEEPER_SERVER_ID: 3 ZOOKEEPER_CLIENT_PORT: 42181 ZOOKEEPER_TICK_TIME: 2000 ZOOKEEPER_INIT_LIMIT: 5 ZOOKEEPER_SYNC_LIMIT: 2 ZOOKEEPER_SERVERS: localhost:22888:23888;localhost:32888:33888;localhost:42888:43888;localhost:52888:53888 

我以同样的方式开始4:

 --- version: '2' services: zookeeper_4: image: confluentinc/cp-zookeeper:3.1.1 network_mode: host environment: ZOOKEEPER_SERVER_ID: 4 ZOOKEEPER_CLIENT_PORT: 52181 ZOOKEEPER_TICK_TIME: 2000 ZOOKEEPER_INIT_LIMIT: 5 ZOOKEEPER_SYNC_LIMIT: 2 ZOOKEEPER_SERVERS: localhost:22888:23888;localhost:32888:33888;localhost:42888:43888;localhost:52888:53888 

有一件事要记住:zookeeper只会在大多数服务器正在运行的时候出现。 所以如果你有4个服务器,并打倒3个,zookeeper只会出现,如果你再启动两个。

你使用哪个版本的zookeeper? 如果它是3.5之前的版本(或者你正在使用3.5而不使用重新configuration命令),那么当你改变configuration时你将需要重新启动服务器。