准备
拉取 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
这台机器对应的节点 id
为 1
,本地目录 /zookeeper/data
挂载为 dataDir
的数据目录,那就直接在这台机器的 /zookeeper/data
目录中创建值为 1
的 myid
文件即可。
这是为了告诉 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
启动。
需要注意 如果是不同机器上启动集群 2181
、2888
、3888
端口都需要暴露,2888
、3888
是集群内部选举及通信的必要端口。如果是同一机器上同一 docker
内部网络内的集群,可以不暴露 2888
、3888
端口。
节点全部启动后,可以使用 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