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,因为它的功能特性咯~ (编辑:萍乡站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

