理解 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 接口
String create(String path, byte data[], Listacl, CreateMode createMode)void create(String path, byte data[], List 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, int version)void setACL(String path, List 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 getChildren(String path, Watcher watcher)List 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 getChildren(String path, Watcher watcher, Stat stat)List 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的变化以事件的形式通知给客户端,主要是一种方向推送的机制,让客户端可以做出及时响应。比如及时更新后端的可用集群服务列表。
参考网站
Watcher/Callback 参考网站
ACL
集群管理
Zookeeper 官方文档
TODO
Zookeeper 一致性