加入收藏 | 设为首页 | 会员中心 | 我要投稿 萍乡站长网 (https://www.0799zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

ZooKeeper的十二连问,你顶得了嘛?

发布时间:2021-12-22 16:52:20 所属栏目:大数据 来源:互联网
导读:一线大厂ZooKeeper的十二连问,你顶得了嘛? 本文已经收录到github https://github.com/whx123/JavaHome 1. 面试官:工作中使用过Zookeeper嘛?你知道它是什么,有什么用途呢? 「小菜鸡的我:」 有使用过的,使用ZooKeeper作为「dubbo的注册中心」,使用ZooKeep

 
「小菜鸡的我:」
 
Zookeeper 服务器角色
 
Zookeeper集群中,有Leader、Follower和Observer三种角色
 
「Leader」
 
Leader服务器是整个ZooKeeper集群工作机制中的核心,其主要工作:
 
事务请求的唯一调度和处理者,保证集群事务处理的顺序性
 
集群内部各服务的调度者
 
「Follower」
 
Follower服务器是ZooKeeper集群状态的跟随者,其主要工作:
 
处理客户端非事务请求,转发事务请求给Leader服务器
参与事务请求Proposal的投票
参与Leader选举投票
「Observer」
 
Observer是3.3.0 版本开始引入的一个服务器角色,它充当一个观察者角色——观察ZooKeeper集群的最新状态变化并将这些状态变更同步过来。其工作:
 
处理客户端的非事务请求,转发事务请求给 Leader 服务器
不参与任何形式的投票
Zookeeper下Server工作状态
 
服务器具有四种状态,分别是 LOOKING、FOLLOWING、LEADING、OBSERVING。
 
1.LOOKING:寻找Leader状态。当服务器处于该状态时,它会认为当前集群中没有 Leader,因此需要进入 Leader 选举状态。
2.FOLLOWING:跟随者状态。表明当前服务器角色是Follower。
3.LEADING:领导者状态。表明当前服务器角色是Leader。
4.OBSERVING:观察者状态。表明当前服务器角色是Observer。
9、面试官:你说到服务器角色是基于ZooKeeper集群的,那你画一下ZooKeeper集群部署图吧?ZooKeeper是如何保证主从节点数据一致性的呢?
 
「小菜鸡的我:」
 
ZooKeeper集群部署图
 
 
 
ZooKeeper集群是一主多从的结构:
 
如果是写入数据,先写入主服务器(主节点),再通知从服务器。
如果是读取数据,既读主服务器的,也可以读从服务器的。
ZooKeeper如何保证主从节点数据一致性
 
我们知道集群是主从部署结构,要保证主从节点一致性问题,无非就是两个主要问题:
 
「主服务器挂了,或者重启了」
「主从服务器之间同步数据」~
Zookeeper是采用ZAB协议(Zookeeper Atomic Broadcast,Zookeeper原子广播协议)来保证主从节点数据一致性的,ZAB协议支持「崩溃恢复和消息广播」两种模式,很好解决了这两个问题:
 
崩溃恢复:Leader挂了,进入该模式,选一个新的leader出来
消息广播:把更新的数据,从Leader同步到所有Follower
Leader服务器挂了,所有集群中的服务器进入LOOKING状态,首先,它们会选举产生新的Leader服务器;接着,新的Leader服务器与集群中Follower服务进行数据同步,当集群中超过半数机器与该 Leader服务器完成数据同步之后,退出恢复模式进入消息广播模式。Leader 服务器开始接收客户端的事务请求生成事务Proposal进行事务请求处理。
 
10、面试官:Leader挂了,进入崩溃恢复,是如何选举Leader的呢?你讲一下ZooKeeper选举机制吧
 
「小菜鸡的我:」
 
服务器启动或者服务器运行期间(Leader挂了),都会进入Leader选举,我们来看一下~假设现在ZooKeeper集群有五台服务器,它们myid分别是服务器1、2、3、4、5,如图:
 
 
 
服务器启动的Leader选举
 
zookeeper集群初始化阶段,服务器(myid=1-5)「依次」启动,开始zookeeper选举Leader~
 
 
 
服务器1(myid=1)启动,当前只有一台服务器,无法完成Leader选举
服务器2(myid=2)启动,此时两台服务器能够相互通讯,开始进入Leader选举阶段
1.每个服务器发出一个投票
 
服务器1 和 服务器2都将自己作为Leader服务器进行投票,投票的基本元素包括:服务器的myid和ZXID,我们以(myid,ZXID)形式表示。初始阶段,服务器1和服务器2都会投给自己,即服务器1的投票为(1,0),服务器2的投票为(2,0),然后各自将这个投票发给集群中的其他所有机器。
 
2.接受来自各个服务器的投票
 
每个服务器都会接受来自其他服务器的投票。同时,服务器会校验投票的有效性,是否本轮投票、是否来自LOOKING状态的服务器。
 
3.处理投票
 
收到其他服务器的投票,会将别人的投票跟自己的投票PK,PK规则如下:
 
优先检查ZXID。ZXID比较大的服务器优先作为leader。
如果ZXID相同的话,就比较myid,myid比较大的服务器作为leader。服务器1的投票是(1,0),它收到投票是(2,0),两者zxid都是0,因为收到的myid=2,大于自己的myid=1,所以它更新自己的投票为(2,0),然后重新将投票发出去。对于服务器2呢,即不再需要更新自己的投票,把上一次的投票信息发出即可。
4.统计投票
 
每次投票后,服务器会统计所有投票,判断是否有过半的机器接受到相同的投票信息。服务器2收到两票,少于3(n/2+1,n为总服务器5),所以继续保持LOOKING状态
 
服务器3(myid=3)启动,继续进入Leader选举阶段
跟前面流程一致,服务器1和2先投自己一票,因为服务器3的myid最大,所以大家把票改投给它。此时,服务器为3票(大于等于n/2+1),所以服务器3当选为Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;
 
服务器4启动,发起一次选举。
此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。选票信息结果:服务器3为3票,服务器4为1票。服务器4并更改状态为FOLLOWING;
 
服务器5启动,发起一次选举。
同理,服务器也是把票投给服务器3,服务器5并更改状态为FOLLOWING;
 
投票结束,服务器3当选为Leader
服务器运行期间的Leader选举
 
zookeeper集群的五台服务器(myid=1-5)正在运行中,突然某个瞬间,Leader服务器3挂了,这时候便开始Leader选举~
 
 
 
1.变更状态
Leader 服务器挂了之后,余下的非Observer服务器都会把自己的服务器状态更改为LOOKING,然后开始进入Leader选举流程。
 
2.每个服务器发起投票
每个服务器都把票投给自己,因为是运行期间,所以每台服务器的ZXID可能不相同。假设服务1,2,4,5的zxid分别为333,666,999,888,则分别产生投票(1,333),(2,666),(4,999)和(5,888),然后各自将这个投票发给集群中的其他所有机器。
 
3.接受来自各个服务器的投票
4.处理投票
投票规则是跟Zookeeper集群启动期间一致的,优先检查ZXID,大的优先作为Leader,所以显然服务器zxid=999具有优先权。
 
5.统计投票
6.改变服务器状态
11、面试官:你前面提到在项目中使用过Zookeeper的分布式锁,讲一下zk分布式锁的实现原理吧?
 
「小菜鸡的我:」
 
Zookeeper就是使用临时顺序节点特性实现分布式锁的。
 
获取锁过程 (创建临时节点,检查序号最小)
释放锁 (删除临时节点,监听通知)
获取锁过程
 
当第一个客户端请求过来时,Zookeeper客户端会创建一个持久节点/locks。如果它(Client1)想获得锁,需要在locks节点下创建一个顺序节点lock1.如图

 
接着,客户端Client1会查找locks下面的所有临时顺序子节点,判断自己的节点lock1是不是排序最小的那一个,如果是,则成功获得锁。

 
这时候如果又来一个客户端client2前来尝试获得锁,它会在locks下再创建一个临时节点lock2
 
 
客户端client2一样也会查找locks下面的所有临时顺序子节点,判断自己的节点lock2是不是最小的,此时,发现lock1才是最小的,于是获取锁失败。获取锁失败,它是不会甘心的,client2向它排序靠前的节点lock1注册Watcher事件,用来监听lock1是否存在,也就是说client2抢锁失败进入等待状态。
 
 
此时,如果再来一个客户端Client3来尝试获取锁,它会在locks下再创建一个临时节点lock3
 
 
同样的,client3一样也会查找locks下面的所有临时顺序子节点,判断自己的节点lock3是不是最小的,发现自己不是最小的,就获取锁失败。它也是不会甘心的,它会向在它前面的节点lock2注册Watcher事件,以监听lock2节点是否存在。
 
 
释放锁
 
我们再来看看释放锁的流程,zookeeper的「客户端业务完成或者故障」,都会删除临时节点,释放锁。如果是任务完成,Client1会显式调用删除lock1的指令
 
 
 
如果是客户端故障了,根据临时节点得特性,lock1是会自动删除的
 
 
 
lock1节点被删除后,Client2可开心了,因为它一直监听着lock1。lock1节点删除,Client2立刻收到通知,也会查找locks下面的所有临时顺序子节点,发下lock2是最小,就获得锁。
 
 
 
同理,Client2获得锁之后,Client3也对它虎视眈眈,啊哈哈~
 
12. 面试官:好的,最后一道题,你说说dubbo和Zookeeper的关系吧,为什么选择Zookeeper作为注册中心?
 
小菜鸡的我(答了这么多道题,不会还不给我过吧?):
 
dubbo的注册中心可以选Zookeeper,memcached,redis等。为什么选择Zookeeper,因为它的功能特性咯~

(编辑:萍乡站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读