zookeeper集群注意点
目录
本文记录了学习过程中的部分知识点,部分知识点自己也没看懂。
需要保持怀疑的态度
一 Zookeeper
1.1 顺序一致性
- zookeeper本质也是
最终一致性
,并不能保证每个follower节点上的数据都是新的。 - 一致性也是指集群中大部分节点的数据保持一致(
一致性这个次都被用烂了!各种解释都有????
)
问题:
zookeeper客户端在timeout之内重连成功(连接到了其他follower节点)。有没有可能看到更旧的数据?
1.2 响应成功的数据一定存在
如果对集群中的leader节点发出写请求,如果响应给客户端成功。那么leader必然已经接收到了一半以上节点的ack。那么leader不挂,最终一致性会保证数据在所有节点都存在。
如果leader挂了,那么也能肯定新选举的节点必然有响应成功的数据。
1.3 leader会一直等半数以上的ack
这个是我自己得出的结论,没找到明确这么说的文章
.否则假如没等到就响应失败,那么此时重新选举。本次提交的写请求可能会被生效
其实感觉这段话就是印证了我的观点
只要leader发出了proposal,那么正常情况是没有follower
会说:我执行不了,会报错之类的(和数据库不一样
)
1.4 奔溃恢复要求
ZAB协议崩溃恢复要求满足如下2个要求:
- 确保已经被leader提交的proposal必须最终被所有的follower服务器提交。 (
这个两个大多数肯定有交集可以确保
) - 确保丢弃已经被leader出的但是没有被提交的proposal。(
这句话感觉不太准确,也有可能是我理解问题。因为在我理解中,如果leader还没提交,那么proposal可能会在新的leader中,也有可能不在
)
其他文章对第二点的解读
1.5 验证
1.3和1.4 的想法也可以通过该文对照:ZAB
其实只要leader将proposal发送到了一个follower(这个follower没挂,不到半数
)。那么这个leader奔溃后,这个follower就会凭着最大的zxid当选leader。那么该事务就会生效
二 Raft
2.1 基于Raft的复制状态机系统架构
下图展示了执行一条客户端写命令的过程(z←6表示把6写入z):
- 客户端3发送一个状态机命令z< -6给服务器C的一致性算法模块。
- 一致性算法模块把状态机命令写入服务器C的日志,同时发送日志复制请求给服务器A和服务器的一致性算法模块。服务器A和服务器B的一致性算法模块在接收到日志复制请求之后,分别在各自的服务器上
写入日志
,然后回复服务器C的一致性算法模块。 - 服务器c的一致性算法模块在收到服务器A和B对日志复制请求的回复之后,让状态机执行来自客户端的命令。
4.服务器c的状态机把命令执行结果返回给客户端3。
2.2 Raft日志复制
一个Raft集群包括若干服务器。服务器可以处于以下三种状态: leader、 follower 和candidate。只有leader处理来自客户端的请求。Follower不会 主动发起任何操作,只会被动的接收来自leader和candidate的请求。
在正常情况下,Raft集群中有一个leader, 其他的都是follower。Leader在接受到一个写命令之后,为这个命令生成一个日志条目,然后进行日志复制。
leader通过发送AppendEntries RPC把日志条目发送给follower,让follower把接收到的日志条目写入自己的日志文件。另外leader也会把日志条目写入自己的日志文件。日志复制保证Raft集群中所有的服务器的日志最终都处于同样的状态。
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状态, 直到下列三种情形之一发生:
- 这个candidate赢得了选举。
- 另外一台服务器成为了leader。
- 一段时间之内没有服务器赢得选举。在这种情况下,candidate会再次发起选举。
2.4 日志匹配
2.5 如何保证一个新term的leader保存了所有提交的日志条目
数学上证明就是:两个大多数(超过1/2),必然会有交集
2.6 状态机命令的提交点
这里没怎么看懂!