ZooKeeper保持一致性原理

ZooKeeper通过ZAB协议实现分布式一致性,包括选举leader、数据同步和事务广播。在选举中,follower根据最大事务编号投票,超过半数支持的成为leader。同步阶段,leader选取最大任期并广播,确保所有节点数据一致。ZAB协议的原子广播确保了事务的正确处理和集群数据的一致性。
摘要由CSDN通过智能技术生成

   ZooKeeper作为分布式协调服务,很多分布式的应用都可以基于ZooKeeper来实现分布式锁,服务管理,服务发现,通知订阅等功能。在分布式环境下ZooKeeper如何实现数据的一致性?

结构

   ZooKeeper是在分布式环境下提供服务的,因此它必须要解决单点问题,因此ZooKeeper是一个主备的结构。ZooKeeper 存在leader,follower,observer三种角色,这三种角色在实际服务集群中都是服务节点。

  • leader:处理所有请求,为客户的提供读和写服务
  • follower:只提供读服务,有机会通过选举成为leader
  • observer:只提供读服务

   ZooKeeper中所有请求都是交给leader处理的,因此,如果leader挂了,ZooKeeper就无法再提供服务,这就是单点问题。为了解决单点问题,follower能够通过选举成为新的leader。follower又是如何被选举成为新的leader的?新的leader又是如何保证数据的一致性的?这些都依赖于ZooKeeper所用的分布式一致性协议ZAB。在介绍ZAB协议之前,了解几个概念:

事务
   ZooKeeper作为一个分布式协调服务,需要leader节点去接受外部请求,转化为内部操作(比如创建,修改,删除节点),需要原子性执行的几个操作就组成了事务,这里用T代表。ZooKeeper要求有序的处理事务,因此给每个事务一个编号,每进来一个事务编号加1,假设leader节点中进来n个事务,可以表示为T1、T2、T3…Tn。为了防止单点问题导致事务数据丢失,leader节点会把事务数据同步到follower节点中

事务队列
   leader和follower都会保存一个事务队列,用L表示,L=T1、T2、T3…Tn,leader的事务队列是接受请求保存下来的,follower的事务队列是leader同步过来的,因此leader的事务队列是最新、最全的

任期
   在ZooKeeper的工作过程中,leader节点奔溃,重新选举出新的leader是很正常的事情,所以ZooKeeper的运行历史中会产生多个leader。为了区分各个leader,ZAB协议用一个整数来表示任期,假设用E表示任务,ZooKeeper刚运行时选举出的第一个leader的任期为E=1;第一个leader奔溃后,下面选举出来的leader,任期会加1,E=2,依次类推。加入任期概念的事务应该表示为T(E,n)

ZAB协议

   ZAB协议是为ZooKeeper专门设计的一种支持奔溃恢复的原子广播协议。通过该协议,Zookeepe 基于主从模式的系统架构来保持集群中各个副本之间数据的一致性。Zookeeper 使用一个单一的主进程来接收并处理客户端的所有事务请求,并采用原子广播协议将数据状态的变更以事务的形式广播到所有的副本进程上。ZAB协议主要的作用在于三个方面:

  1. 选举出leader
  2. 同步节点之间的状态达到数据一致
  3. 数据的广播

   ZAB协议有两种模式:崩溃恢复(选主+数据同步)和消息广播(事务操作)。
崩溃恢复
   当整个ZooKeeper集群刚刚启动或者Leader服务器宕机、重启或者网络故障导致不存在过半的服务器与Leader服务器保持正常通信时(Leader选举,必须要存在过半的服务器),所有进程(服务器)进入崩溃恢复模式,首先选举产生新的Leader服务器,然后集群中Follower服务器开始与新的Leader服务器进行数据同步,当集群中超过半数机器与该Leader服务器完成数据同步之后,退出恢复模式进入消息广播模式,Leader服务器开始接收客户端的事务请求生成事务提案来进行事务请求处理。

选举leader

  1. 每个follower广播自己事务队列中最大事务编号maxId
  2. 获取集群中其他follower发出来的maxId,选取出最大的maxId所属的follower,投票给该follower,选它为leader
  3. 统计所有投票,获取投票数超过一半的follower被推选为leader

同步数据

  1. 各个follower向leader发送自己保存的任期E
  2. leader比较所有的任期,选取最大的E,加1后作为当前的任期E=E+1
  3. 将任务E广播给所有follower
  4. follower将任期改为leader发过来的值,并且返回给leader事务队列L
  5. leader从队列集合中选取任期最大的队列,如果有多个队列任期都是最大,则选取事务编号n最大的队列Lmax。将Lmax作为leader队列,并且广播给各个follower
  6. follower接收队列替换自己的事务队列,并且执行提交队列中的事务。至此各个节点的数据达成一致,ZooKeeper恢复正常服务

消息广播
  ZAB 协议的消息广播过程使用的是原子广播协议。在整个消息的广播过程中,Leader 服务器会每个事务请求生成对应的 Proposal,并为其分配一个全局唯一的递增的事务 ID(ZXID),之后再对其进行广播。

  1. leader节点接收到请求,将事务加入事务队列,并且将事务广播给各个follower
  2. follower接收事务并加入事务队列,然后给leader发送准备提交请求
  3. leader 接收到半数以上的准备提交请求后,提交事务同时向follower 发送提交事务请求
  4. follower提交事务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值