Kafka 水位详解

Kafka的水位(HW)是确保数据一致性的关键,它代表所有副本中最小的LEO(最新已附加偏移量)。水位的提升意味着所有副本都已同步消息,从而保证消费者看到的数据是完整的。ACK主要用于数据不丢失,但水位确保了客户端消费的一致性。当ACK=-1,所有副本同步后水位才会增加,避免数据丢失。否则,在部分副本未同步的情况下,水位后的数据可能存在丢失风险。
摘要由CSDN通过智能技术生成

什么是水位

kafka中用水位来描述,
一个分区中的可见数据的offset。
大概你需要知道这几点:

  1. hw(水位)你可以理解成是一个全局(所有副本最小offset)的offset,
    针对的是一个分区
  2. LEO代表着该副本的所有消息的最大offset,
    针对的是一个副本,也就是每个副本都有LEO,并且不一样。
    其中所有副本中最小的LEO就是水位
水位

为什么要水位?

为了保障数据的一致性

Kafka中水位的运作

当 Leader收到一条消息并写入成功,
其LEO则和马上 +1.
副本会定期去和Leader进行同步,
每同步一个消息,其自己的LEO相应+1,
而水位则是所有副本最小的LEO,
所以也会慢慢进行增加。

  • 和ACK的关系
    其实没有必然的关系,
    ACK是用来保证数据不丢失的,
    而 hw 是用来保证客户端消费的一致性的,
    不过当ACK=-1,
    因为会等到数据完全写入到所有副本,
    才能返回成功,
    也就是说所有副本的LEO都 +1,
    其水位必然也会 +1,
    这个时候就可以避免数据丢失了。
    否则则会存在数据丢失的风险

  • 为什么ACK != -1 数据就可能丢失
    比如一个分区,四个副本1,2,3,4:
    1:LEO = 10(Leader)
    2:LEO = 8
    3:LEO = 7
    4:LEO = 6
    此时 hw = 6,
    当1 号Leader挂掉了,
    3号当选了新Leader,
    则所有存活副本首先会将hw之外的所有数据清除,
    然后从Leader同步水位之后的数据
    比如2号副本:
    先清除本身数据7,8,LEO变成6,
    然后去Leader同步6之后的数据,
    哪怕老Leader1号恢复了,6-10号数据还在,
    也需要将宕机时候的hw之后的数据全部清除,
    重新从Leader同步数据

    所以...结论就是,
    只要水位没有覆盖的数据,
    都存在丢失的风险。
    这也是hw的意义所在,
    保证数据的一致性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值