Kafka —— 数据可靠性保证,副本数据同步策略(ACK,ISR,LEO,HW)

  • 数据可靠性:(解决数据不丢失或者不重复的问题,它是基于生产者来说的)

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

  • 副本数据同步策略:

方案一:半数以上完成同步,就发送ACK。

优点:延迟低。
缺点:选举新的leader时,容忍n台节点的故障,需要2n+1个副本。

方案二:全部完成同步才发送ACK。

优点:选举新的leader时,容忍n 台节点的故障,需要n+1个副本。
缺点:延迟高。

Kafka选择了第二种方案,原因如下:
(1)同样为了容忍n台节点的故障,第一种方案需要2n+1个副本,而第二种方案只需要n+1个副本,而Kafka的每个分区都有大量的数据,第一种方案会造成大量数据的冗余。(多余的重复或啰嗦内容(包括信息、语言、代码、结构、服务、软件、硬件等等)均称为冗余。)

(2)虽然第二种方案的网络延迟会比较高,但网络延迟对kafka的影响较小。

  • Kafka的acks参数配置:

首先这个acks参数,是在KafkaProducer,也就是生产者客户端里设置的也就是说,你往kafka写数据的时候,就可以来设置这个acks参数。

这个参数实际上有三种常见的值可以设置,分别是:0、1 和 all。

第一种选择是把acks参数设置为0

我的KafkaProducer在客户端,只要把消息发送出去,不管那条数据有没有在哪怕Partition Leader上落到磁盘,我就不管他了,直接就认为这个消息发送成功了。
如果你采用这种设置的话,那么你必须注意的一点是,可能你发送出去的消息还在半路。结果呢,Partition Leader所在Broker就直接挂了,然后结果你的客户端还认为消息发送成功了,此时就会导致这条消息就丢失了。

第二种选择是设置 acks = 1

只要Partition Leader接收到消息而且写入本地磁盘了,就认为成功了,不管他其他的Follower有没有同步过去这条消息了。
这种设置其实是kafka默认的设置,大家请注意,划重点!这是默认的设置
也就是说,默认情况下,你要是不管acks这个参数,只要Partition Leader写成功就算成功。
但是这里有一个问题,万一Partition Leader刚刚接收到消息,Follower还没来得及同步过去,结果Leader所在的broker宕机了,此时也会导致这条消息丢失,因为人家客户端已经认为发送成功了。

最后一种情况,就是设置acks=all

Partition Leader接收到消息之后,还必须要求ISR列表里跟Leader保持同步的那些Follower都要把消息同步过去,才能认为这条消息是写入成功了。
如果说Partition Leader刚接收到了消息,但是结果Follower没有收到消息,此时Leader宕机了,那么客户端会感知到这个消息没发送成功,他会重试再次发送消息过去。
此时可能Partition 2的Follower变成Leader了,此时ISR列表里只有最新的这个Follower转变成的Leader了,那么只要这个新的Leader接收消息就算成功了。

acks=all 就可以代表数据一定不会丢失了吗?
当然不是,如果你的Partition只有一个副本,也就是一个Leader,任何Follower都没有,你认为acks=all有用吗?
当然没用了,因为ISR里就一个Leader,他接收完消息后宕机,也会导致数据丢失。
所以说,这个acks=all,必须跟ISR列表里至少有2个以上的副本配合使用,起码是有一个Leader和一个Follower才可以。
这样才能保证说写一条数据过去,一定是2个以上的副本都收到了才算是成功,此时任何一个副本宕机,不会导致数据丢失。

  • ISR:同步副本队列(当leader接收完数据之后,通知ISR去同步副本队列)
  • LEO:每个副本的最后一个offset(最大的offset,数据偏移量)
  • HW:所有副本中最小的lLED(副本队列中最短的那一列的offset),指消费者能见到的最大offset。

leader 发生故障后,会从ISR(同步副本队列)中选出一个新的leader之后,为保证多个副本之间的数据一致性,其余的follower会先将各自的log文件(保存的数据)高于HW的部分截掉,然后从新的leader同步数据。
(这只能保证多个副本之间的数据的一致性,并不能保证数据不丢失或不重复(这个是要靠生产者ack来确定的))
————————————————
版权声明:本文为CSDN博主「Nurbiya_K」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Nurbiya_K/article/details/104122699

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值