实际上,leader选举的算法非常多,比如Zookeeper的Zab、Raft以及Viewstamped Replication。而Kafka所使用的leader选举算法更像是微软的PacificA算法。

Kafka在Zookeeper中为每一个partition动态的维护了一个ISR,这个ISR里的所有replica都跟上了leader,只有ISR里的成员才能有被选为leader的可能(unclean.leader.election.enable=false)。在这种模式下,对于f+1个副本,一个Kafka topic能在保证不丢失已经commit消息的前提下容忍f个副本的失败,在大多数使用场景下,这种模式是十分有利的。事实上,为了容忍f个副本的失败,“少数服从多数”的方式和ISR在commit前需要等待的副本的数量是一样的,但是ISR需要的总的副本的个数几乎是“少数服从多数”的方式的一半。

上文提到,在ISR中至少有一个follower时,Kafka可以确保已经commit的数据不丢失,但如果某一个partition的所有replica都挂了,就无法保证数据不丢失了。这种情况下有两种可行的方案:

  • 等待ISR中任意一个replica“活”过来,并且选它作为leader
  • 选择第一个“活”过来的replica(并不一定是在ISR中)作为leader

如果一定要等待ISR中的replica“活”过来,那不可用的时间就可能会相对较长。而且如果ISR中所有的replica都无法“活”过来了,或者数据丢失了,这个partition将永远不可用。选择第一个“活”过来的replica作为leader,而这个replica不是ISR中的replica,那即使它并不保障已经包含了所有已commit的消息,它也会成为leader而作为consumer的数据源。默认情况下,Kafka采用第二种策略,即unclean.leader.election.enable=true,也可以将此参数设置为false来启用第一种策略。

unclean.leader.election.enable这个参数对于leader的选举、系统的可用性以及数据的可靠性都有至关重要的影响。下面我们来分析下几种典型的场景。

如果上图所示,假设某个partition中的副本数为3,replica-0, replica-1, replica-2分别存放在broker0, broker1和broker2中。AR=(0,1,2),ISR=(0,1)。

设置request.required.acks=-1, min.insync.replicas=2,unclean.leader.election.enable=false。这里讲broker0中的副本也称之为broker0起初broker0为leader,broker1为follower。

1. 当ISR中的replica-0出现crash的情况时,broker1选举为新的leader[ISR=(1)]
因为受min.insync.replicas=2影响,write不能服务,但是read能继续正常服务。此种情况恢复方案:

  • 尝试恢复(重启)replica-0,如果能起来,系统正常;
  • 如果replica-0不能恢复,需要将min.insync.replicas设置为1,恢复write功能。

2. 当ISR中的replica-0出现crash,紧接着replica-1也出现了crash, 此时[ISR=(1),leader=-1]

不能对外提供服务,此种情况恢复方案:

  • 尝试恢复replica-0和replica-1,如果都能起来,则系统恢复正常;
  • 如果replica-0起来,而replica-1不能起来,这时候仍然不能选出leader,因为当设置unclean.leader.election.enable=false时,leader只能从ISR中选举,当ISR中所有副本都失效之后,需要ISR中最后失效的那个副本能恢复之后才能选举leader, 即replica-0先失效,replica-1后失效,需要replica-1恢复后才能选举leader。保守的方案建议把unclean.leader.election.enable设置为true,但是这样会有丢失数据的情况发生,这样可以恢复read服务。同样需要将min.insync.replicas设置为1,恢复write功能;
  • replica-1恢复,replica-0不能恢复,这个情况上面遇到过,read服务可用,需要将min.insync.replicas设置为1,恢复write功能;
  • replica-0和replica-1都不能恢复,这种情况可以参考情形2.

3. 当ISR中的replica-0, replica-1同时宕机,此时[ISR=(0,1)]

不能对外提供服务,此种情况恢复方案:尝试恢复replica-0和replica-1,当其中任意一个副本恢复正常时,对外可以提供read服务。直到2个副本恢复正常,write功能才能恢复,或者将将min.insync.replicas设置为1。

原文连接:https://www.cnblogs.com/aidodoo/p/8888628.html

