zoukankan      html  css  js  c++  java
  • kafka中对于zookeeper的理解和leader选举过程

    1. 首先zookeeper是什么

      zookeeper是一个开放源代码的分布式应用程序协调服务,可以把它看成是整个集群的管理者,监视者。

    2. zookeeper能做什么

      它可以实现诸如分布式应用配置管理、统一命名服务、状态同步服务、集群管理等功能。

    3. zookeeper服务与kafka集群的联系

      

      这里首先说一下broker的概念:Kafka 集群包含一个或多个服务器,这种服务器被称为 broker,每个broker服务器都要连接到zk服务。

    • 一个典型的kafka集群中包含若干个producer(生产者),若干broker(一般broker越多,集群吞吐率越高),若干consumer group(消费组),以及一个zookeeper服务。
    • kafka通过zookeeper管理集群配置,选举leader,以及在消费组发生变化时进行rebalance。
    • producer使用push模式将消息发布到broker,consumer使用pull模式从broker订阅并消费消息。

    4. Leader选举流程。

      选举流程主要出现在以下两种情况发生时:

      (1)服务器初始化启动时;

      (2)服务器在运行期间leader出现故障。

      由于涉及到算法和流程较复杂,这里就以个人理解浅显的描述以下选举过程,如有不当的地方欢迎指正。

      当服务器在初始化时启动:

      假设集群中共有3台机器,分别使用server1、server2、server3等来表示,按编号以此启动起来。
      第一步:每个server发起一个投票,推荐自己作为leader服务器,投票内容为(Serverid,Zxid),分别表示服务器ID、数据ID(服务器中存放定的最大数据ID)。由于server1先启动,它的投票为(1,0),然后进入Looking状态;
      第二步:server2启动,发起投票为(2,0),并与已启动的server1交换结果,由于server2的编号2大于1,因此胜出,并告知server1。
      第三步:server1将自己的投票改为(2,0),并重新投票。而server继续维持之前投票(2,0)。这个时候统计第二轮投票,server2以两票胜出,同时判断当前投票人数为2,已经超过3台服务器的50%,因此结果生效,server2当选为Leader,状态变为LEADING;server1状态变为FOLLOWING。
      第四部:此时server3启动,发现Leader已经存在,则直接将自己的状态调整为FOLLOWING。

      注意:如果集群中有5台机器,那么由于投票人数不足50%,则需要保持Looking状态,继续等待新的投票者加入,直到超过50%为止。

      

      当服务器在运行期间leader出现故障:  

      第一步:假设server2作为leader挂了之后,剩下所有机器都会将自己的状态改为LOOKING,然后开始Leader选举过程。
      第二步:server1发出投票为(1,233),server3发出投票为(3,222)。
      第三步:两台机器互相接收来自别的服务器的投票,判断投票的有效性(是否来自LOOKING状态的服务器),然后进行将别人的投票与自己的投票进行PK,PK规则如下:1.优先检查Zxid,Zxid较大的优先作为leader;2.如果Zxid相同,那么Serverid较大的胜出。对于当前情况来看,server1胜出。
      第四步:发起第二轮投票,server3将自己投票改为(1,233),server1保持不变(1,233),此时判断投票人数超过半数,server1胜出,当选为新leader。server1状态改为LEADING,server3状态改为FOLLOWING。

    参考文章:《zookeeper的leader选举过程》

    https://blog.csdn.net/virtil33/article/details/94343215

    最懒的人就是整天忙得没时间学习、反思、成长的人。
  • 相关阅读:
    runtime关联属性示例
    Loader之二:CursorLoader基本实例
    Loader之一:基本原理
    Fragment之三:根据屏幕尺寸加载不同的Fragment
    Fragment之一:Fragment入门
    Github android客户端源代码分析之一:环境搭建
    如何在Eclipse中查看Android API源码以及support包源码
    Intent七在属性之一:ComponentName
    Intent七大属性之总结
    使用SQLiteHelper创建数据库并插入数据
  • 原文地址:https://www.cnblogs.com/jockeyhao/p/12180176.html
Copyright © 2011-2022 走看看