Zookeeper(三)ZAB协议及应用

在上篇文章《Zookeeper(二)集群工作原理入门》中简略介绍了Leader选举与节点间的数据同步,其本质还是基于Zookeeper特定的ZAP协议。在介绍ZAB定义前,我们先看看它用在了哪里?

1. 写请求的事务性

我们不妨将客户端请求到服务端返回结果的过程称为一个事务。那么当Leader节点写入数据时,如何能保证事务按照我们期望的结果运行呢?

1.1 如何保证事务的顺序性?

原理很简单,就是给事务顺序编号,然后顺序发送。

顺序编号

Leader为每个写事务定义了一个全局zxid,它是一个64位long型。高32位表示 epoch ,代表当前选举是第几届,当一个Leader 挂了,新的 Leader 上任,epoch就变了。低32位表示事务id,为递增的。合起来的语义就是第m届领导下发的第n到旨意。

顺序发送

在 Leader内部,会为每个Flower/Observer生成一个队列,采用先进先出的方式发送消息,保证了发送的顺序性。由于节点间的网络传输是基于TCP协议,故保证了接收的顺序性。

1.2 如何保证其他节点同步成功?

数据同步时采用了两阶段提交:

(1) Leader为每个请求生成zxid广播给Follower。

(2) Follower会将请求写入队列及log中,然后发送ack给Leader

(3) Leader接收到超过半数以上Follower 的 Ack 响应后, 广播发送 commit 消息。

(4) Follower接收到 commit 消息后则提交事务。

2. 崩溃恢复的数据一致性

在Zookeeper运行期间,Leader与非Leader节点各司其职。当有非Leader节点宕机或新节点启动加入,也并不会重新选举Leader。但是一旦Leader挂了,那么整个集群将暂停对外服务,开始新一轮Leader选举,其过程和启动时Leader选举过程类似(Zookeeper(二)集群工作原理入门有讲过)。

假设正在运行的有Server.1、Server.2、Server.3三台服务器,当前Leader是Server.1。若某一时刻Server.1宕机,此时便开始Leader选举与数据恢复。

2.1 Leader选举

(1) 变更状态。Leader挂后,Follower们会将自己的运行状态变更为LOOKING,然后开始投票选举Leader。

(2) 第一轮投票广播。 每个Follower(严格来讲节点的状态为LOOKING,不是FOLLOWING)会发出一个投票。在运行期间,每个服务器上的zxid可能不同,此时假定Server.2的zxid=10,Server.3的zxid=9。在每届选举的第一轮投票中,Server.2和Server.3都会先将选票投给自己,将自己的(myid,zxid)广播给其他所有参与投票的Follower。 故产生投票(2, 10),(3, 9),然后各自将投票广播给集群中其他Follower们。

(3) 投票PK。各自接收来自其他Follower的投票。首先它会比较zxid ,zxid大的优先为Leader,如果相同则比较myid,myid大的优先作为Leader。 所以此时Server.3发现 Server.2 更适合做 Leader,所以将自己的投票信息更改为(2, 10),然后再次广播出去。

(4) 统计投票。server.2收到投票后,发现和自己的一样,无需更改,并且自己的投票已经超过半数,故当选为Leader。server.2 会将自己的状态变更为Leading,server.3变更为Following。

2.2 数据恢复

如果只是某个Follower 挂了(半数以上仍正常运行),正如之前讲的, Leader中会维护队列,所以不用担心数据的不一致性。

如若当Leader挂掉,在选举Leader后,还要处理数据不一致的问题。这里不深入Zookeeper中的具体实现流程,只理解数据最终一致的原则就好。

(1) 重新选举后同步Leader中已提交的提案。假设Leader (Server.1) 发送zxid=100的commit请求给了Server.2,但尚未发送给Server.3 的时候突然挂了。在重新选举Server.2为 Leader后,则会将zxid=100的提案及提交请求广播给Server.3。

(2) 重新选举后丢弃Leader中未提交的事务。Leader (Server.1) 同意了zxid=100,自身提交了这个事务,当广播commit请求时挂了。在重新选举Server.2为 Leader后,这个挂掉的Leader(Server.1)又重新恢复了 ,此时它会作为 Follower 的身份加入集群,由于他存在zxid=100的提案,这样就会出现数据不一致性问题了,所以zxid=100会被抛弃掉 。

3. ZAB

ZAB协议全称是ZooKeeper Atomic Broadcast protocol,是ZooKeeper用来实现一致性的算法。比如上述的写请求的数据一致,服务崩溃后实现数据同步都是基于ZAB协议去实现的。

上一篇:多媒体开发(13):iOS上音频编码成aac


下一篇:Zookeeper应用,ZAB协议奔溃恢复/消息广播,分布式锁分布式队列