Kafka的leader选举相关推荐

  1. Kafka Partition Leader选举机制原理详解

    1 大数据常用的选主机制 Leader选举算法非常多,大数据领域常用的有以下两种: 1.1 Zab(zookeeper使用) Zab协议有四个阶段 Leader election Discovery ...

  2. Kafka 副本leader选举

    谁来实施 分区leader副本的选举由Kafka Controller 负责具体实施. 选举时间 leader挂掉时 broker挂掉时,然后broker上可能有某些leader 选举资格 Kafka ...

  3. 【大数据哔哔集20210124】有人问我Kafka Leader选举?我真没慌

    一条消息只有被ISR中所有Follower都从Leader复制过去才会被认为已提交.这样就避免了部分数据被写进了Leader,还没来得及被任何Follower复制就宕机了,而造成数据丢失.而对于Pro ...

  4. Kafka系列之:深入理解Kafka 主题、分区、副本、LEO、ISR、HW、Kafka的主写主读和分区leader选举

    Kafka系列之:深入理解Kafka 主题.分区.副本.LEO.ISR.HW.Kafka的主写主读和分区leader选举 一.Kafka重要知识点提炼 二.详细介绍Kafka 主题.分区.副本.LEO ...

  5. kafka中leader和follower、AR、ISR、OSR、Controller的选举、为什么不能通过ZK的方式来选举partition的leader?

    leader和follower 在Kafka中,每个topic都可以配置多个分区以及多个副本.每个分区都有一个leader以及0个或者多个follower,在创建topic时,Kafka会将每个分区的 ...

  6. kafka leader选举过程

    前言 通过之前的篇章,我们了解到kafka集群中存在一个leader,这个leader目前来说,通常是谁先注册到zk中,即在broker的ids节点中的第一位,就是leader 但是在某些情况下,比如 ...

  7. 副本的leader选举

    Kafka提供了数据复制算法保证,如果leader副本所在的broker节点宕机或者出现故障,或者分区的leader节点发生故障,这个时候怎么处理呢? 那么,kafka必须要保证从follower副本 ...

  8. Kafka科普系列 | 原来Kafka中的选举有这么多?

    欢迎跳转到本文的原文链接:https://honeypps.com/mq/kafka-basic-knowledge-of-selection/ 面试官在考查你Kafka知识的时候很可能会故弄玄虚的问 ...

  9. Kafka-之控制器(Controller选举、leader选举)

    Kafka-之控制器(控制器选举,leader选举) 1 控制器是什么,如何选举 kafka控制器管理着整个集群中分区以及副本的状态,控制器的选举需要依赖于Zookeeper,在kafka集群启动的时 ...

最新文章

  1. iOS 预览word pdf 文件
  2. 沈阳建立通用航空产业基地,开辟国内首家无人机专用空域
  3. cv2.resize
  4. Eureka与zookeeper
  5. 怎么给工作中重要的pdf文件加密
  6. java metapojo_JavaBean,POJO,VO,DTO的区别和联系
  7. Python: Console框消失
  8. 一个简单粗暴的前后端分离方案
  9. Windows 搭建 .NET 跨平台环境并运行应用程序
  10. 这个城市快递外卖小哥将配电子号牌了,违法2起以上停止派单
  11. nvinfer1::cudnn::Engine::deserialize()出错的原因
  12. 汽车发展史大事件(1766-2017)
  13. linux查找外接摄像头端口
  14. 搭建springboot+mybatis+freemarker项目
  15. solr两种安装、ik分词器设置、DIH导入mysql数据
  16. Domain name server 域名服务
  17. STM32’s I2C 硬件BUG引发的血案(qzm)
  18. 解决Oracle中文乱码问题
  19. php网上书城|基于PHP实现网上书店商城藉项目
  20. 【VSCode PlatformIO】开发STC单片机头文件和常用外设驱动头文件获取方式

热门文章

  1. 【小f的刷题笔记】(JS)链表 - 合并 k 个有序链表 LeetCode23 - 顺序合并暴力三种方法
  2. ai边缘平滑_关于AI边缘运算,你应该知道这些!
  3. ubuntu boot空间不足_安装win10+Ubuntu双系统的经验心得
  4. 基于uniapp+vue微信小程序的在职考研学习辅导系统
  5. 计算机在围棋面前一筹莫展
  6. 模拟新浪微博登录-原理分析到实现
  7. 如何将二维空间先验注入到ViT中? UMA港理工阿里提出SP-ViT,为视觉Transformer学习2D空间先验知识!...
  8. 对讯时新闻发布系统的艰难突破
  9. bootstrap之affix
  10. php502bad gateway,PHP表单提交后出现502 bad gateway解决办法