KafKa - 分区副本ISR选举机制

举报
程序员-上善若水 发表于 2022/06/23 22:22:01 2022/06/23
【摘要】 一、KafKa分区副本ISR选举机制 kafka 中每一个主题又进一步划分成若干个分区。副本的概念实际上是在分区层级下定义的,每个分区配置有多若干个副本。 所谓的副本,本质上就是一个只能追加写消息的提...

一、KafKa分区副本ISR选举机制

kafka 中每一个主题又进一步划分成若干个分区。副本的概念实际上是在分区层级下定义的,每个分区配置有多若干个副本。

所谓的副本,本质上就是一个只能追加写消息的提交日志,根据kafka副本机制的定义,同一个分区下的所有副本保存着相同的消息序列,这些副本分散的保存在不同的Broker上,从而能够对抗部分Broker宕机带来的数据不可用。

如下图,在3节点的 kafka 集群中,对 topic:主题1 分了三个分区三个副本。
在这里插入图片描述
kafka 分区中的副本机制中,又分了 Leader 节点 和 Follower 节点,消息会写到Leader 节点中,由Leader 节点将数据同步给 Follower 节点,每个副本都可以进行读操作,从而减轻读的压力。

既然存在 LeaderFollower 节点,肯定需要一个 Leader 选举机制,谁也不能确保 Leader 节点可以一直正常存活,有可能因为某些原因导致 Leader 节点宕机或 网络异常,这种情况下就需要在剩下的节点中选举出一个Follower 节点升级为 Leader 节点,继续提供服务。

注意:分区的副本选举问题,不是Broker的选举,而是分区中副本选举的问题,在一个Broker 中,不同的 topic 的分区下,有可能存在有的是 Leader而有的又是 Follower ,因此Broker的选举和分区的选举需要区分开来,会在本专栏后面的文章中继续讲解 BrokerLeader节点的作用和选举机制。

ISR选举机制:

kafka 中分区副本选举机制采用的ISR的机制,全称为 In-Sync Replicas,挑选出Leader节点,而 ISR 其实就是一个存放分区副本ID的集合,如果某个副本所在的 Broker 正常的和 zookeepeer能够建立连接的情况下,那这个副本的ID就会存放到该集合中,如果某个副本节点宕机之后,该副本数据就会从该ISR集合中剔除。

Leader 收到消息数据同步给Follower 节点时,如果 Follower 节点一直阻塞,长时间不给Leader 节点发送 ack ,这种情况也会从ISR集合中剔除。

如果 Leader 节点宕机之后,其他副本就会将ISR中的 Leader 节点移除,而ISR列表中最前面的副本就被选举为一个新的Leader 节点。

假如三分区,三副本的情况信息,Leader 节点发生宕机,就如下图的过程:

在这里插入图片描述
从上面这种方式可以看出,当 Leader 副本宕机之后,会从ISR同步副本列表中剔除,然后取剩下的ISR列表中第一个为Leader 副本,显然有可能还有些副本数据没有及时同步完成,当选择为Leader副本之后有可能数据会丢失。

相关配置讲解:

## 默认10s,isr中的follow没有向isr发送心跳包就会被移除
replica.lag.time.max.ms = 10000

## 根据leader 和副本的信息条数差值决定是否从isr 中剔除此副本,此信息条数差值根据配置参数,在broker数量较少,或者网络不足的环境中,建议提高此值.
replica.lag.max.messages = 4000

## follower与leader之间的socket超时时间
replica.socket.timeout.ms=30*1000

## 数据同步时的socket缓存大小
replica.socket.receive.buffer.bytes=64*1024

## replicas每次获取数据的最大大小
replica.fetch.max.bytes =1024*1024

## replicas同leader之间通信的最大等待时间,失败了会重试
replica.fetch.wait.max.ms =500

## fetch的最小数据尺寸,如果leader中尚未同步的数据不足此值,将会阻塞,直到满足条件
replica.fetch.min.bytes =1

## leader进行复制的线程数,增大这个数值会增加follower的IO
num.replica.fetchers=1

## 每个replica检查是否将最高水位进行固化的频率
replica.high.watermark.checkpoint.interval.ms = 5000

## leader的不平衡比例,若是超过这个数值,会对分区进行重新的平衡
leader.imbalance.per.broker.percentage = 10

## 检查leader是否不平衡的时间间隔
leader.imbalance.check.interval.seconds = 300

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

文章来源: blog.csdn.net,作者:小毕超,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_43692950/article/details/125036297

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。