理解 zookeeper

理解 zookeeper

Zookeeper 主要用来解决分布式应用中经常遇到的一些数据管理,如统一命名服务器、状态同步服务、集群管理、分布式应用配置项的管理。

节点特性

  1. 同一时刻多台机器创建同一个节点,只有一个会争抢成功。利用这个特性可以做分布式锁。
  2. 临时节点的生命周期与会话一致,会话关闭则临时节点删除。利用这个特性经常来做心跳,动态监控,负载等动作。
  3. 顺序节点保证节点名全局唯一。这个特性可以用来生成分布式环境下的全局自增长id。

zookeeper 提供的服务

  1. 创建节点
  2. 删除节点
  3. 更新节点
  4. 获取节点信息
  5. 权限控制
  6. 事件监听

Zookeeper的集群对server进行了归类:

  • Leader
  • Follower
  • Observer

Zookeeper 作用(使用场景)

  1. 配置中心 – Zookeeper 的目录结构比较特殊,可以这个特性作为分布式的配置中心,当配置内容发生更新可以及时通知各服务器进行更新
  2. 集群选举 – 当某一个服务宕机或者整个服务重启,可根据Zookeeper节点的顺序一致性来选择最大节点或者最小节点作为leader
  3. 分布式锁 – 原理同集群选举,根据节点的顺序一致性来选择最小节点对应的那个服务获得锁,当服务执行完成删除节点就会释放锁,再由其他服务去争取锁。
  4. 注册中心 – Zookeeper的目录以及子节点。主要通过对节点的管理做到发布以及事件监听做到订阅。
  5. 队列管理
    1. 同步队列
      当一个队列的队员都聚气时,队列才可用,否则一直等待所有的成员到达,这种是同步队列
      创建一个父目录 /synchronizing ,每个成员都监控标志(Set Watch)位目录 /synchronizing/start 是否存在,然后每个成员都加入这个队列,加入队列的方式就是创建 /synchronizing/member_i 的临时目录节点,然后每个成员获取 、synchronizing 目录的所有目录节点,也就是 member_i,判断 i 的值是否已经是成员的目录,如果小于成员个数就等待 synchronizing/start 的出现,如果相等就创建synchronizing/start
    2. 异步队列 队列按照FIFO方式进行入队和出队操作,例如实现生产者和消费者模型。
      保证所有成员加入队列时都是有编号的,出队是通过getChildren() 方法可以返回当前所有的队列元素,然后消费其中最小的元素。

Zookeeper 在分布式中的作用:

使用Zookeeper提供分布式锁机制,从而实现分布式的一致性处理。

  • Barrier
  • Queue
  • Lock
  • 2PC

Java Api 接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
String create(String path, byte data[], List<ACL> acl, CreateMode createMode)
void create(String path, byte data[], List<ACL> acl, CreateMode createMode, StringCallback cb, Object ctx)

void delete(String path, int version)
void delete(String path, int version, VoidCallback cb, Object ctx)

Stat setData(String path, byte data[], int version)
void setData(String path, byte data[], int version, StatCallback cb, Object ctx)

Stat setACL(String path, List<ACL> acl, int version)
void setACL(String path, List<ACL> acl, int version, StatCallback cb, Object ctx)

Stat exists(String path, Watcher watcher)
Stat exists(String path, boolean watch)
void exists(String path, Watcher watcher, StatCallback cb, Object ctx)
void exists(String path, boolean watch , StatCallback cb, Object ctx)

byte[] getData(String path, Watcher watcher, Stat stat)
byte[] getData(String path, boolean watch , Stat stat)
void getData(String path, Watcher watcher, DataCallback cb, Object ctx)
void getData(String path, boolean watch , DataCallback cb, Object ctx)

List<String> getChildren(String path, Watcher watcher)
List<String> getChildren(String path, boolean watch )
void getChildren(String path, Watcher watcher, ChildrenCallback cb, Object ctx)
void getChildren(String path, boolean watch , ChildrenCallback cb, Object ctx)

List<String> getChildren(String path, Watcher watcher, Stat stat)
List<String> getChildren(String path, boolean watch , Stat stat)
void getChildren(String path, Watcher watcher, Children2Callback cb, Object ctx)
void getChildren(String path, boolean watch , Children2Callback cb, Object ctx)

接口说明

  • 每一种安同步还是异步
  • 添加指定watcher还是默认watcher分为4中。默认watcher在Zookeeper 初始化中进行指定。
  • 如果包含boolean watch 的读方法传入true,则将默认为watcher注册为所关注事件的watch。如果传入false则不注册watch。

CreateMode

  • PERSISTENT 持续的。相比与EPHEMERAL,不会随着client session的close或者expire而消失
  • PERSISTENT_SEQUENTIAL
  • EPHEMERAL 短暂的,生命周期依赖于client session、对应session close/expire 后其znode也会消失。
  • EPHEMERAL_SEQUENTIAL SEQUENTIAL意为顺序的。

Zookeeper 为了解决数据的一致性,使用Watcher的异步回调接口,将服务器znode的变化以事件的形式通知给客户端,主要是一种方向推送的机制,让客户端可以做出及时响应。比如及时更新后端的可用集群服务列表。

参考网站

Zookeeper Api(java)入门与应用(转)

保证分布式系统数据一致性的6种方案

解决分布式系统的一致性问题,我们需要了解哪些理论

分布式系统的事务处理

ZooKeeper典型应用场景一览

zookeeper中的基本概念

Watcher/Callback 参考网站

http://luzengyi.blog.163.com/blog/static/529188201064113744373/
http://luzengyi.blog.163.com/blog/static/529188201061155444869/

ACL

http://rdc.taobao.com/team/jm/archives/947

集群管理

paxos 实现
paxos算法介绍续
zookeeper代码解析

Zookeeper 官方文档

http://zookeeper.apache.org/doc/r3.3.2/recipes.html

TODO

Zookeeper 一致性