kafka生产者

分区策略:

  分区原因:

  方便在集群中扩展,每个partition可以通过调整以适应他所在的机器,而一个topic又可以由多个partition组成,因此整个集群就可以适应任意大小的数据

  可以提高并发 因为可以以partition为单位进行读写

  分区原则:

  将producer发送的数据封装成一个ProducerRecord对象

    1)在指明partition的情况下,直接将指明得知当做partition的值

    2)没有指明partition的值但是有key的值 将key的hash值与topic的partition的个数进行取余得到partition的值

    3)既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition值,也就是常说的 round-robin 算法

 

为可保证producer发送的数据能可靠的发送到指定的topic上,topic的每个partition收到producer发送的数据后 都需要向producer发送ack确认指令,如果producer收到ack指令就会进行下一轮的发送,否则重新发送数据

面试题目:

  1)何时发送ack?

  确保有follower与leader同步完成时,leader在发送ack,这样才能保证leader挂掉之后在能从follower中选举出新的leader

  2)多少个follower同步完成后发送ack

  半数以上的follower完成同步即可发送ack,或者当全部的follower完成同步后下发送ack

  副本数据同步策略:

  方案一:半数以上完成同步,就发送ack

  优点:延迟低

  缺点:选举新的 leader 时,容忍 n 台节点的故障,需要 2n+1 个副本

  方案二:全部完成同步发送ack

  优点:选举新的leader时容忍n台结点故障,需要n+1个副本

  缺点:延迟高

  kafka选择第二种方案 原因:

同样是为了容忍n台结点故障,第一种方案需要2n+1个副本,而第二种方案需要n+1个副本,而kafka的每个分区中有大量的数据,第一种方案会造成大量数据的冗余
虽然第二种方案的延迟性比较高,但是网络延迟对kafka的延迟比较小

ISR

采用第二种方案之后,设想以下情景:leader 收到数据,所有 follower 都开始同步数据,但有一个 follower,因为某种故障,迟迟不能与 leader 进行同步,那 leader 就要一直等下去,直到它完成同步,才能发送 ack。这个问题怎么解决呢?

Leader 维护了一个动态的 in-sync replica set (ISR),意为和 leader 保持同步的 follower 集合。当 ISR 中的 follower 完成数据的同步之后,leader 就会给 follower 发送 ack。如果 follower长 时 间 未 向 leader 同 步 数 据 , 则 该 follower 将 被 踢 出 ISR , 该 时 间 阈 值 由replica.lag.time.max.ms 参数设定。Leader 发生故障之后,就会从 ISR 中选举新的 leader

 

ack应答机制

对于某些不太重要的数据来说,对数据的可靠性要求不是很高,能够容忍数据的少量丢失,没必要等到ISR中的follower全部接收成功

kafka为用户提供了三种可靠级别:

0:producer 不等待 broker 的 ack,这一操作提供了一个最低的延迟,broker 一接收到还没有写入磁盘就已经返回,当 broker 故障时有可能 丢失数据;

1:producer 等待 broker 的 ack,partition 的 leader 落盘成功后返回 ack,如果在 follower同步成功之前 leader 故障,那么将会 丢失数据 

-1(all):producer 等待 broker 的 ack,partition 的 leader 和 follower 全部落盘成功后才返回 ack。但是如果在 follower 同步完成后,broker 发送 ack 之前,leader 发生故障,那么会造成 数据重复

 

故障处理

LEO:指的是每个副本最大的offset

HW:指的是消费者能见到的最大的offset ISR中最小的LEO

1)follower故障

  follower发生故障时会被临时踢出ISR 待该follower恢复后,follower会记录本地磁盘记录的上的的HW,并将log文件高于HW的部分截取掉从 HW 开始向 leader 进行同步。等该 follower 的 LEO 大于等于该 Partition 的   的 HW,即 follower 追上 leader 之后,就可以重新加入 ISR 了

2)leader故障

  leader 发生故障之后,会从 ISR 中选出一个新的 leader,之后,为保证多个副本之间的数据一致性,其余的 follower 会先将各自的 log 文件高于 HW 的部分截掉,然后从新的 leader同步数据

 注意:这只是保证的副本之间数据的一致性,并不能保障数据不丢失或者不重复

 

posted @   先生小凯  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示