领导者死亡时更改 zookeeper 集群领导者
Changing zookeeper cluster leadership when leader dies
在最下方您可以找到 docker-compose.yml 文件。
先决条件:
我使用 docker-compose (docker-compose.yml, 3 zookeepers) 将 3 个 zookeeper 服务器作为一个集群启动,然后我添加一个 4. one (another docker-compose.yml, 1 zookeeper) 到集群。
前 3 个动物园管理员中的一个是领导者,第 4 个是追随者,正如预期的那样。
问题:
当我停止前三个动物园管理员时(通过 docker-compose down
),我 "lose" 领导者并且我希望 4. 动物园管理员取得领导地位。
唯一发生的事情是 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
为最后一个动物园管理员返回了模式 follower
,现在 returns 什么也没有。
仍在运行的 zookeeper 服务器只说,例如:
INFO Closed socket connection for client /127.0.0.1:43548 (no session established for client) (org.apache.zookeeper.server.NIOServerCnxn)
方案一:
增加时间限制没有帮助,结果相同:
ZOOKEEPER_TICK_TIME: 4000
ZOOKEEPER_INIT_LIMIT: 30
ZOOKEEPER_SYNC_LIMIT: 15
方案二:
- 另一条路:
当我首先启动单个 zookeeper 服务器时(没有其他的 运行),它只是 returns 错误消息(参见上面的错误)并且显然 运行 不正确因为 echo stat | nc localhost 52181 | grep Mode
再次 returns 没有。
当我将其他 3 个 zookeeper 添加到集群时,一切运行良好,第一个 zookeeper 服务器是 leader
。
杀死第一个动物园管理员留下3个运行,其中一个是新的leader
。
问题:
- 我预计,在集群中留下一个动物园管理员会使它成为 'leader'。
- 它像解决方案 2 中描述的那样工作 "the other way around"(但不是一个,而是剩下三个动物园管理员 运行,只有一个被杀死)。
- 为什么它不能像问题中描述的那样工作,分别将单个 zookeeper 作为领导者或单个工作 zookeeper 服务器?
docker-compose.yml 个文件:
我用 docker-compose 和下面的 docker-compose.yml:
启动了 3 个动物园管理员服务器
---
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 只有在你再启动两台时才会出现。
您使用的是哪个版本的动物园管理员?如果是 3.5 之前的版本或(您使用的是 3.5 且未使用重新配置命令),则在更改配置时需要重新启动服务器。
在最下方您可以找到 docker-compose.yml 文件。
先决条件:
我使用 docker-compose (docker-compose.yml, 3 zookeepers) 将 3 个 zookeeper 服务器作为一个集群启动,然后我添加一个 4. one (another docker-compose.yml, 1 zookeeper) 到集群。 前 3 个动物园管理员中的一个是领导者,第 4 个是追随者,正如预期的那样。
问题:
当我停止前三个动物园管理员时(通过 docker-compose down
),我 "lose" 领导者并且我希望 4. 动物园管理员取得领导地位。
唯一发生的事情是 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
为最后一个动物园管理员返回了模式 follower
,现在 returns 什么也没有。
仍在运行的 zookeeper 服务器只说,例如:
INFO Closed socket connection for client /127.0.0.1:43548 (no session established for client) (org.apache.zookeeper.server.NIOServerCnxn)
方案一:
增加时间限制没有帮助,结果相同:
ZOOKEEPER_TICK_TIME: 4000
ZOOKEEPER_INIT_LIMIT: 30
ZOOKEEPER_SYNC_LIMIT: 15
方案二:
- 另一条路:
当我首先启动单个 zookeeper 服务器时(没有其他的 运行),它只是 returns 错误消息(参见上面的错误)并且显然 运行 不正确因为 echo stat | nc localhost 52181 | grep Mode
再次 returns 没有。
当我将其他 3 个 zookeeper 添加到集群时,一切运行良好,第一个 zookeeper 服务器是 leader
。
杀死第一个动物园管理员留下3个运行,其中一个是新的leader
。
问题:
- 我预计,在集群中留下一个动物园管理员会使它成为 'leader'。
- 它像解决方案 2 中描述的那样工作 "the other way around"(但不是一个,而是剩下三个动物园管理员 运行,只有一个被杀死)。
- 为什么它不能像问题中描述的那样工作,分别将单个 zookeeper 作为领导者或单个工作 zookeeper 服务器?
docker-compose.yml 个文件:
我用 docker-compose 和下面的 docker-compose.yml:
启动了 3 个动物园管理员服务器---
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 只有在你再启动两台时才会出现。
您使用的是哪个版本的动物园管理员?如果是 3.5 之前的版本或(您使用的是 3.5 且未使用重新配置命令),则在更改配置时需要重新启动服务器。