Zookeeper 是Cp 还是 AP
答:cp zookeeper为了保证一致性会在leader挂掉的时候进行投票停顿,此时无法提供服务,服务器处于LOOKING 状态。是不可用的,所以他为了保证一致性,放弃了可用性。
集群的角色
在上篇集群搭建中我们最后搭建了Leader、2个Follower 的集群。但是Zookeeper 集群中是有三种角色类型的服务器:
leader
- 事务请求的唯一调度和处理者,保证集群事务处理的顺序性。
- 集群内部各服务器的调度者。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kR6iVNgf-1577330868365)(2C57520C9AE74893989E61CF993B3F6A)]
1. PrepRequestProcessor
Leader请求预处理器。在zookeeper当中,我们会将哪些改变服务器状态的请求称为事务请求,创建节点,更新数据,删除节点,创建会话。当前处理器会识别请求事务是否是事务请求。对于事务请求,PreqRequestProcessor 会进行预处理。比如创建事务请求头,事务体,会话检查,ACL检查和版本检查。
2. ProposalRequestProcessor
ProposalRequestProcessor处理器是Leader事务投票处理器。也是Leader服务器事务处理流程的发起者。
非事务请求ProposalRequestProcessor交给CommitProcessor;
事务请求除了要提交给CommitProcessor之外还要创建Proposal提议发给集群所有的Follower服务器发起一次集群内的事务投票。
3 SyncRequestProcessor
是事务日志记录处理器。
Follower
- 处理客户端的非事务请求,转发事务请求给Leader服务器。
- 参与事务请求Proposal的投票
- 参与Leader选举
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-56EftJLY-1577330868366)(8918E89D0EA94252806A359E1B6FF9FC)]
FollowerReuqestProcessor
FollowerReuqestProcessor 识别当前请求是否是事务请求,如果是转发给Leader服务器,leader 收到之后会将其提交到请求处理链。
SendACkRequestProcessor
将Ack消息的方式向Leader服务器进行反馈。
Leader选举
服务器启动时的Leader选举
-
每个server 会发出一个投票
投票的形式(myid,ZXID),初始阶段都会投票给自己,然后发送给集群中的所有机器。
Server1(1,0)、Server2(2,0) 、 Server3(3,0) -
接受来自各个服务器的投票
每个服务器都会接受来自其他服务器的投票。会判断投票的有效性:
是否是本轮投票,是否是来自LOOKING状态的服务器。 -
处理投票
针对每一个投票服务器都需要将别人的投票跟自己的投票PK,规则如下:
- 优先检查ZXID 大的作为Leader
- ZXID相等就比较myid,较大的最为leader
- 统计投票
每次投票后都会统计所有投票,判断是否已经由过半的几期接受到相同的投票信息。如果存在过半的服务器的投票时大于一半以上的。既认为已经选出Leader
5改变服务器的状态
运行期间的leader选择
- 当Leader挂了,余下的非Observer服务器都会将自己的服务器状态变更为LOOKING
- 每个Server会发出一个投票
生成投票信息(MyId,ZXID),因为时运行期间ZXID 可能不同,先投给自己 然后发送给集群的所有机器。 - 接收来自各个服务器的投票
- 处理投票
ZXID 大的会成为Leader
5.统计投票改变状态
6.改变服务器的状态
选举算法的概念
SID myid文件的值
ZXID 事务ID
Vote 投票
Quorum: 过半机器去数