zookeeper一致性协议ZAB
ZAB协议介绍
-
ZAB协议(zoo原子广播协议)
-
zookeeper是一个分布式应用提供高效而可靠的分布式协调服务。
-
协议主要是两个方面
- 崩溃恢复
- 原子广播
-
所有客户端写入的数据都是写到主进程中(和Raft类似)
-
只要有一半的follower返回ack,leader就能够提交确认
-
当leader可用则进行消息广播,不可用则崩溃恢复
消息广播
- 二阶段提交,所有的写操作都由leader接收,leader将操作发送给所有follwer,半数ack返回则执行自己的commit操作
- 数据复制到follower中
- 等待回应ack,超过半数
- 执行自己的提交,发送给follower提交消息
- leader再接收到写请求时,会将这个操作封装成事务,赋值一个全局递增唯一事务ID(ZXID),ZAB协议保证事务的顺序执行
- leader和follower之间有一个消息队列,解耦他们之间的同步阻塞
- 为保证全局顺序性,所有的写请求都由leader处理
崩溃恢复
-
两个问题
-
leader复制给follower数据后崩溃?
-
leader在收到后提交了自己的commit并发送部分commit给follower?
-
-
ZAB确保已经在Leader提交的事务会被所有服务器提交,ZAB确保丢弃只复制了数据但未提交的事务
-
zookeeper失效后会从ZXID最大的机器中当成候选者,然后从这些候选者之中选出leader
数据同步
- 在崩溃恢复之后,在正式工作之前(接收客户端请求),leader服务器会确认所有事务都被过半的follower提交。即完成数据同步
- 数据同步完成之后,会将这些follower加入可用服务器列表中
- ZXID高位32位代表Term值加一,每个Term具有唯一的Leader
- ZXID低位32位代表着客户端请求的事务,每次加一
- 这样在数据恢复时follower就能通过ZXID判断和leader的差别