Zookeeper

分布式协调框架

场景

  • 数据发布/订阅(配置中心)
    • 树形结构且节点可存储数据,天然配置中心。
    • 关注节点以接收通知,然后可以动态获取配置信息
  • 命名服务 / 负载均衡
    • 生成全局唯一ID
  • 分布式协调/通知
  • 心跳检测
    • A服务创建临时节点,A关闭后临时节点即断掉
    • B服务查看有多少临时节点,即知道有多少服务活着
  • 集群管理
  • Master选举
    • 选举时,各备选机器创建一个相同临时的znode
    • 谁创建成功,谁成为master
    • 失败的,关注该节点
    • 若master挂掉,其余节点能够立刻感知,从而重新选举
  • 分布式锁和分布式队列
    • 排它锁
      • 临时znode,满足只有一个事务可以获得锁,释放后能通知的功能
    • 共享锁
      • 创建临时有序znode,value标记为 写、读
      • 获取读锁:若比当前节点序号小的都是读锁,则认为获取成功
      • 获取写锁:若自己就是最小节点,则认为获取成功
      • 否则注册监听事件

保证的特性

  • 顺序一致性
    • 同一客户端发起的请求,会按顺序应用到服务器
  • 原子性
    • 事务结果在所有机器上一样
  • 单一视图
    • 客户端连接任意服务器,看到的结果一样
  • 可靠性
    • 持久化
  • 实时性
    • 在一定的时候内,能看到最新的数据

集群角色

  • Leader
  • Follower
  • Observer
    • 默认无该角色
    • 可提供读,不提供写
    • 不参与写的过半写成功策略
    • 不参与 Leader 选举
    • 作用:在不影响写的性能下,增加读性能

数据

[zk: localhost:2181(CONNECTED) 23] get /yarn-leader-election/appcluster-yarn/ActiveBreadCrumb

appcluster-yarnrm1
cZxid = 0x1b00133dc0    //Created ZXID,表示该ZNode被创建时的事务ID
ctime = Tue Jan 03 15:44:42 CST 2017    //Created Time,表示该ZNode被创建的时间
mZxid = 0x1d00000063    //Modified ZXID,表示该ZNode最后一次被更新时的事务ID
mtime = Fri Jan 06 08:44:25 CST 2017    //Modified Time,表示该节点最后一次被更新的时间
pZxid = 0x1b00133dc0    //表示该节点的子节点列表最后一次被修改时的事务ID。注意,只有子节点列表变更了才会变更pZxid,子节点内容变更不会影响pZxid。
cversion = 0    //子节点的版本号
dataVersion = 11    //数据节点的版本号
aclVersion = 0    //ACL版本号
ephemeralOwner = 0x0    //创建该节点的会话的seddionID。如果该节点是持久节点,那么这个属性值为0。
dataLength = 22    //数据内容的长度
numChildren = 0    //子节点的个数

其它概念

Watcher

Watcher(事件监听器),是ZooKeeper中一个很重要的特性。
ZooKeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,ZooKeeper服务端会将事件通知到感兴趣的客户端上去。
该机制是ZooKeeper实现分布式协调服务的重要特性。

事务

能改变zookeeper服务器状态的称为事务,如节点创建、删除、更新等。事务号为zxid

ACL

access control Lists 控制权限

  • CREATE: 创建子节点的权限。
  • READ: 获取节点数据和子节点列表的权限。
  • WRITE:更新节点数据的权限。
  • DELETE: 删除子节点的权限。
  • ADMIN: 设置节点ACL的权限。

ZAB协议

所有事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器被称为Leader服务器,而剩下的其他服务器则成为Follower服务器。
Leader服务器负责将一个客户端事务请求转换成一个事务Proposal(提案)并将该Proposal分发给集群中所有的Follower服务器。
之后Leader服务器需要等待所有Follower服务器的反馈,一旦超过半数的Follower服务器进行了正确的反馈后,
Leader就会再次向所有的Follower服务器分发Commit消息,要求对刚才的Proposal进行提交。

读写过程

写Leader

  • 客户端向Leader发起写请求
  • Leader发送提案给所有Follower并等待ACK
  • 过半Follower回复ACK,Leader自己也有一票ACK,向所有Follower、Observer发送commit
  • 返回结果给客户端

写Follower、Observer

  • 转发给Leader
  • 同写Leader

  • 直接从本地内存读取后返回

选举过程

选举过程

两种模式

恢复模式

服务启动或Leader挂掉后,进入恢复模式。
Leader选举完成,且大部分节点完成状态同步后,退出恢复模式


广播模式

正常维持在广播状态
新节点加入时,会在恢复模式下启动,以完成状态同步

面试问题

如何保证事务的顺序一致性

通过事务号zxid,

  • 高32位:世代号,每次出现新Leader即加1
  • 低32位:每次新事务加1

部署模式

  • 单机
  • 集群
  • 伪集群(单机多实例)

发布于 2020/08/22 浏览