什么是kafka中高水位?

1 个回答

  • 美世美
    慢慢理解世界,慢慢更新自己。
    # 什么是高水位 kafka中高水位来描述, 一个分区中的可见数据的offset。 大概你需要知道这几点: hw(高水位)你可以理解成是一个全局(所有副本最小offset)的offset, 针对的是一个分区 LEO代表着该副本的所有消息的最大offset, 针对的是一个副本,也就是每个副本都有LEO,并且不一样。 其中所有副本中最小的LEO就是高水位 ![image.png](https://images.codewd.com/6229dc8d76dffcf24f05577246aa1483.png) # 为什么要高水位? 为了保障数据的一致性 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的意义所在, 保证数据的一致性
    编辑于 2024-02-24 12:19 •IP属地 安徽
    举报
    评论
    收藏