聊聊Kafka(八)Kafka的一致性

概念

  1. 水位标记
    水位或水印(watermark)一词,表示位置信息,即位移(offset)。Kafka源码中使用的名字是高水位,HW(high watermark)。
  2. 副本角色
    Kafka分区使用多个副本(replica)提供高可用。
  3. LEO和HW
    每个分区副本对象都有两个重要的属性:LEO和HW。
  • LEO:即日志末端位移(log end offset),记录了该副本日志中下一条消息的位移值。如果LEO=10,那么表示该副本保存了10条消息,位移值范围是[0, 9]。另外,Leader LEO和Follower LEO的更新是有区别的。
  • HW:即上面提到的水位值。对于同一个副本对象而言,其HW值不会大于LEO值。小于等于HW值的所有消息都被认为是“已备份”的(replicated)。Leader副本和Follower副本的HW更新不同。

在这里插入图片描述
上图中,HW值是7,表示位移是 0~7 的所有消息都已经处于“已提交状态”(committed),而LEO值是14, 8~13的消息就是未完全备份(fully replicated)——为什么没有14?LEO指向的是下一条消息到来时的位移。

消费者无法消费分区下Leader副本中位移大于分区HW的消息。

Follower副本何时更新LEO

Follower副本不停地向Leader副本所在的broker发送FETCH请求,一旦获取消息后写入自己的日志中进行备份。那么Follower副本的LEO是何时更新的呢?首先必须言明,Kafka有两套Follower副本

LEO:

  1. 一套LEO保存在Follower副本所在Broker的副本管理机中;
  2. 另一套LEO保存在Leader副本所在Broker的副本管理机中。Leader副本机器上保存了所有的follower副本的LEO。

Kafka使用前者帮助Follower副本更新其HW值;利用后者帮助Leader副本更新其HW。

  1. Follower副本的本地LEO何时更新?
    Follower副本的LEO值就是日志的LEO值,每当新写入一条消息,LEO值就会被更新。当Follower发送FETCH请求后,Leader将数据返回给Follower,此时Follower开始Log写数据,从而自动更新LEO值。
  2. Leader端Follower的LEO何时更新?
    Leader端的Follower的LEO更新发生在Leader在处理Follower FETCH请求时。一旦Leader接
    收到Follower发送的FETCH请求,它先从Log中读取相应的数据,给Follower返回数据前,先更新Follower的LEO。

Follower副本何时更新HW

Follower更新HW发生在其更新LEO之后,一旦Follower向Log写完数据,尝试更新自己的HW值。
比较当前LEO值与FETCH响应中Leader的HW值,取两者的小者作为新的HW值。

即:如果Follower的LEO大于Leader的HW,Follower HW值不会大于Leader的HW值。

Leader副本何时更新LEO

和Follower更新LEO相同,Leader写Log时自动更新自己的LEO值。

Leader副本何时更新HW值

Leader的HW值就是分区HW值,直接影响分区数据对消费者的可见性 。

Leader会尝试去更新分区HW的四种情况:

  1. Follower副本成为Leader副本时:Kafka会尝试去更新分区HW。
  2. Broker崩溃导致副本被踢出ISR时:检查下分区HW值是否需要更新是有必要的。
  3. 生产者向Leader副本写消息时:因为写入消息会更新Leader的LEO,有必要检查HW值是否需要更新
  4. Leader处理Follower FETCH请求时:首先从Log读取数据,之后尝试更新分区HW值

结论:
当Kafka br

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kafka是一个分布式流处理平台,它提供了高可靠性、高吞吐量的消息队列服务。在Kafka中,数据一致性是一个重要的问题,特别是对于副本之间的数据一致性Kafka使用了多个副本来保证数据的可靠性和容错性。当生产者将消息发送到Kafka集群时,消息会被写入到多个主题的多个分区中。每个分区都有多个副本,其中一个被选为领导者(leader),其他副本则作为追随者(follower)。 Kafka使用了分布式复制协议来保证副本之间的数据一致性。领导者负责接收并写入消息,而追随者则通过复制领导者的数据来保持同步。当消息被写入领导者后,它会被异步地复制到追随者。这种异步复制的机制可以提高Kafka的吞吐量和性能。 在正常情况下,领导者和追随者之间的数据是一致的。当追随者发生故障或无法及时复制数据时,Kafka会尝试重新同步追随者和领导者之间的数据。这个过程被称为副本同步。在副本同步期间,如果某个追随者无法及时复制数据,则会被标记为“落后”状态。只有当所有追随者都达到同步状态后,才认为数据一致性得到保证。 总的来说,Kafka通过使用多个副本以及复制协议来保证数据一致性。虽然在某些情况下可能存在数据延迟或不一致的情况,但Kafka提供了可靠性和容错性的保证,可以满足大部分实时数据处理的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值