开发者学堂课程【精通 Spring Cloud Alibaba:Zab 协议如何保持数据的一致性】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/634/detail/10104
Zab 协议如何保持数据的一致性
内容介绍
一、如何保持数据一致性问题
二、2pc 两阶段提交协议原理
三、算法如何实现
四、会出现的问题
一、如何保持数据一致性的问题
Zap 协议如何保持数据一致性,如上图假设,假设现在有三台节点,中间为 leader,从左往右一次为 myid=1,myid=2,myid=3,Zookeeper 中,只要能有领导角色和跟随角色,任何写的请求绝对会统一转发到 leader 事件,这样才能保持数据一致性。
假设图中左边 follow 节点进行了一个写的操作,这个写的请求会被转发到中间 leader 事件,任何写的请求都会被转发给 leader 事件。Leader 节点先把这个数据写完之后再同步给所有 follow 节点。
所有写的请求统一交给我们的领导角色,领导角色写完数据之后,领导角色再将数据同步给每个节点。
注意:数据之间的同步采用2pc 两阶段提交协议。
二、2pc 两阶段提交协议原理
假设左侧 follower 节点有个写的请求转发给 leader 节点,leader节点写完请求之后会生成一个 zxid,叫做 zookeeper 的数字 id,每个都会对应一个 zx 的全局 id,如果有很多写的请求都转发到一个 leader 节点,zxid 有锁的机制,保证只有一个去做写的操作才会生成一个 zxid,这个 zxid 就标志着一个写的请求。
假设 zxid=100,leader要把数据同步给 follower,这个同步过程叫做算法。
三、算法如何实现
Leader 节点会发两次通知,第一次通知要带上 zxid 告诉 follower 节点需要把数据同步给每个 follower 节点,问follower 节点是否可以接收,只要满足过半数的 follower 节点同意接收 zxid=100,这时leader节点才会把数据同步给 follower 节点。
四、会出现的问题
Leader 节点先把数据同步给左边 follower 节点,那么这个 follower 的 zxid 会从0变为100,而此时,正好中间的leader 节点宕机,这时就需要从左右两个 follower 节点中选出一个新的 leader。
那么这两个 follower 节点哪一个为新的leader节点?
左边 follower 节点数据最新 zxid=100,右边节点之前没有同步 leader 节点的数据 zxid=0,这种情况下应该先比较zxid,初始情况下 zxid=0,而左边已同步,比较 zxid 谁的数据大,则谁就是新的 leader。
如果 zxid 相等的情况下,myid 谁最大谁就为领导角色(先比较 zxid)。
zxid 最开始搭建 ookeeper 时是没有的,是 Leader 写请求时生成。因为所有写的请求都要交给 leade 事件,每次做写的时候 zxid 会不断自增,不可能产生重复。