其他分享
首页 > 其他分享> > 使用Docker快速搭建ZooKeeper集群

使用Docker快速搭建ZooKeeper集群

作者:互联网

前言

之前,已经使用 Docker 安装 zookeeper,但是这只是安装单机的。现在,我们要用 docker-compose 来编排集群容器。

因为一个一个地启动 ZK 太麻烦了, 所以为了方便起见, 我直接使用 docker-compose 来启动 ZK 集群。

1. yml 文件

首先创建一个名为 docker-compose.yml 的文件, 其内容如下:

version: '3'
services:
    zoo1:
        image: zookeeper
        restart: always
        container_name: zoo1
        ports:
            - "2181:2181"
        environment:
            ZOO_MY_ID: 1
            ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2182 server.3=zoo3:2888:3888;2183 server.4=zoo4:2888:3888;2184
 
    zoo2:
        image: zookeeper
        restart: always
        container_name: zoo2
        ports:
            - "2182:2181"
        environment:
            ZOO_MY_ID: 2
            ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2182 server.3=zoo3:2888:3888;2183 server.4=zoo4:2888:3888;2184
 
    zoo3:
        image: zookeeper
        restart: always
        container_name: zoo3
        ports:
            - "2183:2181"
        environment:
            ZOO_MY_ID: 3
            ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2182 server.3=zoo3:2888:3888;2183 server.4=zoo4:2888:3888;2184

    zoo4:
        image: zookeeper
        restart: always
        container_name: zoo4
        ports:
            - "2184:2181"
        environment:
            ZOO_MY_ID: 4
            ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2182 server.3=zoo3:2888:3888;2183 server.4=zoo4:2888:3888;2184

1、version: 版本号

阅读官方文档

2、image: 镜像版本

3、ZOO_MY_ID(环境变量):

4、ZOO_SERVERS(环境变量):

2. 启动集群

打开命令行提示符,进入 docker-compose.yml 所在的目录,接着执行

docker-compose -f docker-compose.yml up

最后检查一下运行情况:

如图所示,容器 zoo1,zoo2,zoo3,zoo4 都在运行中。

3. 检测集群状态

检测集群状态的命令是 zkServer.sh status /conf/zoo.cfg。使用该命令的前提是要先登入容器中,可以使用 docker exec -it zoo1 bash 登入 zoo1 中。

zoo1 在本次实验中角色是 follower:

类似地,zoo2 的角色也是 follower:

zoo3 的角色也是 follower:

zoo4 的角色是 leader:

4. ZooKeeper 集群角色介绍

Zookeeper 集群模式⼀共有三种类型的⻆⾊:

角色 职责
Leader 处理所有的事务请求(写请求),可以处理读请求,集群中只能有⼀个Leader
Follower 只能处理读请求,同时作为 Leader的候选节点,即如果Leader宕机,Follower节点要参与到新的Leader选举中,有可能成为新的Leader节点。
Observer 只能处理读请求。不能参与选举

5. 不宕机动态扩容和缩容

ZooKeeper 支持通过修改 zoo.cfg 并重启来改变ZooKeeper集群中的服务器 阅读,但是这种方式,不是很方便,上线一台服务器或者下线一台服务器需要对所有的服务器进行重启。

ZooKeeper 3.5.0 提供了⽀持动态扩容/缩容的 新特性。但是通过客户端 API可以变更服务端集群状态是件很危险的事情,所以在ZooKeeper 3.5.3 版本要⽤动态配置,需要开启超级管理员身份验证模式 ACLs。

关于ZooKeeper的ACL权限控制,可以 点击此处阅读

Step1: 我为 super:qwer1234 生成了 digest 为 super:YjJhp1/a1jnzeGTDN7nAUxFcep8=

Step2: docker-compose -f docker-compose.yml down 停掉并删除原来的容器;

Step3: 修改 docker-compose.yml 的内容:

version: '3'
services:
    zoo1:
        image: zookeeper
        restart: always
        container_name: zoo1
        ports:
            - "2181:2181"
        environment:
            ZOO_MY_ID: 1
            ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 server.4=zoo4:2888:3888;2181
            ZOO_CFG_EXTRA: "reconfigEnabled=true"
            JVMFLAGS: "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:YjJhp1/a1jnzeGTDN7nAUxFcep8="

    zoo2:
        image: zookeeper
        restart: always
        container_name: zoo2
        ports:
            - "2182:2181"
        environment:
            ZOO_MY_ID: 2
            ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 server.4=zoo4:2888:3888;2181
            ZOO_CFG_EXTRA: "reconfigEnabled=true"
            JVMFLAGS: "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:YjJhp1/a1jnzeGTDN7nAUxFcep8="

    zoo3:
        image: zookeeper
        restart: always
        container_name: zoo3
        ports:
            - "2183:2181"
        environment:
            ZOO_MY_ID: 3
            ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 server.4=zoo4:2888:3888;2181
            ZOO_CFG_EXTRA: "reconfigEnabled=true"
            JVMFLAGS: "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:YjJhp1/a1jnzeGTDN7nAUxFcep8="

    zoo4:
        image: zookeeper
        restart: always
        container_name: zoo4
        ports:
            - "2184:2181"
        environment:
            ZOO_MY_ID: 4
            ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181 server.4=zoo4:2888:3888;2181
            ZOO_CFG_EXTRA: "reconfigEnabled=true"
            JVMFLAGS: "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:YjJhp1/a1jnzeGTDN7nAUxFcep8="

