zookeeper集群注意点


本文记录了学习过程中的部分知识点,部分知识点自己也没看懂。需要保持怀疑的态度

一 Zookeeper

1.1 顺序一致性

  1. zookeeper本质也是最终一致性,并不能保证每个follower节点上的数据都是新的。
  2. 一致性也是指集群中大部分节点的数据保持一致(一致性这个次都被用烂了!各种解释都有????

问题:
zookeeper客户端在timeout之内重连成功(连接到了其他follower节点)。有没有可能看到更旧的数据?

1.2 响应成功的数据一定存在

如果对集群中的leader节点发出写请求,如果响应给客户端成功。那么leader必然已经接收到了一半以上节点的ack。那么leader不挂,最终一致性会保证数据在所有节点都存在。
如果leader挂了,那么也能肯定新选举的节点必然有响应成功的数据。

1.3 leader会一直等半数以上的ack

这个是我自己得出的结论,没找到明确这么说的文章.否则假如没等到就响应失败,那么此时重新选举。本次提交的写请求可能会被生效

其实感觉这段话就是印证了我的观点
zookeeper集群注意点
只要leader发出了proposal,那么正常情况是没有follower会说:我执行不了,会报错之类的(和数据库不一样

1.4 奔溃恢复要求

ZAB协议崩溃恢复要求满足如下2个要求:

  1. 确保已经被leader提交的proposal必须最终被所有的follower服务器提交。 (这个两个大多数肯定有交集可以确保
  2. 确保丢弃已经被leader出的但是没有被提交的proposal。(这句话感觉不太准确,也有可能是我理解问题。因为在我理解中,如果leader还没提交,那么proposal可能会在新的leader中,也有可能不在)

其他文章对第二点的解读
zookeeper集群注意点

1.5 验证

1.3和1.4 的想法也可以通过该文对照:ZAB
zookeeper集群注意点

其实只要leader将proposal发送到了一个follower(这个follower没挂,不到半数)。那么这个leader奔溃后,这个follower就会凭着最大的zxid当选leader。那么该事务就会生效

二 Raft

2.1 基于Raft的复制状态机系统架构

下图展示了执行一条客户端写命令的过程(z←6表示把6写入z):

  1. 客户端3发送一个状态机命令z< -6给服务器C的一致性算法模块。
  2. 一致性算法模块把状态机命令写入服务器C的日志,同时发送日志复制请求给服务器A和服务器的一致性算法模块。服务器A和服务器B的一致性算法模块在接收到日志复制请求之后,分别在各自的服务器上写入日志,然后回复服务器C的一致性算法模块。
  3. 服务器c的一致性算法模块在收到服务器A和B对日志复制请求的回复之后,让状态机执行来自客户端的命令。
    4.服务器c的状态机把命令执行结果返回给客户端3。

zookeeper集群注意点

2.2 Raft日志复制

一个Raft集群包括若干服务器。服务器可以处于以下三种状态: leader、 follower 和candidate。只有leader处理来自客户端的请求。Follower不会 主动发起任何操作,只会被动的接收来自leader和candidate的请求。
在正常情况下,Raft集群中有一个leader, 其他的都是follower。Leader在接受到一个写命令之后,为这个命令生成一个日志条目,然后进行日志复制。

leader通过发送AppendEntries RPC把日志条目发送给follower,让follower把接收到的日志条目写入自己的日志文件。另外leader也会把日志条目写入自己的日志文件。日志复制保证Raft集群中所有的服务器的日志最终都处于同样的状态。
zookeeper集群注意点

2.3 Raft选举算法

Raft使用心跳机制来触发leader选取。一个follower只要能收到来自leader或者candidate的有效RPC,就会一直处于follower状态。leader在每一 个election timeout向所有follower发送心跳消息来保持自己的leader状态。
如果follower在-个election timeout周期内没有收到心跳信息,就认为目前集群中没有leader。此follower
会对自己的currentTerm进行加一操作,并进入candidate状态,发起一轮投票。它会给自己投票并向其他所有的服务器发送RequestVote RPC一轮只有一次),然后会- -直处于candidate状态, 直到下列三种情形之一发生:

  1. 这个candidate赢得了选举。
  2. 另外一台服务器成为了leader。
  3. 一段时间之内没有服务器赢得选举。在这种情况下,candidate会再次发起选举。
    zookeeper集群注意点

2.4 日志匹配

zookeeper集群注意点

2.5 如何保证一个新term的leader保存了所有提交的日志条目

zookeeper集群注意点

数学上证明就是:两个大多数(超过1/2),必然会有交集

2.6 状态机命令的提交点

这里没怎么看懂!
zookeeper集群注意点

参考

  1. 《ZooKeeper实战与源码剖析》课程
  2. https://www.cnblogs.com/Soy-technology/p/11391851.html
  3. https://www.jianshu.com/p/2bceacd60b8a