Docker 部署 Zookeeper 3.8.0

Docker 部署 Zookeeper 3.8.0

Cocytus Elias 65 2023-02-04

前言

本文记录使用 docker 部署 Zookeeper 3.8.0 多节点集群的过程。

准备

拉取 zookeeper 镜像:docker pull zookeeper:3.8.0

配置文件

创建配置文件,用于后续使用。zookeeper 的配置文件名为 zoo.cfg

zookeeper 3.8.0 配置文件如下:

# ZooKeeper 使用的基本时间单位,以毫秒为单位。它用于执行心跳,最小会话超时将是 tickTime 的两倍。
tickTime=2000

# 集群中的 ZooKeeper 节点必须连接到 leader 的超时时间。
initLimit=10

# 集群中的 ZooKeeper 节点与 leader 链接的过期时间。
syncLimit=5

# 存储内存数据库快照的位置,除非另有说明,否则存储更新数据库的事务日志。
dataDir=/data

# dataDir 中的快照数量
autopurge.snapRetainCount=5

# 存储事务日志的目录。
dataLogDir=/datalog

# 侦听客户端连接的端口。
clientPort=2181

# 客户端最大连接数
maxClientCnxns=60

# 清除任务间隔的小时数,设置为“0”则禁用自动清除功能。
autopurge.purgeInterval=0

# 启用 Prometheus 指标导出。
metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider

# 启用 Prometheus 的 Jvm 指标导出。 
metricsProvider.exportJvmInfo=true

# Prometheus 指标导出的工作线程数。默认值为 1。如果数字小于 1,将使用主线程。。 
metricsProvider.numWorkerThreads=1

# Prometheus 指标导出任务的最大队列大小。 默认值为 1000000。
metricsProvider.maxQueueSize=1000000

# Prometheus 指标导出的 Jetty HTTP 监听地址。
metricsProvider.httpHost=0.0.0.0

# Prometheus 指标导出的 Jetty HTTP 监听端口。
metricsProvider.httpPort=7000

# 集群内节点列表,格式为 server.id=host:raftPort:internalPort
# id 为集群内当前节点的标识,统一集群内节点之间不能重复,只能为1-255之间的任意值。
# host 为对应节点的地址,可以为域名或ip,不携带 http:// 或 https:// 等协议头。本机的节点地址建议设置为 0.0.0.0。比如 id 为 2 的节点网络地址为 exampleHost2,但是id 为 2 的节点配置上需要将 exampleHost2 改为 0.0.0.0,这样做的目的是为了避免出现地址绑定失败的问题。
# raftPort 选举端口,默认为 2888。
# internalPort 内部通信端口,默认为 3888。
# 下面的示例代表的是一个三节点的集群。集群内节点数量建议是奇数,因为 zk 集群需要过半节点正常才能运行,奇数个 与 奇数+1个节点的过半节点相同。比如 3 节点集群需要 2 个以上节点正常,4 节点集群也是需要 2 个以上节点正常。使用奇数能够节省一定的服务器资源,不差钱的除外。
server.1=exampleHost1:2888:3888
server.2=exampleHost2:2888:3888
server.3=exampleHost3:2888:3888

ID 文件

创建用于挂载 dataDir 对应数据目录的本地目录,并在其中创建 myid 文件,里面写上当前节点的 id 编号即可。

比如,exampleHost1 这台机器对应的节点 id1,本地目录 /zookeeper/data 挂载为 dataDir 的数据目录,那就直接在这台机器的 /zookeeper/data 目录中创建值为 1myid 文件即可。

这是为了告诉 zookeeper 节点它是哪个节点。

部署及启动

接下来以 /zookeeper/data 作为本地数据目录,/zookeeper/log 作为本地事务日志目录,/zookeeper/conf/zoo.cfg 作为本地配置文件存储位置。

记得 /zookeeper/data 需要有 myid 文件哦。

使用命令 docker run -d -e TZ="Asia/Shanghai" -p 2181:2181 -p 2888:2888 -p 3888:3888 -v /zookeeper/data:/data -v /zookeeper/log:/datalog -v /zookeeper/conf/zoo.cfg:/conf/zoo.cfg --name zookeeper zookeeper:3.8.0 启动。

需要注意 如果是不同机器上启动集群 218128883888 端口都需要暴露,28883888 是集群内部选举及通信的必要端口。如果是同一机器上同一 docker 内部网络内的集群,可以不暴露 28883888 端口。

节点全部启动后,可以使用 docker exec -it zookeeper /bin/sh 进入容器后,使用 /apache-zookeeper-3.8.0-bin/bin/zkServer.sh status 确定集群状态,正常集群状态输出如下:

ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower