zookeeper原理

Zookeeper是一个分布式协调服务,其核心包括三种角色:Leader、Follower和Observer,通过ZAB协议确保数据一致性。选举机制采用过半原则,新节点加入时会同步数据。在处理写请求时,使用2PC两阶段提交。Zookeeper通过领导者机制、过半机制和同步机制保证数据一致性,并广泛应用于Dubbo、SpringCloud等场景。

一、 zookeeper角色

1、leader角色

集群只能有一个leader角色,主要有两个职责:

  1. 负责集群的写操作
  2. 发起并维护各个Follower节点及Observer之间的心跳以监控集群的运行状态。

2、follower角色

集群可以有多个follower,follower通过心跳和leader保持连接,只要有两个职责:

  1. 负责集群的读操作
  2. 参与集群的leader选举

3、Observer角色

集群可以有多个Observer,Observer主要职责:

  1. 负责集群的读操作

Observer功能与follower类似,主要区别是Observer无投票权。

zk集群想支持更多的客户端并发操作,只能增加更多的follower节点,但是过多follower会使投票阶段变得复杂,选主时间过长,不利于故障快速恢复。所以引入更多Observer节点。

二、zab协议

zab(zookeeper atomic broadcast)即zookeeper原子消息广播协议。该协议通过事务编号zxid保障集群状态的唯一性。zxid单调递增。

(1)Epoch

指当前集群的周期号,集群每次leader变更都会产生一个新的周期号,周期号单调递增。如果leader崩溃恢复后发现自己比当前集群中leader周期号小,则会以follower的角色加入集群

(2)zxid

zxid指zab协议的事务号,它是一个64位数字。低32位存储单调递增的计数器,针对客户端的每个事务请求,计数器都加1。高32位存储leader的周期号epoch,每次选举出一个新leader后高32位加1,之后低32位从0开始重新计数。

三、leader选举机制和流程

 

什么节点适合当leader?

  1. 数据越新(事务zxid)
  2. myid越大

(1)leader选举过程

  1. 节点启动时,zk投票给自己
  2. 通过socket发送给集群中其他节点(注意:只能由myid大的节点,向myid小的节点连接,反之不能连接,zk代码中会主动断开),进行pk(zxid,myid),然后改票
  3. 通过过半机制,即可选举出leader节点,其他为follower节点
  4. 新加入的节点直接为follower节点,之后进行数据同步(如果zkid比leader大,则直接回滚)

(2)leader选举的时机

  1. zk启动时
  2. leader节点挂掉时
  3. 集群中超过一半follwer节点挂掉

注意:leader选举时不能提供服务

四、zk怎么处理写请求的

 

使用2pc两阶段提交

  1. 客户端发送写请求给follower节点时,follower节点不处理写请求,会转发到leader节点。
  2. leader节点首先生成日志zxid并持久化,然后发送给所有follower节点
  3. follower节点持久化日志,之后返回ack。
  4. leader节点while(true)(多线程,每条线程对应一个follower节点)等待ack,如果超过一半ack(过半机制,不包括Observer节点),则进行commit。
  5. 所有节点更新database(内存中数据)

五、zookeeper怎么保证数据一致性

  1. leader领导者机制
  2. 2pc(两阶段提交)
  3. 过半机制(验证是否超过一半)
  4. 同步机制

当follower节点发送心跳(包含zxid)给leader节点时,如果zxid小则会触发同步机制,更近一步保证了数据一致性

六、zookeeper重要功能

  1. watch机制(用于注册中心)
  2. 临时、顺序节点(用于分布式锁)
  3. leader选举机制(用于集群管理)

七、zookeeper的应用场景

  1. dubbo框架的注册中心和配置中心
  2. springcloud框架的注册中心
  3. elastic-job分布式调度框架注册中心
  4. kafka、hbase、hadoop、solr集群管理
  5. curator框架实现分布式锁
  6. TinyId实现分布式id
  7. seata框架配置中心

八、zookeeper脑裂问题

zk集群中各个节点间的网络通信不良时, 容易出现脑裂现象。

集群中的节点监听不到leader节点的心跳, 就会认为leader节点出了问题, 此时集群将分裂为不同的小集群, 这些小集群会各自选举出自己的leader节点, 导致原有的集群中出现多个leader节点.

使用过半机制,当集群中存活的节点少于半数节点, 集群将不可用. 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值