每天十道面试题-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见 第六题
    如果服务端变动频繁,而监听的客户端很多情况下,每次变动都要通知到所有的客户端,给网络和服务器造成很大压力。
    一般是客户端执行getData(“/节点A”,true),如果节点A发生了变更或删除,客户端会得到它的watch事件,但是在之后节点A又发生了变更,而客户端又没有设置watch事件,就不再给客户端发送。
    在实际应用中,很多情况下,我们的客户端不需要知道服务端的每一次变动,我只要最新的数据即可。

  • 回答:
  • 见分析。

发布了122 篇原创文章 · 获赞 32 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/YangzaiLeHeHe/article/details/105230334