Zookeeper-入门

简介

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();

项目demo代码

更多参考:

分布式锁之Zookeeper,

ZooKeeper分布式锁机制

Zookeeper 分布式锁 - 图解 - 秒懂

zookeepertoos 一个大神写的可视化工具