Kafka数据可靠性保证

Posted yuexiuping

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kafka数据可靠性保证相关的知识,希望对你有一定的参考价值。

Kafka数据可靠性保证

1.生产者发送数据到topic Partition的可靠性保证

  • 为保证producer发送的数据能可靠的发送到指定的topic,Topic的每个partition收到producer发送的数据后,都需要向producer发送ack如果producer收到ack,就会进行下一轮的发送,否则重新发送数据。

  • 发送ack时间的选择:确保在follower完成从leader的数据同步后leader再发送数据,只有这样才能保证leader挂掉后,能够follower中选出来的leader不会有数据丢失。

    数据先写到leader,然后follower自己去同步。


2.Topic Partition 存储数据的可靠性保证

  1. 多少follower同步完成后发送ack的选择:半数以上完成同步发送ack、全部完成同步后发送ack(默认)。
    • 半数:延时低,但是选举新的leader时,如果容忍n台节点故障,需要 2n+1 个副本。
    • 全部:延时高,但是选举新leader时,容忍n台节点故障,只需要 n+1 个副本即可。
    • 由于网络延时对Kafka影响较小,并且在容忍相同节点的故障时,后者只需要 n+1 个副本即可,所以选择了全部同步发送ack。
  2. 由于需要全部的follwer对leader信息进行同步,如果有一个follwoer节点因为故障迟迟不能与leader进行同步,就会导致leader
    持续等待,直到它完成同步才能发送ack。
    • 为了解决因为某个follower故障导致的leader迟迟等待不能发送ack的情况,Kafka维护了动态ISR,用来存储与leader保持同步的follower,如果某个follower长时间没有完成同步,会被踢出ISR,该时间阈值由配置文件中的 replica.lag.time.max.ms 参数设定,如果leader故障,就会从ISR中选出新的leader。

ACK应答级别

  • 0:这一操作提供了一个最低的延迟,Partition的leader接收到消息还没有写入磁盘就已经返回ack,当leader故障时有可能丢失数据。
  • 1:Partition的leader落盘成功后返回ack,如果在follower同步成功之前leader故障,那么将会丢失数据。
  • -1:Partition的leader和follower全部落盘成功后才返回ack。但是如果在follower同步完成后,Broker发送ack之前,Leader发生故障,那么会造成数据重复。

Leader和 Follower故障处理细节

  • LEO:指的是每个副本最大的offset。
  • HW高水位:指的是消费者能见到的最大的offset,ISR队列中最小的LEO。
  1. Follower故障:

    Follower 发生故障后会被临时踢出ISR,待该follower恢复后,follower 会读取本地磁盘记录的上次的HW,并将log文件高于HW的部分截取掉,从HW开始向leader进行同步。等该follower的LEO大于等于该Partition的HW,即follower追上leader之后,就可以重新加入ISR了。

  2. Leader故障:

    Leader 发生故障之后,会从ISR中选出一个新的leader,为保证多个副本之间的数据一致性,其余的follower会先将各自的log文件高于HW的部分截掉,然后从新的leader同步数据。新leader的选取时根据Replicas的顺序进行选择。

***注意:

HW和LEO只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。并且新选出来的leader并不能保证HW之后数据的顺序。如果ack响应等待时间之内,leader 出现的故障,生产者会继续发送消息,所以新的leader的HW之后会先接收新的消息,并且没有ack响应生产者会重新发送原来数据,如果HW之后本来就有数据,这部分数据就会重复,如果在ack响应时间之外leader异常,新的leader会重新接收原来的消息,并且HW之后本来就有数据,这部分数据仍就会重复。***

以上是关于Kafka数据可靠性保证的主要内容,如果未能解决你的问题,请参考以下文章

kafka专栏如何保证数据生产不重不漏的高可靠性

Kafka 是如何保证数据可靠性和一致性

Kafka的存储机制以及可靠性

Kafka生产者——结合spring开发

kafka是如何保障消息的可靠性的(一)

kafka可靠数据传递