Kafka是如何保证数据可靠性和一致性?( 二 )


一致性定义:若某条消息对Consumer可见,那么即使Leader宕机了,在新Leader上数据依然可以被读到
* HighWaterMark简称HW: Partition的高水位 。取一个partition对应的ISR中最小的LEO作为HW 。消费者最多只能消费到HW所在的位置 。另外每个replica都有highWatermark 。leader和follower各自负责更新自己的highWatermark状态 。highWatermark <= leader. LogEndOffset
* 对于Leader新写入的msg 。Consumer不能立刻消费 。Leader会等待该消息被所有ISR中的replica同步后,更新HW,此时该消息才能被Consumer消费 。即Consumer最多只能消费到HW位置
这样就保证了如果Leader Broker失效,该消息仍然可以从新选举的Leader中获取 。对于来自内部Broker的读取请求,没有HW的限制 。同时,Follower也会维护一份自己的HW,Folloer.HW = min(Leader.HW, Follower.offset)

推荐阅读