ZK内部实现——Paxos到Zookeeper(二)

系统模型

数据模型

  • 一颗树,每个节点称为ZNode。
  • 事务ID(ZXID),改变zk状态的操作分配全局唯一的事务id。
    • 包括节点的增删,节点数据修改,会话创建和失效等。

节点

  • 节点类型。
    • 持久节点。创建直到主动删除。
    • 持久顺序节点。zk中父节点维护第一级子节点顺序,创建时该节点加上数字后缀,最大int最大值。
    • 临时节点。 创建直到会话失效,只能作为叶子节点
    • 临时顺序节点
  • 节点存储内容。
    • 数据。
    • 状态。
      200619.zknodestat.png

版本

  • 作用:CAS,修改数据前检查版本号。
  • 分类:
    • version:数据内容的版本号。表示变更次数,-1标识不使用乐观锁。
    • cversion:子节点的版本号。
    • aversion:ACL变更版本号。

Watcher

  • 提供分布式发布订阅功能。
    200619.watcher.png
  • 使用步骤:
    1. 客户端注册Watcher。初始化构造方法中传入,getData、getChildern、exist方法传入。
    2. 服务端处理Watcher。节点变更时。
    3. 封装WatchedEvent。包括通知状态、事件类型、节点路径。
    4. 查询Watcher。查询节点下的Watcher并删除。
    5. 触发Watcher。向客户端发送事件。
    6. 客户端回调。
    7. 预处理。反序列化、chrootPath、对象转换。
    8. 回调Watcher。加入EventThread线程,下一次轮训周期回调。
  • 特点:
    • 一次性。Watcher触发之后会移除,减少变更频繁的节点的通知压力。
    • 客户端串行。保证顺序同时注意阻塞。
    • 轻量。只发布事件本身,不携带节点数据,减小网络和内存开销。

ACL

  • 权限分类。增删改查+管理(ACL)
  • 权限模式和授权对象。
    200621.acl.png

服务器角色

Leader

  • 事物请求的唯一调度执行者。保证事务顺序性
  • 各个服务器的调度者。

Follower

  • 处理非事务请求,转发给Leader事务请求。
  • 参与事务请求的Proposal投票
  • 参与Leader选举

Observer

  • 类似Follower,处理非事务请求。
  • 不参与Proposal和Leader选举投票。

服务器间的通信类型

  • 数据同步。
  • 服务器初始化。
  • 请求处理。
    • Follower->Leader:转发事务请求、ACK应答Proposal。
    • Leader->Follower:发起Proposal投票、发起Commit提交。
  • 会话管理。
    • Follower->Leader:客户端重连到Follower时校验会话是否超时。
    • Leader->Follower:获取连接Follower的客户端列表,激活会话。

Leader选举

  • 目的:选出最新数据的Leader。
  • 时机:
    • 启动:集群初始化。
    • 运行期间:Leader挂掉,整个集群不可用,需要重新选Leader。

服务器启动

  1. server发出一个投票。投票包括自己的myid(启动配置)和ZXID(初始为0)。
  2. 接收各个服务器投票。校验有效性包括:是否本轮投票、是否来自Looking状态服务器。
  3. 处理投票。和其他投票PK并修正自己的投票。
    1. 优先比ZXID。大的为Leader。
    2. 再比myid。大的为Leader。
  4. 统计投票。大于半数达成一致,则选出Leader,否则重复2-4直到选出。
  5. 改变服务器状态。Leading或者Following。

运行期间

  1. 变更服务器状态。变为Looking。
  2. 同启动的1-5阶段。只是ZXID为本服务器的最大ZXID。

会话

  • 会话状态转换。
    200622.session.png
  • Leader管理会话。

创建

  1. 接收请求。
  2. 校验:类型为会话创建请求、客户端ZXID不大于服务端、不是重连(带sessionId直接打开会话)。
  3. 协商:会话超时时间——客户端和服务端会话超时时间的交集。
  4. 创建会话。
  5. 分配sessionId,全局唯一。
  6. 注册、激活会话。
  7. 生成会话密码。会话转移的凭证。
  8. 预处理。
  9. 创建请求。Follower会转发给Leader。
  10. 注册、激活会话。Leader本地注册和激活。
  11. 事务处理。Proposal+Ack+Commit流程。
  12. 事务应用。事务日志同步Leader的内存数据库。
  13. 会话响应。

管理

  • 分桶策略。根据会话下次超时时间点分桶,方便定时会话激活和检查。
    200622.sessionbucket.png
  • 会话激活。客户端发出 ping,服务端收到后对未关闭的会话更新下次超时时间,迁移分桶。
  • 会话超时检查。根据分桶批量检查、批量清理,只涉及小部分会话

清理

  1. 标记会话为关闭。清理期间即使收到客户端请求也不处理。
  2. 发起关闭会话请求。广播。
  3. 收集该会话相关需要清理的临时节点。
    • 排除会话关闭请求前未提交删除的节点。
    • 包含会话关闭请求前未提交创建的节点。
  4. 添加节点删除事务。
  5. 删除临时节点。
  6. 移除会话
  7. 关闭连接。

重连

  • 连接断开。
    • 等待客户端从地址列表逐个选取服务器重连。
  • 会话失效。重连期间时间过长,超过会话超时时间。
    • 重新实例化客户端。
  • 会话转移。重连连上其他服务器。
    • 老服务器校验会话的Owner,抛异常。
    • 新连接的服务器正常处理请求。

请求处理

会话创建

  • 见会话.创建

SetData

  1. 预处理。校验请求类型、会话超时、ACL、数据版本。
  2. 事务处理。
  3. 事务应用。
  4. 请求响应

事务请求转发

  • 所有非Leader接收事务请求需要转发给Leader处理。

GetData

  1. 预处理。类型、会话检查。
  2. 非事务处理。获取节点数据,包括ACL校验。
  3. 请求响应。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章