理解 zookeeper
Zookeeper 主要用来解决分布式应用中经常遇到的一些数据管理,如统一命名服务器、状态同步服务、集群管理、分布式应用配置项的管理。
节点特性
- 同一时刻多台机器创建同一个节点,只有一个会争抢成功。利用这个特性可以做分布式锁。
- 临时节点的生命周期与会话一致,会话关闭则临时节点删除。利用这个特性经常来做心跳,动态监控,负载等动作。
- 顺序节点保证节点名全局唯一。这个特性可以用来生成分布式环境下的全局自增长id。
zookeeper 提供的服务
- 创建节点
- 删除节点
- 更新节点
- 获取节点信息
- 权限控制
- 事件监听
Zookeeper的集群对server进行了归类:
- Leader
- Follower
- Observer
Zookeeper 作用(使用场景)
- 配置中心 – Zookeeper 的目录结构比较特殊,可以这个特性作为分布式的配置中心,当配置内容发生更新可以及时通知各服务器进行更新
- 集群选举 – 当某一个服务宕机或者整个服务重启,可根据Zookeeper节点的顺序一致性来选择最大节点或者最小节点作为leader
- 分布式锁 – 原理同集群选举,根据节点的顺序一致性来选择最小节点对应的那个服务获得锁,当服务执行完成删除节点就会释放锁,再由其他服务去争取锁。
- 注册中心 – Zookeeper的目录以及子节点。主要通过对节点的管理做到发布以及事件监听做到订阅。
- 队列管理
- 同步队列
当一个队列的队员都聚气时,队列才可用,否则一直等待所有的成员到达,这种是同步队列
创建一个父目录/synchronizing
,每个成员都监控标志(Set Watch)位目录/synchronizing/start
是否存在,然后每个成员都加入这个队列,加入队列的方式就是创建/synchronizing/member_i
的临时目录节点,然后每个成员获取、synchronizing
目录的所有目录节点,也就是 member_i,判断 i 的值是否已经是成员的目录,如果小于成员个数就等待synchronizing/start
的出现,如果相等就创建synchronizing/start
- 异步队列 队列按照FIFO方式进行入队和出队操作,例如实现生产者和消费者模型。
保证所有成员加入队列时都是有编号的,出队是通过getChildren() 方法可以返回当前所有的队列元素,然后消费其中最小的元素。
- 同步队列
Zookeeper 在分布式中的作用:
使用Zookeeper提供分布式锁机制,从而实现分布式的一致性处理。
- Barrier
- Queue
- Lock
- 2PC
Java Api 接口
1 | String create(String path, byte data[], List<ACL> acl, CreateMode createMode) |
接口说明
- 每一种安同步还是异步
- 添加指定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的变化以事件的形式通知给客户端,主要是一种方向推送的机制,让客户端可以做出及时响应。比如及时更新后端的可用集群服务列表。
参考网站
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 一致性