前言
关于分布式锁,之前一直使用的是redis分布式锁,最近研究了一下zookeeper的分布式锁,zookeeper的机制让他更适合做锁,后面的节点会通过监听前一个节点的设计方式比较喜欢,想实践一下。因此先搭建一个zookeeper集群,直接用docker来构建无疑是快中之快。
docker先行之构建zk集群
# 直接run最新版本的zk
docker run --name my_zookeeper -d zookeeper:latest
# 查看日志
docker logs -f my_zookeeper
日志输出截图
# 直接连接zk
docker run -it --rm --link my_zookeeper:zookeeper zookeeper zkCli.sh -server zookeeper
连接成功并进行简单指令
基于docker构建zk单节点就完成了。
docker-compose快速构建zookeeper集群
话不多说,直接上docker-compose.yml文件,这里有个注意的点,我这里使用的zookeeper版本是3.4.12并没有用最新版本,原因是我使用最新版本构建集群的时候,通过客户端连接会报socket相关的错误,查看了相关issue发现应该是高版本的问题,所以降低了版本。
version: '2'
services:
zoo1:
image: zookeeper:3.4.12
restart: always
container_name: zoo1
ports:
- "2181:2181"
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
zoo2:
image: zookeeper:3.4.12
restart: always
container_name: zoo2
ports:
- "2182:2181"
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
zoo3:
image: zookeeper:3.4.12
restart: always
container_name: zoo3
ports:
- "2183:2181"
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
启动集群并且查看
查看自动构建的网络:zookeeper_default
使用 Docker 命令行客户端连接 ZK 集群
docker run -it --rm \
--link zoo1:zk1 \
--link zoo2:zk2 \
--link zoo3:zk3 \
--net zookeeper_default \
zookeeper zkCli.sh -server zk1:2181,zk2:2181,zk3:2181
可以看到,连接成功,并且可以执行命令。
检查集群状态
# 这里的端口换成刚才构建zk的三个端口分别查看
echo stat | nc 127.0.0.1 2181
我们可以看到三个节点,一个是leader另外两个是follower。至此,可以开始下一步zookeeper分布式锁的开发了。