`
357029540
  • 浏览: 734992 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

zookeeper集群选举机制(二)

阅读更多

        在上面我们总结了简单的zookeeper集群的配置,也提到了集群中的leader和follower,那么我们是如何选举出leader的呢?这里需要先了解下paxos算法,它是一种基于消息传递且具有高度容错性的一致性算法,是分布式一致算法中的经典算法,它也是两阶段提交算法,但是与平时所说的两阶段算法不一样,在paxos算法中有提议者(proposer)、接收者(acceptor)和学习者(leaner)三种节点角色。

       提议者负责提出需要达成一致的value值,而接收者则负责接收提议者发送过来的value,对该提议进行投票,以决定是否接收提议者发送过来的value,学习者不参与投票,只接收投票结果。下面大概解释下paxos算法的两阶段提交算法:

     A1.提议者选择一个提案编号n,并且给大多数的接收者发送带有该编号n的一个提案预请求。

     A2.如果接收者接收到一个编号为n的提案预请求,并且请求的编号n大于前面已经响应过的预请求编号,那么则做出响应,同时承诺不再接收比该编号n更小的预请求编号,如果接收者中已经有预请求编号,则在做出的响应中返回接收过的最高的编号提案。

   B1.如果提议者接收到大多数接收者对于编号n的预请求响应,这时会给每个接收者发送一个带有提议编号为n和值为v的接收请求,这个v值的来源是如果接收者响应中已经包含有其他提议者的内容,则取接收者响应中最高编号的对应的v值,如果响应中没有其他提议内容,则v可以取任意值,这个响应的v值会覆盖提议者当前编号n对应的v值。

   B2.如果接收者收到一个提议编号为n的接收请求,它接收该提案,如果它已经准备对大于编号n的预请求做出响应,则不接收编号n的提案。

    经过以上步骤,最终只会有一个提议者被选择,只有被选择的提议者才会被learn节点学习,同时也保证了选择的可终止性。

   了解完paxos算法也就大概明白了zookeeper的leader选举过程,只不过在zookeeper中还有一些专门的名词:

    服务器id---集群中在配置文件中dataLog路径下存放的myid。

    事务id---服务器中存放的最大数据zxid。

    逻辑时钟---发起的投票轮数计数。

    选举状态:

         LOOKING---竞选状态。

         FOLLOWING---随从状态,同步LEADER状态,参与投票。

         OBSERVING---观察者状态,同步LEADER状态,不参与投票。

         LEADING---领导者状态。

     在zookeeper集群中要作为LEADING,必须要满足以下2个条件:

           1.选举出的leader必须要有最高的zxid。

           2.要超过半数节点同意。半数节点的计算方式是n/2+1,n代表zookeeper服务器的数量,作为分布式集群n的数量一般设置为奇数个。

     在其内部有3种默认的选举算法:

          1.基于UDP的非认证的fast leader election

          2.基于UDP的认证的fast leader election

          3.基于TCP的fast leader election

     需要注意的是前2种算法将在下一个版本中删除,只有第3种版本。我们具体了解下zookeeper的选举算法:

       1.每个zookeeper服务实例都向自己发起选择自己为leader的投票。

       2.其他服务实例收到投票邀请时,比较发起者的zxid是否比自己的zxid大,大则投票给它,小则不投票,相等则比较发起者的服务器id,大则投票给它。

       3.发起者收到大家的投票反馈后,看投票数(包含自己)是否大于集群的半数,大则胜出,当选leader;未超过半数且领导者未选举出来,则重新发起投票。

     假设我们有5台zookeeper服务器,假设都是第一次启动,所有的zxid都相同,我们依次启动1,2,3,4,5服务器,看它是如何选举出leader的:

     1.服务器1启动时,它自己给自己投票,然后对其他服务器发起投票,由于其他服务器还没有启动,那么服务器1就会一直处于LOOKING状态

      2.服务器2启动,它也会给自己投票,同时它会向其他服务器发起投票,这时因为zxid都相同,所以比较它们的服务器id,所以服务器2胜出,但是由于不满足大多数服务器已启动的要求,所以服务器1,2也都会处于LOOKING状态。

      3.服务器3启动,这时会给自己投票,同时也会向其他服务器发起投票,因为服务器1,2都已经启动,并且它们的zxid都相同,所以比较服务器id,因为服务器3的服务器id比1,2的都大,所以这时服务器3就会满足成为leader的条件,因为已经超过大多数。

       4.服务器4启动,这时会给自己投票,同时也会向其他服务器发起投票,因为服务器1,2,3已经启动并且已经选举出了leader,尽管服务器4的服务id都比它们大,但是服务器3已经成为leader已经是事实,所以它也只能成为FOLLOWING了。

      5.服务器5启动,它也会做出和服务器4一样的动作,但是也只能成为FOLLOWING了。

      我们选举完成了leader后,我们如何保证leader和followering数据的同步呢?这时就不得不了解我们zookeeper的协议zab协议了,它是专门为zookeeper设计的数据一致性协议,其最重要的就是数据的有序性,它也是参考paxos算法实现的。我们了解下zab协议的过程:

     1.所有的事务请求(增删改)都会转发到leader服务器处理。

     2.leader会分配全局的事务id(zxid),然后向following进行广播事务提议。

     3.following进行提议处理,做出反馈给leader。

     4.leader收到过半数的反馈,就广播commit。

     5.leader对传送来事务请求的服务器做出反应,不管是来自following还是自己。

     我们接下来看下如果某台服务器宕机或者失联后,我们该如何处理?这里我们得说明下zab协议最重要的2个确保机制:

     1.zab协议确保leader提交的事务最终被所有的服务器都提交。zab协议规定如果在某一台服务器上面事务提议处理成功,那么在所有的服务器上面都会处理成功,哪怕是某个服务器崩溃了。

    2.zab协议确保丢弃那些只在leader上面被提出的事务,也就是说还没有广播给following的数据。

    我们还是以上面的5台服务器为例,服务3是现在的leader:

    1.当服务器1宕机后,因为服务器1是following,所以不会触发leader重新选举,当服务器1重新启动后,那么会自动的将leader中的数据同步到服务器1中。

    2.当服务器1和2和leader失联后,由于形成不了大多数,所以也不会出现新的选举,当恢复重连后也会自动将新的数据同步到服务器1和2中。

   3.当服务器3宕机或失联后,这时会出现重新选举leader,首先它会根据选举策略获取zxid最大的服务器,如果只有1台服务器的zxid是最大的,那么这台服务器就会成为新的leader,如果有多台服务器的zxid都是最大的,那么则会根据服务器id来选举出新的leader;新的leader服务器中的数据会根据zab协议的2个确保机制来保证是最新的,当服务器3恢复后,它会向其他的服务器发送提议毕竟以前它是leader,这时它才发现它的数据已经不是最新的了,这时它就会把自己的数据丢弃掉同时成为following,去新的leader同步数据到自己。

     在这里需要说明下的是zxid是一个64位的数字,后32位是单调递增的计数器,leader每产生一次提议就会对该计数器+1,前32位表示一个周期纪元编号,也是一个计数器,每产生一个新的leader就会+1。

分享到:
评论

相关推荐

    Linux下Zookeeper集群的安装

    #### 二、Zookeeper集群安装步骤 ##### 安装前准备 在正式安装Zookeeper集群之前,需要完成以下准备工作: 1. **环境搭建**:确保所有节点上的操作系统版本一致,并且已经安装好了必要的基础软件(如JDK)。 2. **...

    zookeeper集群安装.doc

    启动Zookeeper集群,需要在每台服务器上启动Zookeeper服务,Zookeeper集群将自动选举出Leader节点,并提供高可用性的分布式协调服务。 通过上述步骤,我们可以成功地安装和配置Zookeeper集群,提供高效、可靠、稳定...

    zookeeper集群配置详解

    在Linux集群环境中搭建Zookeeper集群是一个涉及到多台服务器间协调工作的复杂过程,需要...Zookeeper集群的配置是一个细致的过程,需要对Zookeeper的工作原理和集群机制有深入的了解,才能确保集群能够稳定高效地运行。

    zookeeper集群

    1. 选举Leader:在ZooKeeper集群中,需要选举一个Leader服务器,以便协调集群中的其他服务器。 2. Follow模式:在ZooKeeper集群中,Follow服务器负责复制Leader服务器的数据,以便保证集群中的数据一致性。 五、...

    zookeeper集群.rar

    Zookeeper集群是一个分布式协调服务,由Apache开发,广泛应用于分布式计算环境,如Hadoop、HBase、Kafka等。在Windows环境下搭建Zookeeper集群,主要涉及以下步骤和知识点: 1. **Zookeeper安装**: 首先需要下载...

    zookeeperMaster选举以及数据同步代码

    在分布式系统中,Zookeeper是一个至关重要的组件,它主要用于实现分布式服务管理,提供诸如配置管理、命名服务、集群同步、 leader选举等核心功能。在这个"zookeeperMaster选举以及数据同步代码"项目中,我们将深入...

    Zookeeper集群搭建.doc

    Zookeeper集群搭建是一个重要的任务,尤其在分布式系统中,它作为协调服务,为高可用性和数据一致性提供了基础。Zookeeper是Apache的一个开源项目,用于处理分布式应用中的命名服务、配置管理、集群同步、选举等功能...

    zookeeper linux集群搭建流程

    在选举模式下,ZooKeeper 节点之间不能相互通信,需要选举出一个 leader 节点来恢复集群。 ZooKeeper 应用场景 ZooKeeper 广泛应用于分布式系统中,例如分布式配置管理、分布式锁、分布式队列等。ZooKeeper 的高...

    Zookeeper双机房容灾方案.pdf

    Zookeeper选举机制是指Zookeeper集群中leader的选举机制。Zookeeper选举机制采用投票机制和过半策略。当集群中半数以上的Zookeeper实例启动时,leader就会被确定。后续新增的Zookeeper实例会默认变成follower。 ...

    C# 关于zookeeper主从选举的源码

    在分布式系统中,主从选举是一个关键的机制,用于确定哪个节点将作为领导者来协调其他节点,例如在Zookeeper集群中。本项目是基于C#实现的Zookeeper主从选举的源码,对于理解Zookeeper的工作原理以及如何在C#环境中...

    zookeeper集群+配置手册

    Zookeeper集群是一个分布式协调服务,常用于管理大型分布式系统中的命名空间、配置管理、领导者选举等任务。在本文中,我们将深入探讨如何搭建一个由三个节点组成的Zookeeper集群,并了解其配置过程。 首先,...

    zookeeper集群安装文档.docx

    在搭建Zookeeper集群时,首先需要准备至少三台服务器,以确保集群的容错性。在这个例子中,我们有三台服务器,IP地址分别为192.168.114.102、103和104,主机名为yz-yf-zookeeper01、02和03。为了运行Zookeeper,每台...

    面试官:Zookeeper集群怎么搭建?.doc

    二、Zookeeper集群角色 Zookeeper集群中有三种角色: * Leader角色:可以处理读写请求,集群中只能有一个Leader角色,负责维护集群状态和协调节点之间的通信。 * Follower角色:只能处理读请求,同时也是Leader的...

    3、zookeeper的选举

    Leader选举是Zookeeper集群中的重要环节,它分为集群初始化启动时的选举和运行期间的Leader重新选举两种情况。在深入理解选举机制之前,我们需要先了解Zookeeper节点的四种状态以及事务ID的概念。 1. 节点状态: -...

    zookeeper集群监控工具taokeeper

    2. **异常告警**: 当检测到Zookeeper集群出现异常,如节点丢失、会话超时、选举失败等,Taokeeper能够快速触发告警机制,及时通知运维人员,以便及时采取修复措施,避免故障扩大。 3. **可视化界面**: Taokeeper...

    实现zookeeper集群节点管理及Master选举完整示例java项目下载(含依赖jar包).txt

    该项目通过zookeeper三个节点Node服务客户端代码,实现zookeeper集群管理与Master选举功能示例,项目结构如下图所示,其中依赖包包含:log4j-1.2.14.jar、slf4j-api-1.7.2.jar、slf4j-log4j12-1.7.2.jar、zookeeper-...

    kafka集群zookeeper集群整合配置

    在本文中,我们将深入探讨如何将Kafka集群与Zookeeper集群整合配置,以实现稳定可靠的运行环境。 首先,理解Zookeeper的角色。Zookeeper在Kafka中的主要职责包括: 1. **元数据存储**:Kafka的 Topic、Partition、...

    zookeeper集群搭建

    #### 二、Zookeeper 的安装与集群搭建 **2.1 安装单机 Zookeeper** 对于某些系统而言,如果对安全性和实时性要求不高,可以考虑使用单机版 Zookeeper 以降低成本。 ##### 2.1.1 准备工作 1. **克隆并配置主机**...

    自动动手写zookeeper选举算法与心跳同步

    两者结合,确保了即使在部分节点失效的情况下,Zookeeper集群也能继续提供服务。 为了更好地理解和实现这些概念,可以参考提供的"reademe.txt"文件和相关博客。它们可能会详细解释代码实现、算法原理以及如何在本地...

Global site tag (gtag.js) - Google Analytics