zooKeeper3.9集群docker-compose搭建

1. 架构设计说明

1.1 集群拓扑

  • 3 节点 ZooKeeper(奇数节点,避免脑裂

  • 使用 同一 Docker 网络

  • 每个节点:

    • 独立 dataDir
    • 独立 dataLogDir
    • 明确 myid
  • 暴露:

    • clientPort:2181
    • follower 通信:2888
    • leader 选举:3888

1.2 通信关系

graph TD
    C[Client] --> ZK1[ZooKeeper-1]
    C --> ZK2[ZooKeeper-2]
    C --> ZK3[ZooKeeper-3]

    ZK1 <--> ZK2
    ZK2 <--> ZK3
    ZK1 <--> ZK3

2. 目录结构规划

1
2
3
4
5
6
7
8
zookeeper/
├── docker-compose.yml
├── zk1/
│ └── data/
├── zk2/
│ └── data/
├── zk3/
│ └── data/

说明:

  • myid 会自动写入 data/myid
  • 日志与快照统一放在 /data

3. docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
version: "3.8"

networks:
zk-net:
driver: bridge

services:
zk1:
image: zookeeper:3.9
container_name: zk1
hostname: zk1
restart: always
ports:
- "2181:2181"
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: >
server.1=zk1:2888:3888;2081
server.2=zk2:2888:3888;2081
server.3=zk3:2888:3888;2081
ZOO_MAX_CLIENT_CNXNS: 1000
JVMFLAGS: "-Xms512m -Xmx512m"
volumes:
- ./zk1/data:/data
networks:
- zk-net

zk2:
image: zookeeper:3.9
container_name: zk2
hostname: zk2
restart: always
ports:
- "2182:2181"
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: >
server.1=zk1:2888:3888;2081
server.2=zk2:2888:3888;2081
server.3=zk3:2888:3888;2081
ZOO_MAX_CLIENT_CNXNS: 1000
JVMFLAGS: "-Xms512m -Xmx512m"
volumes:
- ./zk2/data:/data
networks:
- zk-net

zk3:
image: zookeeper:3.9
container_name: zk3
hostname: zk3
restart: always
ports:
- "2183:2181"
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: >
server.1=zk1:2888:3888;2081
server.2=zk2:2888:3888;2081
server.3=zk3:2888:3888;2081
ZOO_MAX_CLIENT_CNXNS: 1000
JVMFLAGS: "-Xms512m -Xmx512m"
volumes:
- ./zk3/data:/data
networks:
- zk-net

4. 启动与验证

4.1 启动

1
docker-compose up -d

4.2 查看状态

1
docker ps

4.3 验证角色(Leader / Follower)

1
2
3
4
5
6
7
8
9
10
11
mac@GaGa ~ % for id in 1 2 3; do  docker exec -it zk${id} bash -c "./bin/zkServer.sh status"; done

JMX enabled by default
Using config: /conf/zoo.cfg
Mode: follower
JMX enabled by default
Using config: /conf/zoo.cfg
Mode: follower
JMX enabled by default
Using config: /conf/zoo.cfg
Mode: leader

你应该看到:

  • 1 个 Mode: leader
  • 2 个 Mode: follower

5. 生产级优化建议

5.1 JVM 内存限制

1
2
environment:
JVMFLAGS: "-Xms512m -Xmx512m"

5.2 磁盘 IO 分离

1
2
3
volumes:
- ./zk1/data:/data
- ./zk1/datalog:/datalog

并加:

1
ZOO_DATA_LOG_DIR: /datalog

5.3 Tick & 会话调优

1
2
3
4
ZOO_TICK_TIME: 2000
ZOO_INIT_LIMIT: 10
ZOO_SYNC_LIMIT: 5
ZOO_MAX_CLIENT_CNXNS: 200