ZooKeeper

ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.

ZAB Protocol

ZooKeeper Atomic Broadcast

客户端在使用 Zookeeper 服务时会随机连接到集群中的一个节点,所有的读请求都会由当前节点处理,而写请求会被路由给主节点并由主节点向其他节点广播事务,与 2PC 非常相似,如果在所有的节点中超过一半都返回成功,那么当前写请求就会被提交。

当主节点崩溃时,其他的 Replica 节点会进入崩溃恢复模式并重新进行选举,Zab 协议必须确保提交已经被 Leader 提交的事务提案,同时舍弃被跳过的提案,这也就是说当前集群中最新 ZXID 最大的服务器会被选举成为 Leader 节点;但是在正式对外提供服务之前,新的 Leader 也需要先与 Follower 中的数据进行同步,确保所有节点拥有完全相同的提案列表。

ZXID 是 Zab 协议中设计的事务编号,它是一个 64 位的整数,其中最低的 32 位是一个计数器,每当客户端修改 Zookeeper 集群状态时,Leader 都会以当前 ZXID 值作为提案的编号创建一个新的事务,在这之后会将当前计数器加一;ZXID 中高的 32 位表示当前 Leader 的任期,每当发生崩溃进入恢复模式,集群的 Leader 重新选举之后都会将 epoch 加一。

ZooKeeper 实战与源码剖析 - GeekTime

scenario

  • configuration management
  • DNS-like service
  • group membership management
  • distributed lock

basic knowledges

  • data tree 接口
    • 使用 UNIX 风格的路径名来定位 znode, 例如 /A/X 表示 znode A 的子节点 X
    • znode 的数据只支持全量写入和读取
    • data tree 的所有 API 都是 wait-free 的. 只在执行的 API 调用不会影响其他 API 的完成
    • data tree 的 API 都是对文件系统的 wait-free 操作, 不再提供锁这样的分布式协同机制
  • ZNODE
    • persistent
    • ephemeral
    • persistent-sequential
    • ephemeral-sequential

real world examples

References

Get Things Done
Built with Hugo
Theme Stack designed by Jimmy