ZooKeeper标准软件基于Bitnami ZooKeeper 构建。当前版本为3.9.2
你可以通过Qinghub 部署工具直接安装部署,也可以手动按如下文档操作
部署配置文件获取地址: https://gitee.com/qingplus/qingcloud-platform
什么是Zookeeper
zooKeeper 是一个开放源码的分布式协调服务,主要为了解决分布式架构下数据一致性问题, 它是集群的管理者, 监视着集群中各个节点的状态,根据节点提交的反馈进行下一步合理操作。 最终, 将简单易用的接口和性能高效、 功能稳定的系统提供给用户
连接容器
使用Docker 容器网络,应用程序容器可以轻松访问容器内运行的 Apache ZooKeeper 服务器。
连接到同一网络的容器可以使用容器名称作为主机名来相互通信。
使用命令行
在此示例中,我们将创建一个 Apache ZooKeeper 客户端实例,该实例将连接到与客户端在同一 Docker 网络上运行的服务器实例。
第 1 步:创建网络
docker network create app-tier --driver bridge
步骤 2:启动 Apache ZooKeeper 服务器实例
使用命令--network app-tier的参数docker run将 Apache ZooKeeper 容器连接到网络app-tier。
docker run -d --name zookeeper-server \
--network app-tier \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:latest
第 3 步:启动 Apache ZooKeeper 客户端实例
最后,我们创建一个新的容器实例来启动 Apache ZooKeeper 客户端并连接到上一步中创建的服务器:
docker run -it --rm \
--network app-tier \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:latest zkCli.sh -server zookeeper-server:2181 get /
使用 Docker Compose 文件
如果未指定,Docker Compose 会自动设置一个新网络并将所有已部署的服务附加到该网络。但是,我们将显式定义一个bridge名为app-tier的新网络。在此示例中,我们假设您希望从您自己的自定义应用程序映像连接到 Apache ZooKeeper 服务器,该映像在以下代码段中通过服务名称进行标识myapp。
version: '2'
networks:
app-tier:
driver: bridge
services:
zookeeper:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:latest'
networks:
- app-tier
myapp:
image: 'YOUR_APPLICATION_IMAGE'
networks:
- app-tier
重要:
替换YOUR_APPLICATION_IMAGE占位符
在您的应用程序容器中,使用主机名zookeeper连接到 Apache ZooKeeper 服务器
启动容器:
docker-compose up -d
配置
可以使用以下环境变量设置配置:
- ZOO_PORT_NUMBER:Apache ZooKeeper 客户端端口。默认值:2181
- ZOO_SERVER_ID: ensemble 中服务器的 ID。默认值:1
- ZOO_TICK_TIME:Apache ZooKeeper 用于心跳的基本时间单位(以毫秒为单位)。默认值:2000
- ZOO_PRE_ALLOC_SIZE':事务日志文件的块大小。默认值:65536
- ZOO_SNAPCOUNT:在拍摄快照(以及事务日志滚动)之前事务日志中记录的事务数。默认值:100000
- ZOO_INIT_LIMIT:Apache ZooKeeper 用于限制仲裁中的 Apache ZooKeeper 服务器必须连接到领导者的时间长度。默认值:10
- ZOO_SYNC_LIMIT:服务器距离领导者有多远。默认值:5
- ZOO_MAX_CNXNS:限制可与 Apache ZooKeeper 服务器建立的并发连接总数。将其设置为 0 可以完全消除限制。默认值:0
- ZOO_MAX_CLIENT_CNXNS:限制单个客户端可以与 Apache ZooKeeper 整体的单个成员建立的并发连接数。默认值:60
- ZOO_4LW_COMMANDS_WHITELIST:列入白名单的4LW命令列表。默认值:srvr、mntr
- ZOO_SERVERS:逗号、空格或分号分隔的服务器列表。示例:zoo1:2888:3888、zoo2:2888:3888 或如果指定服务器 ID Zoo1:2888:3888::1、zoo2:2888:3888::2。默认值:无默认值。
- ZOO_CLIENT_USER:将使用 Apache ZooKeeper 客户端进行身份验证的用户。默认值:无默认值。
- ZOO_CLIENT_PASSWORD:将使用 Apache ZooKeeper 客户端进行身份验证的密码。默认值:无默认值。
- ZOO_CLIENT_PASSWORD_FILE:包含 Apache ZooKeeper 客户端用于执行身份验证的密码的文件的绝对路径。默认值:无默认值。
- ZOO_SERVER_USERS:以逗号、分号或空格分隔的要创建的用户列表。示例:用户1、用户2、管理员。默认值:无默认值
- ZOO_SERVER_PASSWORDS:逗号、分号或空格分隔的密码列表,在创建时分配给用户。示例:pass4user1、pass4user2、pass4admin。默认值:无默认值
- ZOO_SERVER_PASSWORDS_FILE:文件的绝对路径,该文件包含逗号、分号或空格分隔的密码列表,以便在创建时分配给用户。示例:pass4user1、pass4user2、pass4admin。默认值:无默认值
- ZOO_ENABLE_AUTH:启用 Apache ZooKeeper 身份验证。它使用 SASL/Digest-MD5。默认值:no
- ZOO_RECONFIG_ENABLED:启用 Apache ZooKeeper 动态重新配置。默认值:no
- ZOO_LISTEN_ALLIPS_ENABLED:侦听来自所有可用 IP 地址上的对等方的连接。默认值:no
- ZOO_AUTOPURGE_INTERVAL:触发自动清除任务的时间间隔(以小时为单位)。设置为正整数(1 及以上)以启用自动清除旧快照和日志文件。默认值:0
- ZOO_MAX_SESSION_TIMEOUT:服务器允许客户端协商的最大会话超时(以毫秒为单位)。默认值:40000
- ZOO_AUTOPURGE_RETAIN_COUNT:启用自动清除后,Apache ZooKeeper 会将 dataDir 和 dataLogDir 中的最新快照和相应事务日志分别保留到此编号,并删除其余的。最小值为 3。默认值:3
- ZOO_HEAP_SIZE:Java 堆选项(Xmx 和 XMs)的大小(以 MB 为单位)。如果通过配置 Xmx 和 Xms,则忽略此环境变量JVMFLAGS。默认值:1024
- ZOO_ENABLE_PROMETHEUS_METRICS:公开 Prometheus 指标。默认值:no
- ZOO_PROMETHEUS_METRICS_PORT_NUMBER:Jetty 服务器将公开 Prometheus 指标的端口。默认值:7000
- ALLOW_ANONYMOUS_LOGIN:如果设置为 true,则允许接受未经身份验证的用户的连接。默认值:no
- ZOO_LOG_LEVEL:Apache ZooKeeper 日志级别。可用级别有:ALL、DEBUG、INFO、WARN、ERROR、FATAL、OFF、TRACE。默认值:INFO
- JVMFLAGS:Apache ZooKeeper 进程的默认 JVMFLAGS。默认值:无默认值
- ZOO_TLS_CLIENT_ENABLE:启用 tls 进行客户端通信。默认值:false
- ZOO_TLS_PORT_NUMBER:Zookeeper TLS 端口。默认值:3181
- ZOO_TLS_CLIENT_KEYSTORE_FILE:密钥库文件:默认值:无默认值
- ZOO_TLS_CLIENT_KEYSTORE_PASSWORD:KeyStore文件密码。这可以是一个环境变量。它将由 bash 评估。默认值:无默认值
- ZOO_TLS_CLIENT_TRUSTSTORE_FILE:TrustStore 文件:默认值:无默认值
- ZOO_TLS_CLIENT_TRUSTSTORE_PASSWORD:TrustStore 文件密码。这可以是一个环境变量。它将由 bash 评估。默认值:无默认值
- ZOO_TLS_CLIENT_AUTH:指定对来自客户端的 TLS 连接进行身份验证的选项。可用值有:none、want、need。默认:need
- ZOO_TLS_QUORUM_ENABLE:启用 tls 进行仲裁通信。默认值:false
- ZOO_TLS_QUORUM_KEYSTORE_FILE:密钥库文件:默认值:无默认值
- ZOO_TLS_QUORUM_KEYSTORE_PASSWORD:KeyStore文件密码。这可以是一个环境变量。它将由 bash 评估。默认值:无默认值
- ZOO_TLS_QUORUM_TRUSTSTORE_FILE:TrustStore 文件:默认值:无默认值
- ZOO_TLS_QUORUM_TRUSTSTORE_PASSWORD:TrustStore 文件密码。这可以是一个环境变量。它将由 bash 评估。默认值:无默认值
- ZOO_TLS_QUORUM_CLIENT_AUTH:指定对来自客户端的 TLS 连接进行身份验证的选项。可用值有:none、want、need。默认:need
- ZOO_ENABLE_ADMIN_SERVER:启用管理服务器。默认值:yes
- ZOO_ADMIN_SERVER_PORT_NUMBER:管理服务器端口。默认值:8080
- ZOO_PEER_TYPE:Zookeeper 节点对等类型。默认值:无默认值
docker run --name zookeeper -e ZOO_SERVER_ID=1 registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:latest
或修改docker-compose.yml文件:
services:
zookeeper:
...
environment:
- ZOO_SERVER_ID=1
...
Apache ZooKeeper 配置
该镜像配置存放在/opt/bitnami/zookeeper/conf/目录中。
docker run --name zookeeper -v /path/to/zoo.cfg:/opt/bitnami/zookeeper/conf/zoo.cfg registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:latest
之后,您的更改将被考虑到服务器的行为中。
第 1 步:运行 Apache ZooKeeper 映像
运行 Apache ZooKeeper 容器,从主机安装目录。
docker run --name zookeeper -v /path/to/zoo.cfg:/opt/bitnami/zookeeper/conf/zoo.cfg registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:latest
或使用 Docker Compose:
version: '2'
services:
zookeeper:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:latest'
ports:
- '2181:2181'
volumes:
- /path/to/zoo.cfg:/opt/bitnami/zookeeper/conf/zoo.cfg
第 2 步:编辑配置
使用您喜欢的编辑器编辑主机上的配置。
vi /path/to/zoo.cfg
第 3 步:重新启动 Apache ZooKeeper
更改配置后,重新启动 Apache ZooKeeper 容器以使更改生效。
docker restart zookeeper
或使用 Docker Compose:
docker-compose restart zookeeper
安全
通过传递环境变量可以轻松启用基于 SASL/Digest-MD5 的身份验证ZOO_ENABLE_AUTH。启用 Apache ZooKeeper 身份验证时,还需要传递能够登录的用户和密码列表。
注意:使用 CLI 工具启用身份验证zkCli.sh。ZOO_CLIENT_USER因此,设置ZOO_CLIENT_PASSWORD环境变量也是有必要的 。
docker run -it -e ZOO_ENABLE_AUTH=yes \
-e ZOO_SERVER_USERS=user1,user2 \
-e ZOO_SERVER_PASSWORDS=pass4user1,pass4user2 \
-e ZOO_CLIENT_USER=user1 \
-e ZOO_CLIENT_PASSWORD=pass4user1 \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper
或修改docker-compose.yml文件:
services:
zookeeper:
...
environment:
- ZOO_ENABLE_AUTH=yes
- ZOO_SERVER_USERS=user1,user2
- ZOO_SERVER_PASSWORDS=pass4user1,pass4user2
- ZOO_CLIENT_USER=user1
- ZOO_CLIENT_PASSWORD=pass4user1
...
设置 Apache ZooKeeper 整体
可以使用以下环境变量通过 Apache ZooKeeper Docker 映像轻松设置Apache ZooKeeper ( https://zookeeper.apache.org/doc/r3.1.2/zookeeperAdmin.html ) 集群:
ZOO_SERVERS:逗号、空格或分号分隔的服务器列表。这可以在指定或不指定集合中服务器的 ID 的情况下完成。没有默认值。例子:
没有服务器 ID - zoo1:2888:3888,zoo2:2888:3888
带有服务器 ID - zoo1:2888:3888::1,zoo2:2888:3888::2
没有服务器ID和观察者-zoo1:2888:3888,zoo2:2888:3888:observer
带有服务器 ID 和观察者 - Zoo1:2888:3888::1,zoo2:2888:3888:observer::2
为了获得可靠的 Apache ZooKeeper 服务,您应该将 Apache ZooKeeper 部署在称为集成的集群中。只要大多数节点都已启动,该服务就可用。由于 Apache ZooKeeper 需要多数,因此最好使用奇数台机器。例如,四台机器的 Apache ZooKeeper 只能处理单台机器的故障;如果两台机器出现故障,剩下的两台机器不占多数。然而,有了五台机器,Apache ZooKeeper 就可以处理两台机器的故障。
您必须使用 0.0.0.0 作为服务器的主机。更具体地说,如果zookeeper1容器启动的ID是1,那么ZOO_SERVERS环境变量必须是0.0.0.0:2888:3888,zookeeper2:2888:3888,zookeeper3:2888:3888,或者如果zookeeper服务器的ID不是-sequential 那么需要指定它们 0.0.0.0:2888:3888::2,zookeeper2:2888:3888::4.zookeeper3:2888:3888::6
见下文:
创建 Docker 网络以通过 docker 容器名称相互可见
docker network create app-tier --driver bridge
步骤1:创建第一个节点
第一步是创建一个 Apache ZooKeeper 实例。
docker run --name zookeeper1 \
--network app-tier \
-e ZOO_SERVER_ID=1 \
-e ZOO_SERVERS=0.0.0.0:2888:3888,zookeeper2:2888:3888,zookeeper3:2888:3888 \
-p 2181:2181 \
-p 2888:2888 \
-p 3888:3888 \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:latest
步骤2:创建第二个节点
接下来我们启动一个新的 Apache ZooKeeper 容器。
docker run --name zookeeper2 \
--network app-tier \
-e ZOO_SERVER_ID=2 \
-e ZOO_SERVERS=zookeeper1:2888:3888,0.0.0.0:2888:3888,zookeeper3:2888:3888 \
-p 2181:2181 \
-p 2888:2888 \
-p 3888:3888 \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:latest
步骤3:创建第三个节点
接下来我们启动另一个新的 Apache ZooKeeper 容器。
docker run --name zookeeper3 \
--network app-tier \
-e ZOO_SERVER_ID=3 \
-e ZOO_SERVERS=zookeeper1:2888:3888,zookeeper2:2888:3888,0.0.0.0:2888:3888 \
-p 2181:2181 \
-p 2888:2888 \
-p 3888:3888 \
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:latest
您现在已经启动并运行了一个两节点 Apache ZooKeeper 集群。您可以通过添加/删除从属服务器来扩展集群,而不会导致任何停机。
通过 Docker Compose,可以使用以下命令设置整体:
version: '2'
services:
zookeeper1:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:latest'
ports:
- '2181'
- '2888'
- '3888'
volumes:
- /path/to/zookeeper-persistence:/bitnami/zookeeper
environment:
- ZOO_SERVER_ID=1
- ZOO_SERVERS=0.0.0.0:2888:3888,zookeeper2:2888:3888,zookeeper3:2888:3888
zookeeper2:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:latest'
ports:
- '2181'
- '2888'
- '3888'
volumes:
- /path/to/zookeeper-persistence:/bitnami/zookeeper
environment:
- ZOO_SERVER_ID=2
- ZOO_SERVERS=zookeeper1:2888:3888,0.0.0.0:2888:3888,zookeeper3:2888:3888
zookeeper3:
image: 'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:latest'
ports:
- '2181'
- '2888'
- '3888'
volumes:
- /path/to/zookeeper-persistence:/bitnami/zookeeper
environment:
- ZOO_SERVER_ID=3
- ZOO_SERVERS=zookeeper1:2888:3888,zookeeper2:2888:3888,0.0.0.0:2888:3888
使用 TLS 启动 Apache ZooKeeper
docker run --name zookeeper \
-v /path/to/domain.key:/bitnami/zookeeper/certs/domain.key:ro
-v /path/to/domain.crs:/bitnami/zookeeper/certs/domain.crs:ro
-e ALLOW_EMPTY_PASSWORD=yes \
-e ZOO_TLS_CLIENT_ENABLE=yes \
-e ZOO_TLS_CLIENT_KEYSTORE_FILE=/bitnami/zookeeper/certs/domain.key\
-e ZOO_TLS_CLIENT_TRUSTSTORE_FILE=/bitnami/zookeeper/certs/domain.crs\
registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:latest
日志
docker logs zookeeper
或使用 Docker Compose:
docker-compose logs zookeeper