2020年7月5日
zookeeper的选举和提交
1.zookeeper leader选举,如何保证选出来的leader的数据是最新的?
zxid,zxid是事务提交时候,自增的一个id,包含epoch和counter,epoch可以理解表示当前是哪个leader来领导,是哪个朝代;counter可以理解为消息的offset,当前提交到哪了。这样子就能选出,epoch最大并且counter最大的节点作为leader。超过一半都同意之后,该节点就成为leader了。

2.zookeeper广播提交数据如何保证各个节点数据一致性。
a.可靠传递: 如果消息m由一台服务器传递,那么它最终将由所有服务器传递。
b.全局有序: 如果一个消息a在消息b之前被一台服务器交付,那么所有服务器都交付了a和b,并且a先于b。
c.因果有序: 如果消息a在因果上先于消息b并且二者都被交付,那么a必须排在b之前。
有序性如何保证:1.tcp协议,保证网络传递有序 2.节点之间有FIFO的消息队列,保证全局有序性 3.通过全局递增的zxid保证因果有序性
下图是一个事务的提交过程,是一个类似二阶段提交的过程,超过一半的节点童ack之后,可以提交数据。并非一个强一致的模型。

- Leader收到客户端的写请求,生成一个事务(Proposal),其中包含了zxid;
- Leader开始广播该事务,需要注意的是所有节点的通讯都是由一个FIFO的队列维护的;
- Follower接受到事务之后,将事务写入本地磁盘,写入成功之后返回Leader一个ACK;
- Leader收到过半的ACK之后,开始提交本事务,并广播事务提交信息
- 从节点开始提交本事务。
状态流转这里不写了
本文内容参考:https://mp.weixin.qq.com/s/k0zAExTvMsrugCaNJxs7hQ
后续参考:https://www.jianshu.com/p/2bceacd60b8a 这篇文章的评论可以看下,我猜想leader在提交自己的事务和广播操作可能是原子的,没有验证。
1)Zab 协议需要确保那些已经在 Leader 服务器上提交(Commit)的事务最终被所有的服务器提交。
2)Zab 协议需要确保丢弃那些只在 Leader 上被提出而没有被提交的事务。
上面亮点是如何实现的?
选举时候,不会选出带有未提交Proposal的节点作为leader,并且只有zxid最大的可以作为leader。