面试官:什么是Zookeeper的选举机制?
Zookeeper是一个分布式服务框架主要是用来解决分布式应用中遇到的一些数据管理问题如统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。我们可以简单把Zookeeper理解为分布式家庭的大管家那么管家团队是如何选出Leader的呢好奇吗接下来带领大家一探究竟。人类选举的基本原理讲解Zookeeper选举过程前先来介绍一下人类的选举。我们每个人或多或少都经历过几次选举在投票的过程中可能会遇到这样几种情况情况1自己与几个候选人都比较熟你会将票投给你认为能力比较强的人熟人选举情况2自己也是候选人并且与其他几个候选人都不熟这个时候你肯定想着要去拉票因为觉得自己才是最厉害的人呀所有人都应该把票投给我。但是遗憾的是在拉票的过程中你发现别人比你强你开始自卑了最终还是把票投给了自己认为最强的人。自己参与选举所有人都投完票之后最后从投票箱中进行统计获得票数最多的人当选。思维导图在整个投票过程中我们可以提炼出四个最核心的概念候选人能力投票的基本原则是选最强的人。遇强改投如果后面发现更强的人可以改投票。投票箱所有人的票都会放在投票箱。领导者得票最多的人即为领导者。从人类选举的原理我们来简单推导一下Zookeeper的选举原理。Zookeeper选举的基本原理注意如果 Zookeeper 是单机部署是不需要选举的集群模式下才需要选举。Zookeeper 的选举原理和人类选举的逻辑类似套用一下人类选举的四个基本概念详细解释一下Zookeeper。个人能力如何衡量 Zookeeper 节点个人能力答案是靠数据是否够新如果节点的数据越新就代表这个节点的个人能力越强是不是感觉很奇怪就是这么定的在 Zookeeper 中通常是以事务id后面简称zxid来标识数据的新旧程度版本节点最新的zxid越大代表这个节点的数据越新也就代表这个节点能力越强。zxid 的全称是ZooKeeper Transaction Id即 Zookeeper 事务id。遇强改投在集群选举开始时节点首先认为自己是最强的即数据是最新的然后在选票上写上自己的名字包括zxid和sidzxid 是事务idsid 唯一标识自己。紧接着会将选票传递给其他节点同时自己也会接收其他节点传过来的选票。每个节点接收到选票后会做比较这个人是不是比我强zxid比我大如果比较强那我就需要改票明明别人比我强我也不能厚着脸皮对吧。投票箱与人类选举投票箱稍微有点不一样Zookeeper 集群会在每个节点的内存中维护一个投票箱。节点会将自己的选票以及其他节点的选票都放在这个投票箱中。由于选票是互相传阅的所以最终每个节点投票箱中的选票会是一样的。领导者在投票的过程中会去统计是否有超过一半的选票和自己选择的是同一个节点即都认为某个节点是最强的。一旦集群中有超过半数的节点都认为某个节点最强那该节点就是领导者了投票也宣告结束。什么场景下 Zookeeper 需要选举当 Zookeeper 集群中的一台服务器出现以下两种情况之一时需要进入Leader 选举。1服务器初始化启动。2服务器运行期间 Leader 故障。启动时期的 Leader 选举假设一个 Zookeeper 集群中有5台服务器id从1到5编号并且它们都是最新启动的没有历史数据。集群刚启动选举过程假设服务器依次启动我们来分析一下选举过程1服务器1启动发起一次选举服务器1投自己一票此时服务器1票数一票不够半数以上3票选举无法完成。投票结果服务器1为1票。服务器1状态保持为LOOKING。2服务器2启动发起一次选举服务器1和2分别投自己一票此时服务器1发现服务器2的id比自己大更改选票投给服务器2。投票结果服务器1为0票服务器2为2票。服务器12状态保持LOOKING3服务器3启动发起一次选举服务器1、2、3先投自己一票然后因为服务器3的id最大两者更改选票投给为服务器3投票结果服务器1为0票服务器2为0票服务器3为3票。此时服务器3的票数已经超过半数3票服务器3当选Leader。服务器12更改状态为FOLLOWING服务器3更改状态为LEADING。4服务器4启动发起一次选举此时服务器123已经不是LOOKING 状态不会更改选票信息。交换选票信息结果服务器3为3票服务器4为1票。此时服务器4服从多数更改选票信息为服务器3。服务器4并更改状态为FOLLOWING。5服务器5启动与服务器4一样投票给3此时服务器3一共5票服务器5为0票。服务器5并更改状态为FOLLOWING。最终的结果服务器3是Leader状态为LEADING其余服务器是Follower状态为FOLLOWING。运行时期的Leader选举在 Zookeeper运行期间Leader和非 Leader各司其职当有非 Leader 服务器宕机或加入不会影响 Leader但是一旦 Leader 服务器挂了那么整个 Zookeeper 集群将暂停对外服务会触发新一轮的选举。初始状态下服务器3当选为Leader假设现在服务器3故障宕机了此时每个服务器上zxid可能都不一样server1为99server2为102server4为100server5为101集群 Leader 节点故障运行期选举与初始状态投票过程基本类似大致可以分为以下几个步骤1状态变更。Leader 故障后余下的非 Observer服务器都会将自己的服务器状态变更为LOOKING然后开始进入Leader选举过程。2每个Server会发出投票。3接收来自各个服务器的投票如果其他服务器的数据比自己的新会改投票。4处理和统计投票每一轮投票结束后都会统计投票超过半数即可当选。5改变服务器的状态宣布当选。话不多说先来一张图运行器 Leader 故障后选举流程1第一次投票每台机器都会将票投给自己。2接着每台机器都会将自己的投票发给其他机器如果发现其他机器的zxid比自己大那么就需要改投票重新投一次。比如server1 收到了三张票发现server2的xzid为102pk一下发现自己输了后面果断改投票选server2为老大。选举机制中涉及到的核心概念敲黑板了这些概念是面试必考的。1Server id或sid服务器ID比如有三台服务器编号分别是1,2,3。编号越大在选择算法中的权重越大比如初始化启动时就是根据服务器ID进行比较。2Zxid事务ID服务器中存放的数据的事务ID值越大说明数据越新在选举算法中数据越新权重越大。3Epoch逻辑时钟也叫投票的次数同一轮投票过程中的逻辑时钟值是相同的每投完一次票这个数据就会增加。4Server状态选举状态LOOKING竞选状态。FOLLOWING随从状态同步leader状态参与投票。OBSERVING观察状态,同步leader状态不参与投票。LEADING领导者状态。总结1Zookeeper 选举会发生在服务器初始状态和运行状态下。2初始状态下会根据服务器sid的编号对比编号越大权值越大投票过半数即可选出Leader。3Leader 故障会触发新一轮选举zxid代表数据越新权值也就越大。4在运行期选举还可能会遇到脑裂的情况大家可以自行学习。