Zookeeper -ZAB协议
ZAB写实一直基于Paxsor算法衍生出来的一种为zookeeper提供原子广播和崩溃恢复的协议;
用来保证zk的数据一致性和服务的可用性
原子广播
步骤:
- 发送requset请求到zk的leader节点, 如创建节临时节点
- leader收到请求后,生成zxid
- 向所有follower节点发送proposal提议,
- 同时向本地写数据文件(transactionlog事务日志);
- 给自己发送一个ack
- follower节点收到proposal后
- 向本地写数据文件
- 返回ACK 给leader节点
- leader 收到 过半ACK确认后
- 发送inform让
observer
存储消息 - 向follower发送commit proposal
- commit 本服务的内存数据
- 返回节点变更通知给客户端 (触发客户端监听事件)
- 返回命令操作结果
- 发送inform让
- follower收到通知后,执行commit请求
崩溃恢复
- ZAB 协议确保
丢弃
那些只在 Leader 提出/复制,但没有提交的事务。- ZAB 协议确保那些已经在 Leader 提交的事务最终会被所有服务器提交
- Leader 服务器会根据自己服务器上最后被提交的 ZXID 和 Follower 上的 ZXID 进行比对,比对结果要么回滚,要么和 Leader 同步
选举和发现
-
参与选举的服务状态全部为Looking;对当前服务的选举周期进行++;给自己投票;
-
将选票通过广播的形式发送给其他follower;
-
服务收到其他服务节点选票 ,将收到的选票自己的选票做比较
- 如果收到的选票>自己的选票周期,
- 更新自己的选票周期
- 更新自己的选票
- 向所有节点发送自己的选票
- 选票周期相等
- 根据zxid比较; 使用zxid大的选票
- zxid相同,选举sid大服务为leader
- 向所有节点发送自己的选票
- 如果收到的选票>自己的选票周期,
-
直到存在一个服务的选票超过一半,选举结束
- 将该服务下设置为leader
- 其他的服务状态设置为follower