Zookeeper 部署有三种方式,单机模式、集群模式、伪集群模式,以下采用 Docker 的方式部署

注意: 集群为大于等于3个奇数,如 3、5、7,不宜太多,集群机器多了选举和数据同步耗时长,不稳定。

  1. docker pull zookeeper:3.5.4-beta
  2. docker run --name zookeeper -p 2181:2181 --restart always -d zookeeper:3.5.4-beta

1. 单机模式

  • docker-compose.yml
  1. version: '3.1'
  2. services:
  3. zoo1:
  4. image: zookeeper
  5. restart: always
  6. ports:
  7. - 2181:2181
  8. environment:
  9. ZOO_MY_ID: 1
  10. ZOO_SERVERS: server.1=121.43.162.28:2888:3888
验证是否安装成功
  • 以交互的方式进入容器

docker exec -it zookeeper_zoo1_1 /bin/bash

  • 使用客户端连接到服务端
  1. bash-4.3# ./bin/zkCli.sh -server 192.168.75.130:2181
  2. Connecting to 192.168.75.130:2181
  3. 2017-11-09 07:45:58,365 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
  4. 2017-11-09 07:45:58,374 [myid:] - INFO [main:Environment@100] - Client environment:host.name=zoo1
  5. 2017-11-09 07:45:58,374 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.8.0_131
  6. 2017-11-09 07:45:58,380 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
  7. 2017-11-09 07:45:58,381 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/usr/lib/jvm/java-1.8-openjdk/jre
  8. 2017-11-09 07:45:58,381 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/zookeeper-3.4.10/bin/../build/classes:/zookeeper-3.4.10/bin/../build/lib/*.jar:/zookeeper-3.4.10/bin/../lib/slf4j-log4j12-1.6.1.jar:/zookeeper-3.4.10/bin/../lib/slf4j-api-1.6.1.jar:/zookeeper-3.4.10/bin/../lib/netty-3.10.5.Final.jar:/zookeeper-3.4.10/bin/../lib/log4j-1.2.16.jar:/zookeeper-3.4.10/bin/../lib/jline-0.9.94.jar:/zookeeper-3.4.10/bin/../zookeeper-3.4.10.jar:/zookeeper-3.4.10/bin/../src/java/lib/*.jar:/conf:
  9. 2017-11-09 07:45:58,381 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server:/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64:/usr/lib/jvm/java-1.8-openjdk/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
  10. 2017-11-09 07:45:58,381 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
  11. 2017-11-09 07:45:58,381 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA>
  12. 2017-11-09 07:45:58,381 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux
  13. 2017-11-09 07:45:58,382 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=amd64
  14. 2017-11-09 07:45:58,382 [myid:] - INFO [main:Environment@100] - Client environment:os.version=4.4.0-98-generic
  15. 2017-11-09 07:45:58,386 [myid:] - INFO [main:Environment@100] - Client environment:user.name=root
  16. 2017-11-09 07:45:58,386 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/root
  17. 2017-11-09 07:45:58,386 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/zookeeper-3.4.10
  18. 2017-11-09 07:45:58,389 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=192.168.75.130:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@3eb07fd3
  19. 2017-11-09 07:45:58,428 [myid:] - INFO [main-SendThread(192.168.75.130:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server 192.168.75.130/192.168.75.130:2181. Will not attempt to authenticate using SASL (unknown error)
  20. Welcome to ZooKeeper!
  21. JLine support is enabled
  22. 2017-11-09 07:45:58,529 [myid:] - INFO [main-SendThread(192.168.75.130:2181):ClientCnxn$SendThread@876] - Socket connection established to 192.168.75.130/192.168.75.130:2181, initiating session
  23. [zk: 192.168.75.130:2181(CONNECTING) 0] 2017-11-09 07:45:58,573 [myid:] - INFO [main-SendThread(192.168.75.130:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server 192.168.75.130/192.168.75.130:2181, sessionid = 0x15f9fbc12ec0000, negotiated timeout = 30000
  24. WATCHER::
  25. WatchedEvent state:SyncConnected type:None path:null
  • 使用服务端工具检查服务器状态
  1. bash-4.3# ./bin/zkServer.sh status
  2. ZooKeeper JMX enabled by default
  3. Using config: /conf/zoo.cfg
  4. Mode: standalone

2. 真实集群模式(三台服务器)

准备 3 台 Ubuntu Server 系统,并分别配置 Zookeeper
第1台主机
  • docker-compose.yml
  1. version: '3.1'
  2. services:
  3. zoo1:
  4. image: zookeeper
  5. restart: always
  6. network_mode: host
  7. environment:
  8. ZOO_MY_ID: 1
  9. ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=47.96.100.166:2888:3888 server.3=118.24.136.237:2888:3888
ps:当前服务的ip不能用真实ip,必须用0.0.0.0,不然启动会报错,集群失败(排查好久的教训)
  • 验证测试
  1. root@UbuntuBase:/usr/local/docker/zookeeper# docker exec -it zookeeper_zoo1_1 /bin/bash
  2. bash-4.3# ./bin/zkServer.sh status
  3. ZooKeeper JMX enabled by default
  4. Using config: /conf/zoo.cfg
  5. Mode: leader
  • 查看集群的运行状态
使用nc命令。通过nc命令连接到指定的ZooKeeper服务器, 然后发送stat可以查看服务的状态。
  1. $ echo stat | nc 121.43.162.28 2181
  2. Zookeeper version: 3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
  3. Clients:
  4. /192.168.1.102:48174[0](queued=0,recved=1,sent=0)
  5. Latency min/avg/max: 0/0/0
  6. Received: 1
  7. Sent: 0
  8. Connections: 1
  9. Outstanding: 0
  10. Zxid: 0x100000002
  11. Mode: follower
  12. Node count: 4
第2台主机
  • docker-compose.yml
  1. version: '3.1'
  2. services:
  3. zoo2:
  4. image: zookeeper
  5. restart: always
  6. network_mode: host
  7. environment:
  8. ZOO_MY_ID: 2
  9. ZOO_SERVERS: server.1=121.43.162.28:2888:3888 server.2=0.0.0.0:2888:3888 server.3=118.24.136.237:2888:3888
ps:当前服务的ip不能用真实ip,必须用0.0.0.0,不然启动会报错,集群失败(排查好久的教训)
  • 验证测试
  1. root@UbuntuBase:/usr/local/docker/zookeeper# docker exec -it zookeeper_zoo2_1 /bin/bash
  2. bash-4.3# ./bin/zkServer.sh status
  3. ZooKeeper JMX enabled by default
  4. Using config: /conf/zoo.cfg
  5. Mode: follower
第3台主机
  • docker-compose.yml
  1. version: '3.1'
  2. services:
  3. zoo3:
  4. image: zookeeper
  5. restart: always
  6. network_mode: host
  7. environment:
  8. ZOO_MY_ID: 3
  9. ZOO_SERVERS: server.1=121.43.162.28:2888:3888 server.2=47.96.100.166:2888:3888 server.3=0.0.0.0:2888:3888
ps:当前服务的ip不能用真实ip,必须用0.0.0.0,不然启动会报错,集群失败(排查好久的教训)
  • 验证测试
  1. root@UbuntuBase:/usr/local/docker/zookeeper# docker exec -it zookeeper_zoo3_1 /bin/bash
  2. bash-4.3# ./bin/zkServer.sh status
  3. ZooKeeper JMX enabled by default
  4. Using config: /conf/zoo.cfg
  5. Mode: follower

3. 伪集群模式

  • docker-compose.yml
  1. version: '3.1'
  2. services:
  3. zoo1:
  4. image: zookeeper
  5. restart: always
  6. hostname: zoo1
  7. ports:
  8. - 2181:2181
  9. environment:
  10. ZOO_MY_ID: 1
  11. ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
  12. zoo2:
  13. image: zookeeper
  14. restart: always
  15. hostname: zoo2
  16. ports:
  17. - 2182:2181
  18. environment:
  19. ZOO_MY_ID: 2
  20. ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zoo3:2888:3888
  21. zoo3:
  22. image: zookeeper
  23. restart: always
  24. hostname: zoo3
  25. ports:
  26. - 2183:2181
  27. environment:
  28. ZOO_MY_ID: 3
  29. ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=0.0.0.0:2888:3888
验证是否安装成功
  • 分别以交互方式进入容器查看
  1. docker exec -it zookeeper_zoo1_1 /bin/bash
  2. docker exec -it zookeeper_zoo2_1 /bin/bash
  3. docker exec -it zookeeper_zoo3_1 /bin/bash
  • 使用服务端工具检查服务器状态
  1. root@UbuntuBase:/usr/local/docker/zookeeper# docker exec -it zookeeper_zoo1_1 /bin/bash
  2. bash-4.3# ./bin/zkServer.sh status
  3. ZooKeeper JMX enabled by default
  4. Using config: /conf/zoo.cfg
  5. Mode: follower
  6. root@UbuntuBase:/usr/local/docker/zookeeper# docker exec -it zookeeper_zoo2_1 /bin/bash
  7. bash-4.3# ./bin/zkServer.sh status
  8. ZooKeeper JMX enabled by default
  9. Using config: /conf/zoo.cfg
  10. Mode: follower
  11. root@UbuntuBase:/usr/local/docker/zookeeper# docker exec -it zookeeper_zoo3_1 /bin/bash
  12. bash-4.3# ./bin/zkServer.sh status
  13. ZooKeeper JMX enabled by default
  14. Using config: /conf/zoo.cfg
  15. Mode: leader
从上面的验证结果可以看出:zoo1 为跟随者,zoo2 为跟随者,zoo3 为领导者