ZK内部实现——Paxos到Zookeeper(二)
文章目录
系统模型
数据模型
- 一颗树,每个节点称为ZNode。
- 事务ID(ZXID),改变zk状态的操作分配全局唯一的事务id。
- 包括节点的增删,节点数据修改,会话创建和失效等。
节点
- 节点类型。
- 持久节点。创建直到主动删除。
- 持久顺序节点。zk中父节点维护第一级子节点顺序,创建时该节点加上数字后缀,最大int最大值。
- 临时节点。 创建直到会话失效,只能作为叶子节点。
- 临时顺序节点。
- 节点存储内容。
- 数据。
- 状态。
版本
- 作用:CAS,修改数据前检查版本号。
- 分类:
- version:数据内容的版本号。表示变更次数,-1标识不使用乐观锁。
- cversion:子节点的版本号。
- aversion:ACL变更版本号。
Watcher
- 提供分布式发布订阅功能。
- 使用步骤:
- 客户端注册Watcher。初始化构造方法中传入,getData、getChildern、exist方法传入。
- 服务端处理Watcher。节点变更时。
- 封装WatchedEvent。包括通知状态、事件类型、节点路径。
- 查询Watcher。查询节点下的Watcher并删除。
- 触发Watcher。向客户端发送事件。
- 客户端回调。
- 预处理。反序列化、chrootPath、对象转换。
- 回调Watcher。加入EventThread线程,下一次轮训周期回调。
- 特点:
- 一次性。Watcher触发之后会移除,减少变更频繁的节点的通知压力。
- 客户端串行。保证顺序同时注意阻塞。
- 轻量。只发布事件本身,不携带节点数据,减小网络和内存开销。
ACL
- 权限分类。增删改查+管理(ACL)
- 权限模式和授权对象。
服务器角色
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。
服务器启动
- server发出一个投票。投票包括自己的myid(启动配置)和ZXID(初始为0)。
- 接收各个服务器投票。校验有效性包括:是否本轮投票、是否来自Looking状态服务器。
- 处理投票。和其他投票PK并修正自己的投票。
- 优先比ZXID。大的为Leader。
- 再比myid。大的为Leader。
- 统计投票。大于半数达成一致,则选出Leader,否则重复2-4直到选出。
- 改变服务器状态。Leading或者Following。
运行期间
- 变更服务器状态。变为Looking。
- 同启动的1-5阶段。只是ZXID为本服务器的最大ZXID。
会话
- 会话状态转换。
- Leader管理会话。
创建
- 接收请求。
- 校验:类型为会话创建请求、客户端ZXID不大于服务端、不是重连(带sessionId直接打开会话)。
- 协商:会话超时时间——客户端和服务端会话超时时间的交集。
- 创建会话。
- 分配sessionId,全局唯一。
- 注册、**会话。
- 生成会话密码。会话转移的凭证。
- 预处理。
- 创建请求。Follower会转发给Leader。
- 注册、**会话。Leader本地注册和**。
- 事务处理。Proposal+Ack+Commit流程。
- 事务应用。事务日志同步Leader的内存数据库。
- 会话响应。
管理
- 分桶策略。根据会话下次超时时间点分桶,方便定时会话**和检查。
- 会话**。客户端发出 ping,服务端收到后对未关闭的会话更新下次超时时间,迁移分桶。
- 会话超时检查。根据分桶批量检查、批量清理,只涉及小部分会话
清理
- 标记会话为关闭。清理期间即使收到客户端请求也不处理。
- 发起关闭会话请求。广播。
- 收集该会话相关需要清理的临时节点。
- 排除会话关闭请求前未提交删除的节点。
- 包含会话关闭请求前未提交创建的节点。
- 添加节点删除事务。
- 删除临时节点。
- 移除会话
- 关闭连接。
重连
- 连接断开。
- 等待客户端从地址列表逐个选取服务器重连。
- 会话失效。重连期间时间过长,超过会话超时时间。
- 重新实例化客户端。
- 会话转移。重连连上其他服务器。
- 老服务器校验会话的Owner,抛异常。
- 新连接的服务器正常处理请求。
请求处理
会话创建
- 见会话.创建
SetData
- 预处理。校验请求类型、会话超时、ACL、数据版本。
- 事务处理。
- 事务应用。
- 请求响应
事务请求转发
- 所有非Leader接收事务请求需要转发给Leader处理。
GetData
- 预处理。类型、会话检查。
- 非事务处理。获取节点数据,包括ACL校验。
- 请求响应。