Step4: 重启集群
docker-compose.yml 所在目录执行以下命令:

docker-compose -f docker-compose.yml up

Step5: 登录客户端

接下来就是使用ZooKeeper客户端的reconfig命令了。

5.1 查看当前集群信息

get /zookeeper/config

执行结果如下:

[zk: localhost:2181(CONNECTED) 0] get /zookeeper/config
server.1=zoo1:2888:3888:participant;0.0.0.0:2181
server.2=zoo2:2888:3888:participant;0.0.0.0:2181
server.3=zoo3:2888:3888:participant;0.0.0.0:2181
server.4=zoo4:2888:3888:participant;0.0.0.0:2181
version=0

5.2 扩缩容前的认证超级管理员身份

addauth digest super:qwer1234

5.3 移除集群中的一台服务器

reconfig -remove <id>

比如说,从集群中移除ID为3的ZooKeeper服务:

[zk: localhost:2181(CONNECTED) 2] reconfig -remove 3
Committed new configuration:
server.1=zoo1:2888:3888:participant;0.0.0.0:2181
server.2=zoo2:2888:3888:participant;0.0.0.0:2181
server.4=zoo4:2888:3888:participant;0.0.0.0:2181
version=100000003

5.4 为集群新增一台服务器

reconfig -add server.id=<address1>:<port1>:<port2>[:role];[<client port address>:]<client port>

比如说,把刚才移除的服务器再添加回来:

[zk: localhost:2181(CONNECTED) 3] reconfig -add server.3=zoo3:2888:3888;2181
Committed new configuration:
server.1=zoo1:2888:3888:participant;0.0.0.0:2181
server.2=zoo2:2888:3888:participant;0.0.0.0:2181
server.3=zoo3:2888:3888:participant;0.0.0.0:2181
server.4=zoo4:2888:3888:participant;0.0.0.0:2181
version=100000004

6. 过半机制

participant ⻆⾊能够形成集群(过半机制),如果集群内的 participant 有一半及以上都宕机了,此时客户端将不再可用。

6.1 半数服务器宕机

比如说,我停掉了 zoo3 和 zoo4:

此时,没有停掉的服务,也启动不了客户端:

6.2 半数以上服务器可用

然后,我再重启了 zoo3:

稍等一会之后,集群再次变得可用了。

问题记录

Client port not found in server configs

参考官网 ZOO_SERVERS 的配置,以zoo1为例: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 server.4=zoo4:2888:3888 没有加上端口号,我实践后遇上了问题。

☆ 问题具体信息如下:

出现如图所示的错误,找不到客户端端口号。

★ 解决方案:我立即停止和删除容器、网络、卷:

docker-compose -f docker-compose.yml down

然后,改成我上面给出的 docker-compose.yml 文件内容,然后用 docker-compose -f docker-compose.yml up 重启集群服务器。

KeeperErrorCode = Reconfig is disabled

从3.5.0开始到3.5.3之前,没有办法禁用动态重新配置功能。我们希望提供禁用重新配置功能的选项,因为启用重新配置后,我们存在一个安全问题,即恶意参与者可以对ZooKeeper集合的配置进行任意更改,包括向集合中添加受损服务器。我们倾向于让用户自行决定是否启用它,并确保适当的安全措施到位。因此,在3.5.3中引入了reconfigEnabled configuration选项,以便可以完全禁用重新配置功能,并且通过reconfig API重新配置集群的任何尝试(无论是否具有身份验证)在默认情况下都将失败,除非reconfigEnabled设置为true。

要将选项设置为true,配置文件(zoo.cfg)应包含:

reconfigEnabled=true

Insufficient permission

☆ 问题具体报错信息如下:

★ 解决方案:addauth digest super:qwer1234 赋予超级管理员权限

[zk: localhost:2181(CONNECTED) 0] reconfig -remove 3
Insufficient permission :
[zk: localhost:2181(CONNECTED) 1] addauth digest super:qwer1234
[zk: localhost:2181(CONNECTED) 2] reconfig -remove 3
Committed new configuration:
server.1=zoo1:2888:3888:participant;0.0.0.0:2181
server.2=zoo2:2888:3888:participant;0.0.0.0:2181
server.4=zoo4:2888:3888:participant;0.0.0.0:2181
version=100000003

参考文档

Docker ZooKeeper

docker-compose

Zookeeper之 两种选举制度|为什么需要过半投票机制?

理解Zookeeper(九):Zookeeper扩容和缩容

标签:0.0,2888,ZooKeeper,3888,ZOO,zoo1,2181,集群,Docker
来源: https://www.cnblogs.com/kendoziyu/p/15012631.html