每天十道面试题-20200330 ゝ一世哀愁。 2023-07-20 08:16 69阅读 0赞 ### 每天十道面试题-20200330 ### * * * * 题目 * 解答 * * * 题目一 * 题目二 * 题目三 * 题目四 * 题目五 * 题目六 * 题目七 * 题目八 * 题目九 * 题目十 #### 题目 #### * 1、Leader 选举过程 * 2、数据同步过程 * 3、zookeeper是如何保证事务的顺序一致性的? * 4、分布式集群中为什么会有Master? * 5、zk节点宕机如何处理? * 6、zookeeper负载均衡和nginx负载均衡区别 * 7、Zookeeper有哪几种几种部署模式? * 8、集群最少要几台机器,集群规则是怎样的? * 9、集群支持动态添加机器吗? * 10、Zookeeper对节点的watch监听通知是永久的吗?为什么不是永久的? #### 解答 #### ###### 题目一 ###### * 题干:Leader 选举过程? * 分析: * > 一般有两种情况:服务启动时期的Leader选举,服务运行期间的Leader选举. > **服务启动时期的Leader选举:** > A 首先至少需要两台服务器才可以进行Leader选举,投票基本要素myid即serverId和ZXID事务ID; > B 初始阶段每个服务器都会先将票投给自己,然后各自将票发送给其他服务器如server1\[1,0\] server2\[2,0\]=\[myid,zxid\]. > C 接受来自各个服务器的投票,检查有效性,即是不是本轮投票,是不是来自Looking状态的服务器等. > D 使用这个规则进行选票PK:有限检查ZXID,ZXID大的作为Leader,如果ZXID一样的比较myid,myid大的作为服务器.根据这个规则server1会更新自己的投票为\[2,0\]然后重新发出投票,server2比对完就是自己不会更新,只需要在向集群中所有机器在发一次投票即可. > E 统计投票,每次投票后服务器都会统计所有投票,判断是否已经有过半的机器接收到相同的投票信息(即大于等于n/2+1)满足时即认为选出Leader. > F 改变服务器状态确定了Leader之后,如果是Follower就会更新状态为Following,如果是Leader就会更新为Leadering. > **服务运行期间的Leader选举:** > zk正常运行过程中,一旦选出Leader,只要不挂就一直是它.如果挂了需要重新选举: > A 变更状态,如果Leader挂了,余下的非Observer(Observer服务器不参与选举)服务器都会将自己的服务器状态变更为Looking,然后开始进入Leader选举过程. > B 每个Server发起投票,因为是运行期间,每个Server的ZXID可能不同. > C 接受来自各个服务器的投票. > D 处理投票 > E 统计投票 > F 改变服务器状态 > **选举算法:** 现在用的是TCP版本的FastLeaderElection算法. > SID:服务器ID,ZXID:事务ID,Vote:投票 Quorum:过半机器数(n/2+1) > 总结:哪台服务器的数据越新,就越可能成为Leader,因为越新则ZXID越大,如果有几台一样的ZXID那么就比较ServerID. * 回答: * > A 如果是运行期间则先变更状态 刚启动跳过这步. > B 每个Server发起投票. > C 接受来自各个服务器的投票. > D 处理投票 > E 统计投票 > F 改变服务器状态。 ###### 题目二 ###### * 题干:数据同步过程? * 分析: * > 在ZK集群启动的过程中,在Leader选举出来之后,所有的Follower我们称为Learner都会把自己注册给Leader(就是将自己的基本信息告诉给Leader),在完成注册后就开始了数据同步环节,数据同步结束之后就开始启动集群实例. > A 首先需要获取Learner的状态解析出最后的事务ID. > B 有四种同步方式:直接差异化同步(DIFF) 先回滚在差异化同步(TRUNC\_DIFF同步) 仅回滚同步(TRUNC同步) 全量同步(SNAP同步) > 无论哪种方式,因为Leader就是最新的数据,最终都是要将Learner上没有提交过的事务从Leader给同步过去。 * 回答: * > 见分析. ###### 题目三 ###### * 题干:zookeeper是如何保证事务的顺序一致性的? * 分析: * > 两个步骤,首先会为每一个事务分配一个ZXID称作事务ID,然后Leader服务器会为每一个Follower分配一个队列,用来存储ZXID所以根据队列的特性就有了事务的顺序一致性。 * 回答: * > 见分析。 ###### 题目四 ###### * 题干:分布式集群中为什么会有Master? * 分析: * > 首先因为是分布式集群所以会有很多个服务节点,那么就会出现各个节点间的协作,这就需要有一个协调者的出现,此外在应为读写分离的时候,我们也需要有一个节点来负责写而其他节点来负责读,所以在分布式集群中我们需要诸如Master这样一个角色出现。 * 回答: * > 见分析。 ###### 题目五 ###### * 题干:zk节点宕机如何处理? * 分析: * > Zookeeper本身也是集群,推荐配置不少于3个服务器。Zookeeper自身也要保证当一个节点宕机时,其他节点会继续提供服务。 > 如果是一个Follower宕机,还有2台服务器提供访问,因为Zookeeper上的数据是有多个副本的,数据并不会丢失; > 如果是一个Leader宕机,Zookeeper会选举出新的Leader。 > ZK集群的机制是只要超过半数的节点正常,集群就能正常提供服务。只有在ZK节点挂得太多,只剩一半或不到一半节点能工作,集群才失效。 * 回答: * > 见分析。 ###### 题目六 ###### * 题干:zookeeper负载均衡和nginx负载均衡区别 * 分析: * > zookeeper > 不存在单点问题,zab机制保证单点故障可重新选举一个leader > 只负责服务的注册与发现,不负责转发,减少一次数据交换(消费方与服务方直接通信) > 需要自己实现相应的负载均衡算法 > nginx > 存在单点问题,单点负载高数据量大,需要通过KeepAlived+LVS备机实现高可用 > 每次负载,都充当一次中间人转发角色,增加网络负载量(消费方与服务方间接通信) > 自带负载均衡算法 > nginx的吞吐量比zk大很多,应该说按业务选择用哪种方式。 * 回答: * > zookeeper > 不存在单点问题,zab机制保证单点故障可重新选举一个leader > 只负责服务的注册与发现,不负责转发,减少一次数据交换(消费方与服务方直接通信) > 需要自己实现相应的负载均衡算法 > nginx > 存在单点问题,单点负载高数据量大,需要通过KeepAlived+LVS备机实现高可用 > 每次负载,都充当一次中间人转发角色,增加网络负载量(消费方与服务方间接通信) > 自带负载均衡算法 > nginx的吞吐量比zk大很多,应该说按业务选择用哪种方式。 ###### 题目七 ###### * 题干:Zookeeper有哪几种几种部署模式? * 分析: * > 部署模式:单机模式、伪集群模式、集群模式。 * 回答: * > 部署模式:单机模式、伪集群模式、集群模式。 ###### 题目八 ###### * 题干:集群最少要几台机器,集群规则是怎样的? * 分析: * > 集群规则为2N+1台,N>0,即3台。 * 回答: * > 集群规则为2N+1台,N>0,即3台。 ###### 题目九 ###### * 题干:集群支持动态添加机器吗? * 分析: * > 全部重启:关闭所有Zookeeper服务,修改配置之后启动。不影响之前客户端的会话。 > 逐个重启:在过半存活即可用的原则下,一台机器重启不影响整个集群对外提供服务。这是比较常用的方式。 * 回答: * > 全部重启:关闭所有Zookeeper服务,修改配置之后启动。不影响之前客户端的会话。 > 逐个重启:在过半存活即可用的原则下,一台机器重启不影响整个集群对外提供服务。这是比较常用的方式。 ###### 题目十 ###### * 题干:Zookeeper对节点的watch监听通知是永久的吗?为什么不是永久的? * 分析: * > Watch Manger时服务端的Watcher管理者并且还负责Watcher事件的触发,并且移除那些被触发的Watcher见 [第六题][Link 1] > 如果服务端变动频繁,而监听的客户端很多情况下,每次变动都要通知到所有的客户端,给网络和服务器造成很大压力。 > 一般是客户端执行getData(“/节点A”,true),如果节点A发生了变更或删除,客户端会得到它的watch事件,但是在之后节点A又发生了变更,而客户端又没有设置watch事件,就不再给客户端发送。 > 在实际应用中,很多情况下,我们的客户端不需要知道服务端的每一次变动,我只要最新的数据即可。 * 回答: * > 见分析。 [Link 1]: https://blog.csdn.net/YangzaiLeHeHe/article/details/105186538
还没有评论,来说两句吧...