目录

 

zookeeper是什么?

集群角色

Leader

Follower

Observer

集群组成

ZAB协议

Leader选举


  • zookeeper是什么?

zookeeper 是一个开源的分布式协调服务,由雅虎公司创建,是google chubby 的开源实现。

zookeeper 是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调服务。

分布式应用程序可以基于zookeeper实现数据发布与订阅、负载均衡、命名服务、分布式协调与通知、集群管理、Leader选举、分布式锁、分布式队列等功能。

  • 集群角色

  • Leader

Leader 服务器是整个zookeeper 集群的核心,它的主要工作有两项:

1. 事物请求的唯一调度和处理者,保证集群事物处理的顺序性;

2. 集群内部各服务器的调度者。

  • Follower

Follower角色的主要职责:

1. 处理客户端非事物请求,转发事务请求给leader服务器。

2. 参与事务请求Proposal (提案)的投票(需要半数以上服务器通过才能通知leader commit 数据,Proposal由Leader发起,Follower参与投票) 。

3. 参与Leader选举的投票。

  • Observer

Observer充当观察者角色,工作原理和Follower基本是一致的,和Follower唯一的区别是Observer不参与任何形式的投票,它只提供非事务读请求服务,所以Observer可以在不影响写性能的情况下提升集群的读性能。

  • 集群组成

通常zookeeper是由2n+1台server组成,每个server都知道彼此的存在。对于2n+1台server,只要有n+1台(大多数)可用,那么整个系统保持可用。基于这个特性,如果搭建一个允许n台机器down掉的集群,需要部署2n+1台机器的集群。之所以要满足这样一个等式,是因为在Leader选举投票,以及事务请求投票的过程中,需要有超过半数(n+1)的投票支持。

  • ZAB协议

ZAB(Zookeeper Atomic Broadcast)是为分布式协调服务zookeeper专门设计的一种支持崩溃恢复的原子广播协议。zookeeper主要依赖ZAB协议实现了分布式数据的一致性。

ZAB协议包含两种基本模式:

一. 恢复模式:

当整个集群刚启动时,或当leader节点挂掉时,ZK集群会进入恢复模式并选举新的leader。当leader选出后,且集群中有超过半数的机器和该leader节点完成数据同步后,ZK集群才会退出恢复模式同时进入广播模式。

二. 广播模式:

ZK集群在广播模式下,当leader接收到事务型消息请求后,会实现以下过程:

1. leader会将消息赋予一个全局唯一的64位自增id : zxid,通过zxid的大小实现全局有序。

2. leader会为每个follower准备一个FIFO队列,将带有zxid的消息作为一个proposal(提案)分发给所有follower。

3. follower接收到proposal后,先把proposal写到磁盘,写入成功后会回复leader一个ack。

4. 当leader接收到超过半数的ack之后,leader会向这些follower发送commit命令,同时在本地执行此消息。

5. follower接收到commit命令后,会提交该消息。

  • Leader选举

Leader选举分为两种:集群启动时选举leader, leader崩溃时选举新leader。

一. 集群启动时选举

以三台机器组成的集群为例,每个节点启动时状态都是LOOKING观望状态,当只有一台机器server1 启动时是无法进行leader选举的,当第二台机器server2 启动后,两台机器可以互相通信,选举投票需要参考三个参数:

myid:每台机器配置的唯一id;

zxid:事务消息id(递增);

epoch:如果将leader比喻为皇帝,那epoch就代表朝代,每次选举leader就要改朝换代,epoch+1。

选举过程如下:

1. 每个server发出一个投票,每次投票会包含所推举的服务器的myid、zxid、epoch,初始情况server都会将自己视为leader。此时server1的投票(1,0),server2的投票(2,0)。

2. 检查投票。集群的每个server都会收到其他server的投票,收到投票后,首先检查投票的有效性,例如检查是否来自LOOKING状态的server,检查是否是本轮投票epoch。

3. 处理投票。优先检查zxid(zxid最大的一般为拥有最新消息的),zxid较大的优先作为leader,如果zxid相同,比较myid,较大的作为leader。此时server1会将自己的投票更新为(1,0)。

4. 统计投票。看是否有超过半数的相同投票信息,本次投票中,server2被选举为leader。

5. 改变服务器状态。leader更新为leading,follower更新为following。

二. 运行过程中的选举

当集群运行中leader挂掉,将进行新一轮leader选举:

1. 更新服务器状态,leader挂掉后,follower会更新为LOOKING状态。

2. 后面的过程与启动时相同。

 

 

 

 

 

 

10-07 18:19