Zookeeper 中的概念
Zookeeper是apache下的一个分布式系统协调框架,被广泛应用到Hadoop、HBase、Kafka、Dubbo等分布式系统中,用于系统各个模块间的协调工作。
Zookeeper提供的API比较原始,这也意味着使用者有很大的灵活性来让它发挥各种功能。
数据节点
- Zookeeper可以看做一个高可用的分布式文件系统,每个文件叫做一个节点。既然是文件系统,节点之间是存在父子关系的,整体组成一个树形结构,如下图:
每个节点都可以保存小于1M的数据。
节点可分为临时/永久节点,顺序/非顺序节点。
临时节点:在客户端会话中断后会被自动删除,可以此判断某些机器/应用的上下线状态
顺序节点:创建节点时Zookeeper可自动为节点名称添加顺序后缀,如”-000001”,可以此实现分布式锁、分布式队列等等需求。
消息通知
- 当节点数据发生变更时,Zookeeper会给订阅了此事件的客户端发送通知。包括的事件类型有:
- 节点创建
- 节点删除
- 节点数据变更
- 子节点列表变更
部署方式
- 可部署在多个机器上,形成集群。
- 在大于一半的机器正常运行时,集群可正常提供服务
- 客户端在连接Zookeeper服务时,提供一串host:port地址,客户端可自动实现失败重连,且连接的不是某一个特定服务器。
Zookeeper 的 Java API
1.创建节点(create)
2.删除节点(delete)
3.获取子节点列表(getChildren)
获取时可选择监听子节点列表变化的事件
4.获取数据(getData)
5.更新数据(setData)
注意更新数据时,需要传入version
参数。version
相当于CAS操作中check的预期值,可用于解决分布式同步更新问题。当version
值为-1时表示不需要检查操作。
6.检测节点是否存在(exists)
可在此监听节点创建、更新、删除操作。关于子节点的变化不会在这个接口处通知
7.权限控制
addAuthInfo()
方法。
特殊:对于删除操作而言,权限控制适用于目标节点的子节点。目标节点仍然能被自由地删除
开源客户端
ZkClient
- 将会话创建过程同步化
- 实现序列化机制
- 功能更方便的API方法
- listener一次注册,一直有效
Curator
- Apache的顶级项目,广泛使用
- 封装了细节操作,fluent风格的API
- 实现了高级应用场景的功能:master选举、分布式锁、分布式计数器、分布式Barrier
参考书:《从PAXOS到ZOOKEEPER分布式一致性原理与实践》
遗留问题:
- client如果访问到了一个server,它内存中的数据此时还不是最新的,会怎么样?会先进行同步吗?