简介
Zookeeper是一个分布式协调服务; 就是为分布式应用程序提供服务的。
此文漫画:什么是ZooKeeper?生动活泼的介绍了了zookeeper。
ZooKeeper提供的常见服务如下 :
-
命名服务
-
配置管理
-
分布式锁
-
数据发布和订阅
安装
为了快速测试和了解, 我们仅用docker来安装单机版zookeeper。
搜索
docker search zookeeper
-->
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
zookeeper Apache ZooKeeper is an open-source server wh… 934 [OK]
jplock/zookeeper Builds a docker image for Zookeeper version … 166 [OK]
wurstmeister/zookeeper 129 [OK]
mesoscloud/zookeeper ZooKeeper 73 [OK]
bitnami/zookeeper ZooKeeper is a centralized service for distr… 42 [OK]
...
<--
安装
docker安装单机版
我们就用第一个 官方的zookeeper
docker pull zookeeper
docker run -d \
-p 2181:2181 \
-v /mysoft/zookeeper/data/:/data/ \
--name=zookeeper \
--privileged zookeeper
查看一下docker容器
docker ps
-->
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95a42cb4c33e zookeeper "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp zookeeper
<--
进入 zkCli.sh
docker exec -it zookeeper /bin/bash
## 注意目录结构
./zkCli.sh
# 运行完,你会发现命令行和之前不一样了
-->
[zk: localhost:2181(CONNECTED) 0]
[zk: localhost:2181(CONNECTED) 0]
[zk: localhost:2181(CONNECTED) 0]
<--
ls /
ZooKeeper 重要概念解读
数据结构
ZooKeeper 是树形数据模型, 数据是存储在数据节点上的, 每个数据节点在 ZooKeeper 中被称为 znode,它是 ZooKeeper 中数据的最小单元。
znode有4中数据类型:
- 持久(PERSISTENT)节点 :一旦创建就一直存在即使 ZooKeeper 集群宕机,直到将其删除。
- 临时(EPHEMERAL)节点 :临时节点的生命周期是与 客户端会话(session) 绑定的,会话消失则节点消失 。并且,临时节点只能做叶子节点 ,不能创建子节点。
- 持久顺序(PERSISTENT_SEQUENTIAL)节点 :除了具有持久(PERSISTENT)节点的特性之外, 子节点的名称还具有顺序性。比如
/node1/app0000000001
、/node1/app0000000002
。 - 临时顺序(EPHEMERAL_SEQUENTIAL)节点 :除了具备临时(EPHEMERAL)节点的特性之外,子节点的名称还具有顺序性。
Watcher(事件监听器)
Watcher(事件监听器),是 ZooKeeper 中的一个很重要的特性。ZooKeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性。
分布式锁
maven
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.1.0</version>
</dependency>
说到分布式锁, 我们首先要想到的就是基于zookeeper的分布式锁, 基于mysql的分布式锁和基于redis的分布式锁。
zookeeper分布式锁机制
Zookeeper实现分布式锁的流程,假设锁空间的根节点为/zklock:
1,客户端连接zookeeper,并在/zklock下创建临时的且有序的子节点。
第一个客户端对应的子节点为:/zklock/test_lock_0000000000,第二个为:/zklock/test_lock_0000000001。以此类推。
2,客户端获取/zklock下的子节点列表,判断自己创建的子节点是否为当前子节点列表中序号最小的子节点,如果是则认为获得锁,否则监听/zklock的子节点变更消息,获得子节点变更通知后重复此步骤直至获得锁;
3,执行业务代码。
4,完成业务流程后,删除对应的子节点并释放锁。
部分代码
在使用了curator框架后, 使用就不需要实现上面的许多细节了。
// 获取一个互斥锁
InterProcessMutex mutex = new InterProcessMutex(client, zk_root_lock +"/lock0");
// 获取锁
mutex.acquire(1, TimeUnit.SECONDS);
// dosomething
// 释放锁
mutex.release();
更多参考: