您当前的位置: 首页 >  面试

庄小焱

暂无认证

  • 3浏览

    0关注

    805博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Zookeeper——大厂面试问题集合

庄小焱 发布时间:2021-12-25 15:27:30 ,浏览量:3

摘要

本博文主要是介绍Zookeeper在大厂中的面试问题。

他主要的应用场景有以下几个:

  • 服务注册与订阅(共用节点)
  • 分布式通知(监听znode)
  • 服务命名(znode特性)
  • 数据订阅、发布(watcher)
  • 分布式锁(临时节点)
一、Zookeeper选举相关面试问题 Zookeeper的选举机制原理

半数机制,超过半数的投票通过,即通过。

第一次启动选举规则:投票过半数时,服务器id大的胜出

第二次启动选举规则:

  • EPOCH大的直接胜出
  • EPOCH相同,事务id大的胜出
  • 事务id相同,服务器id大的胜出
二、Raft算法相关面试问题 Raft分为哪几个部分?

  主要是分为leader选举、日志复制、日志压缩、成员变更等。

Raft中任何节点都可以发起选举吗?

  Raft发起选举的情况有如下几种:

  • 刚启动时,所有节点都是follower,这个时候发起选举,选出一个leader;

  • 当leader挂掉后,时钟最先跑完的follower发起重新选举操作,选出一个新的leader。

  • 成员变更的时候会发起选举操作。

Raft中选举中给候选人投票的前提?

Raft确保新当选的Leader包含所有已提交(集群中大多数成员中已提交)的日志条目。这个保证是在RequestVoteRPC阶段做的,candidate在发送RequestVoteRPC时,会带上自己的last log entry的term_id和index,follower在接收到RequestVoteRPC消息时,如果发现自己的日志比RPC中的更新,就拒绝投票。日志比较的原则是,如果本地的最后一条log entry的term id更大,则更新,如果term id一样大,则日志更多的更大(index更大)。

Raft网络分区下的数据一致性怎么解决?

发生了网络分区或者网络通信故障,使得Leader不能访问大多数Follwer了,那么Leader只能正常更新它能访问的那些Follower,而大多数的Follower因为没有了Leader,他们重新选出一个Leader,然后这个 Leader来接受客户端的请求,如果客户端要求其添加新的日志,这个新的Leader会通知大多数Follower。如果这时网络故障修复 了,那么原先的Leader就变成Follower,在失联阶段这个老Leader的任何更新都不能算commit,都回滚,接受新的Leader的新的更新(递减查询匹配日志)。

Raft数据一致性如何实现?

主要是通过日志复制实现数据一致性,leader将请求指令作为一条新的日志条目添加到日志中,然后发起RPC 给所有的follower,进行日志复制,进而同步数据。

Raft的日志有什么特点?

日志由有序编号(log index)的日志条目组成,每个日志条目包含它被创建时的任期号(term)和用于状态机执行的命令。

Raft和Paxos的区别和优缺点?

Raft的leader有限制,拥有最新日志的节点才能成为leader,multi-paxos中对成为Leader的限制比较低,任何节点都可以成为leader。

Raft中Leader在每一个任期都有Term号。

Raft prevote机制?

在这里插入图片描述

Prevote(预投票)是一个类似于两阶段提交的协议,第一阶段先征求其他节点是否同意选举,如果同意选举则发起真正的选举操作,否则降为Follower角色。这样就避免了网络分区节点重新加入集群,触发不必要的选举操作。

Raft里面怎么保证数据被commit,leader宕机了会怎样,之前的没提交的数据会怎样?

leader会通过RPC向follower发出日志复制,等待所有的follower复制完成,这个过程是阻塞的。

老的leader里面没提交的数据会回滚,然后同步新leader的数据。

Raft日志压缩是怎么实现的?增加或删除节点呢??

在实际的系统中,不能让日志无限增长,否则系统重启时需要花很长的时间进行回放,从而影响可用性。Raft采用对整个系统进行snapshot来解决,snapshot之前的日志都可以丢弃(以前的数据已经落盘了)。

snapshot里面主要记录的是日志元数据,即最后一条已提交的 log entry的 log index和term。

Raft里面的lease机制是什么,有什么作用?

租约机制确保了一个时刻最多只有一个leader,避免只使用心跳机制产生双主的问题。中心思想是每次租约时长内只有一个节点获得租约、到期后必须重新颁发租约。在这里插入图片描述

Raft协议的leader选举,正常情况下,网络抖动造成follower发起leader选举,且该follower的Term比现有leader高,集群中所有结点的日志信息当前一致,这种情况下会选举成功吗?

参考网络分区的情况。

三、Zookeeper的常用命令
ls、get、create、delete
节点怎么创建命令
// 创建永久节点

create /test laogong 

// 创建临时节点

create -e /test laogong 

// 创建顺序节点

create -s /test 

// 创建临时顺序节点

create -e -s /test  
四、项目中Zookeeper相关问题 你们的项目生产集群安装多少?安装多少zk合适?

安装奇数台 安装奇数台 。生产经验: 生产经验:

  • 10台服务器: 服务器: 3台 zk;
  • 20台服务器: 服务器: 5台 zk;
  • 100台服务器: 服务器: 11台 zk;
  • 200台服务器: 服务器: 11台 zk;
五、分布式锁相关问题

在多线程环境下,由于上下文的切换,数据可能出现不一致的情况或者数据被污染,我们需要保证数据安全,所以想到了加锁。所谓的加锁机制呢,就是当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问,直到该线程读取完,其他线程才可使用。详细的有关于分布式锁的问题看请查看项目的博文:高并发项目设计——分布式锁解决方案_庄小焱-CSDN博客

博文参考

关注
打赏
1657692713
查看更多评论
立即登录/注册

微信扫码登录

0.0397s