kafka常见概念和问题

1. AR(Assigned Repllicas)

AR是指分区中的所有副本集

理想情况下

AR=ISR,OSR=0

实际情况下

AR = ISR + OSR

2. ISR(in sync replica):

  • 动态维护的一组同步副本,只有这个组的成员才可以成为leader
  • leader挂掉时,在ISR集合中选举出一个follower作为leader提供服务
  • 一条信息必须同步到ISR中的所有副本才认为提交成功
  • 当ISR中的副本被认为坏掉的时候,会被踢出ISR,当重新跟上leader的消息数据时,重新进入ISR。
    • ISR副本坏掉的依据:
      • 依据一:副本落后leader最大消息数量(replica.lag.max.messages)
      • 依据二:副本响应leader最长等待时间(replica.lag.time.max.ms)
    • ISR副本坏掉的原因:
      • 加入新的副本:这是很常见的情况,每个新的副本加入都需要一段信息同步的追赶时期
      • 网络IO等原因:某些机器IO处理速度变慢所导致持续消费落后
      • 进程卡住:Kafka是Java写的,容易发生full gc或者oom等

3. OSR(out sync replica):

  • OSR内的副本不必保证必须同步完成才进行确认
  • OSR内的副本是否同步了leader的数据,不影响数据的提交
  • OSR内的follower尽力的去同步leader,可能数据版本会落后

4. ACK

  • 0:生产者只管发送,不管服务器,消费者是否收到信息
  • 1:只有当leader 确认了收到消息,才确认此消息发送成功
  • -1:只有isr 中所有副本都同步了消息 此消息才确认发送成功

5. base offset

起始位移,replica中第一条消息的offset。

6. LW(low watermark)

代表AR集合中最小的logStartOffset值,副本的拉取请求(FetchRequest,它有可能触发新建日志分段而旧的的被清理,进而导致logStartoffset的增加)和删除请求(DeleteRecordRequest)都可能促使LW的增长。

7. HW(high watemark)

  • 副本中最新一条已提交消息的位移,消费之只能拉取到这个offset之前的消息。
  • 每个follower都有HW值,但只有leader中的HW才能作为标示信息。

8. LEO(log end offset)

  • 表示当前日志文件中下一条待写入消息的offset,LEO的大小相当于当前日志分区中最后一条消息的offset值加1。
  • 分区ISR集合中的每个副本都会维护自身的LEO,而ISR集合中最小的LEO即为分区的HW,对消费这而言只能消费HW之前的消息。

9. LSO(last stable offset)

  • 对于未完成的事务而言,LSO的值等于事务中的第一条消息所在的位置,(firstUnstableOffset)
  • ​对于已经完成的事务而言,它的值等同于HW相同,所以我们可以得出一个结论:LSO≤HW≤LEO

10. ISR同步

  • broker收到producer的请求,推给leader
  • leader收到消息,并成功写入,LEO 值+1
  • broker 将消息推给follower replica,follower 成功写入 LEO +1
  • 所有LEO 写入后,leader HW +1
  • 消息可被消费,并成功响应

11. kafka复制

  • kafka的复制机制不是完全的同步复制,也不是单纯的异步复制。
  • 同步复制要求AR(ISR+OSR)中的副本都复制完,这条消息才会被确认为成功提交,这种复制方式影响了性能。
  • 异步复制只要数据被leader副本写入就被认为已经成功提交, follower副本异步地从leader副本中复制数据。在这种情况下,如果follower副本都没有复制完而落后于leader副本,如果突然leader副本宕机,则会造成数据丢失。
  • Kafka只要ISR中的副本复制完成就认为消息已经提交成功,这种方式有效的权衡了数据可靠性与性能之间的关系。

12. Leader选举

kafka的leader选举是基于quorum算法,quorum是一种常用分布式系统算法,主要用来通过数据冗余来保证数据一致性的投票算法,算法从ISR中选举出leader。

  • HW的截断:选出了新的leader,而新的leader并不能保证已经完全同步了之前leader的所有数据,只能保证HW之前的数据是同步过的,此时所有的follower都要将数据截断到HW的位置,再和新的leader同步数据,来保证数据一致。
  • leader宕机:只能从ISR列表中选取新的leader,无论ISR中哪个副本被选为新的leader,它都知道HW之前的数据,可以保证在切换了leader后,消费者可以继续看到HW之前已经提交的数据。
  • leader恢复:发现新的leader中的数据和自己持有的数据不一致,此时宕机的leader会将自己的数据截断到宕机之前的hw位置,然后同步新leader的数据。

13. ISR为空

如果ISR为空,即所有ISR内的副本都不可用,有两种选择

  • 直接服务不可用(适用于一致性大于可用性的情况)
    • 设置ISR最小同步副本数量,如果ISR的当前数量大于设置的最小同步值,那么该分区才会接受写入,避免了ISR同步副本过少。如果小于最小值那么该分区将不接收写入。这个最小值设置只有在acks = all的时候才会生效。
    • 禁用unclean-leader选举,当isr中的所有副本全部不可用时,不可以使用OSR 中的副本作为leader,直接使服务不可用,直到等到ISR 中副本恢复再进行选举leader。
  • unclean-leader选举(适用于可用性大于一致性的场景)
    • unclean.leader.election.enable=true,直接选择第一个副本作为leader的方式,可能会丢失消息
    • Kafka 0.11.0.0版本开始unclean.leader.election.enable参数的默认值由原来的true改为false

14. 分区挂掉

kafka有partition recovery机制用于恢复挂掉的partition。每个partition会在磁盘记录一个recovery point(恢复点),记录已经flush到磁盘的最大offset。当broker fail 重启时,会进行loadLogs。首先会读取该partition的recovery point,找到包含recovery point点上的segment及以后的segment,这些segment就是可能没有完全flush到磁盘segments。然后调用segment的recover,重新读取各个segment的msg,并重建索引。

segment机制优点:

  • 以segment为单位管理partition数据,方便数据生命周期的管理,删除过期数据简单
  • 在程序崩溃重启时,加快recovery速度,只需恢复未完全flush到磁盘的segment即可

15. 主题、分区、segment等关系

  • 主题
    • 分区
      • segment
        • .index:索引文件,采取稀疏索引存储方式,减少索引文件大小,通过mmap可以直接内存操作,稀疏索引为数据文件的每个对应message设置一个元数据指针
        • .data:数据文件

参考

kafka-如何保证消息的可靠性与一致性 - 云+社区 - 腾讯云

关于kafka中ISR、AR、HW、LEO、LSO、LW的含义详解_lukabruce的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值