Kafka 入门到起飞 - Kafka是怎么保证消息可靠性的呢

什么是消息的可靠性呢,就是Kafka作为消息中间件,可以保证生产者发送过来的消息,即使在Kafka集群有节点出现宕机的情况下,也不会丢失
Kafka 是通过消息确认机制副本复制机制 来保证消息可靠性的

什么是副本因子?什么是副本复制机制呢?

  • 创建topic时,可以指定副本因子 repilication-factor = 3,默认是3
    • 表示分区的副本数,包括Leader分区副本和follower分区副本
    • 副本因子不要超过broker的数量,尽量保证一个分区的副本均匀地分散在不同的broker上
    • 第一个副本通过轮询的方式分配broker,从broker列表中随机位置开始轮询(生成一个随机数,选定第一个broker,然后开始逐个轮询broker放副本)
    • 副本机制主要是为了实现高可用
  • Leader 副本只有一个,负责读写,其他节点都是Follower副本,
  • Producer 只把消息发送到Leader分区,Follower副本负责从Leader同步数据
  • 也就是说在Kafka集群内会一直存在大量数据复制过程,这也会造成Kafka一个性能瓶颈

如何判断副本是同步副本呢?

  • ISR 同步副本列表 (包含Leader)
    • 怎么样算同步呢
    • replica.lag.max.messages 默认4000条,Follower消息已经滞后Leader4000条,即踢出ISR,新版本已经取消该规则
    • replica.lag.max.ms 默认10000ms, 10s内Follower 还没有向Leader发送fetch请求,即踢出ISR
      • 新版本只通过该规则识别有效副本
      • 当Follower副本将Leader副本LEO之前的所有消息都同步时,认为该副本已经追赶上Leader副本
      • 更新该副本的lastCaughtUpTimeMs 最后拉取数据的时间戳
      • ReplicaManager 副本管理器 会启动一个定时任务
      • 定时任务定时监测 当前时间lastCaughtUpTimeMs 的差值 是否大于replica.lag.max.ms
      • 大于即说明当前副本失效,踢出ISR
    • 每条消息都带时间戳,生产者不带的话broker也会给消息生成时间戳,当查找消息时就是根据偏移了+时间戳

什么情况会导致副本失效呢?

  • 卡副本(Stuck Replica) Follower副本进程卡住,一段时间内没有向Leader副本发起请求,比如Follower副本所在的broker内存满了,频繁发起Full GC,我们知道Full GC时会STW(stop the world ),啥也干不了了
  • 慢副本(Slow Replica) Follower 副本进程同步过慢,网络或者IO开销过大或机器性能问题,导致Follower在一段时间内无法赶上Leader
  • 刚启动副本(BootStrapping Replica) 改变副本因子,比如增加一个副本,新增副本在同步Leader数据时,也会一直处于失效状态; Follower节点由于宕机下线了,后又上线,在追赶上Leader副本之前也处于失效状态

如何保证消息的可靠性呢?

  • 为了保证可靠性,可以设置确认机制ack= all
    • Producer将消息发送给Leader
    • Leader会等到ISR中所有Follower同步数据发送ack
    • Leader 再commit,Leader再向Producer发送ack
    • 保证生产者发送的消息实际写入所有副本
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值