逍遥游

基于Docker Swarm搭建Zookeeper集群

前言

Zookeeper算是我基于docker搭建的第一个集群吧,当时折腾了好久,主要是网络互连的问题。经过反复测试,我发现,当且仅当两个实例分配在同一个节点上时才能互连,不同节点上的zookeeper实例无法连接。后来尝试把endpoint-mode改成dnsrr之后就又可以了(默认是vip),不知道为什么。

实例(dnsrr模式)

以组建拥有3个zookeeper节点的集群为例
三个节点分别是:zookeeper_node1、zookeeper_node2、zookeeper_node3

依次启动3个实例

1
2
3
4
5
6
7
8
docker service create \
-e MYID=${i} \
-e SERVERS=zookeeper_node1,zookeeper_node2,zookeeper_node3 \
--replicas 1 \
--network swarm-net \
--endpoint-mode dnsrr \
--name=zookeeper_node${i} \
mesoscloud/zookeeper:3.4.8-ubuntu-14.04

脚本里的${i}需要修改

完整脚本:start_zookeeper.sh

检查集群是否正常建立

1
2
docker exec -it zookeeper_node1.xxxxxxxxxxxxxx bash #进入某一容器
/opt/zookeeper/bin/zkServer.sh status # 查看zookeeper集群状态

vip模式

docker 1.13 版本开始支持指定swarm mode的hostname,尝试了一下,发现原先的脚本把hostname指定成跟name一样就可以以vip模式运行了,不得其解。

1
2
3
4
5
6
7
8
9
docker service create \
-e MYID=${i} \
-e SERVERS=zookeeper_node1、zookeeper_node2、zookeeper_node3 \
--replicas 1 \
--network swarm-net \
--hostname zookeeper_node${i} \
--endpoint-mode vip \
--name=zookeeper_node${i} \
mesoscloud/zookeeper:3.4.8-ubuntu-14.04

脚本里的${i}需要修改
完整脚本:start_zookeeper_vip.sh

持久化

建议加上持久化,docker swarm现在还不稳定,持久化数据可以保证重启后数据不会丢失

1
--mount type=bind,src=/mnt/data/zookeeper/node${i},dst=/tmp/zookeeper


多说停止服务,disqus引导注册太过分,暂时不上评论系统了。有机会自己造轮子吧。邮箱:input@newnius.com