ZooKeeper中篇
hello大家好,承接上文,今天将继续介绍ZooKeeper相关知识点。
一、你知道Zookeeper中有哪些角色?系统模型

领导者(leader)Leader服务器为客户端提供读服务和写服务。负责进行投票的发起和决议,更新系统状态。学习者(learner)跟随者( follower ) Follower服务器为客户端提供读服务,参与Leader选举过程,参与写操作“过半写成功”策略。
观察者( observer ) Observer服务器为客户端提供读服务,不参与Leader选举过程,不参与写操作“过半写成功”策略。用于在不影响写性能的前提下提升集群的读性能。客户端(client) :服务请求发起方。
二、Zookeeper的选主流程是怎么样的?

出现选举主要是两种场景:初始化、leader不可用
当zk集群中的一台服务器出现以下两种情况之一时,就会开始leader选举。
服务器初始化启动。
服务器运行期间无法和leader保持连接。
而当一台机器进入leader选举流程时,当前集群也可能处于以下两种状态。
集群中本来就已经存在一个leader。
集群中确实不存在leader。
首先第一种情况,通常是集群中某一台机器启动比较晚,在它启动之前,集群已经正常工作,即已经存在一台leader服务器。当该机器试图去选举leader时,会被告知当前服务器的leader信息,它仅仅需要和leader机器建立连接,并进行状态同步即可
重点是leader不可用了,此时的选主制度
投票信息中包含两个最基本的信息。
sid :即server id,用来标识该机器在集群中的机器序号。
zxid :即zookeeper事务id号

例如:如果当前服务器要推举sid为1,zxid为8的服务器成为leader,那么投票信息可以表示为(1,8)
集群中的每台机器发出自己的投票后,也会接受来自集群中其他机器的投票。每台机器都会根据一定的规则,来处理收到的其他机器的投票,以此来决定是否需要变更自己的投票。
规则如下 :
初始阶段,都会给自己投票。
当接收到来自其他服务器的投票时,都需要将别人的投票和自己的投票进行pk,规则如下:
优先检查zxid。zxid比较大的服务器优先作为leader。如果zxid相同的话,就比较sid,sid比较大的服务器作为leader。
所有服务启动时候的选举流程:



总结:
开始投票 -> 节点状态变成 LOOKING -> 每个节点选自己-> 收到票进行 PK -> sid 大的获胜 -> 更新选票 -> 再次投票 -> 统计选票,选票过半数选举结果 -> 节点状态更新为自己的角色状态。
三、为什么Zookeeper集群的数目,一般为奇数个?
首先需要明确zookeeper选举的规则:leader选举,要求 可用节点数量 > 总节点数量/2 。
比如:标记一个写是否成功是要在超过一半节点发送写请求成功时才认为有效。同样,Zookeeper选择领导者节点也是在超过一半节点同意时才有效。最后,Zookeeper是否正常是要根据是否超过一半的节点正常才算正常。这是基于CAP的一致性原理。
zookeeper有这样一个特性:集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的。
也就是说如果有2个zookeeper,那么只要有1个死了zookeeper就不能用了,因为1没有过半,所以2个zookeeper的死亡容忍度为0;
同理,要是有3个zookeeper,一个死了,还剩下2个正常的,过半了,所以3个zookeeper的容忍度为1;
同理:

会发现一个规律,2n和2n-1的容忍度是一样的,都是n-1,所以为了更加高效,何必增加那一个不必要的zookeeper呢。
zookeeper的选举策略也是需要半数以上的节点同意才能当选leader,如果是偶数节点可能导致票数相同的情况。
四、Zookeeper监听器的原理是什么?

1. 创建一个Main()线程。2. 在Main()线程中创建两个线程,一个负责网络连接通信(connect),一个负责监听(listener)。3. 通过connect线程将注册的监听事件发送给Zookeeper。4. 将注册的监听事件添加到Zookeeper的注册监听器列表中。5. Zookeeper监听到有数据或路径发生变化时,把这条消息发送给Listener线程。6. Listener线程内部调用process()方法
五、说说Zookeeper中的ACL 权限控制机制
ACL(Access Control List)访问控制列表

六、Zookeeper 有哪几种几种部署模式?
Zookeeper 有三种部署模式:
1. 单机部署:一台集群上运行;
2. 集群部署:多台集群运行;
3. 伪集群部署:一台集群启动多个 Zookeeper 实例运行。
七、Zookeeper集群支持动态添加机器吗?
其实就是水平扩容了,Zookeeper 在这方面不太好。两种方式:
全部重启:关闭所有 Zookeeper 服务,修改配置之后启动。不影响之前客户端的会话。
逐个重启:在过半存活即可用的原则下,一台机器重启不影响整个集群对外提供服务。这是比较常用的方式。3.5 版本开始支持动态扩容。
IT枫斗者offer训练营集训中,有需要的赶紧报名。不知道哪些人可以报名?没关系点击这里关于我们。