kafka中的acks参数

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

这个参数实际上有三种值可以设置,分别是0,1,和all.

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

我的kafkaProducer在客户端,只要把消息发送出去,不管那条数据有没有在哪怕Partition leader上落到磁盘,就不管他了,直接认为这个消息发送成功。

如果你采用这种设置的话,那么你必须注意的一点是,可能你发送出去的消息还在半路。结果呢,Partition leader所在broker就直接挂了,然后结果你的客户端还认为消息发送成功了,此时就会导致这条消息就丢失了。

第二种选择是设置acks=1

只要Partition leader接收到消息而且写入本地磁盘了,就认为成功了,不管其他的Follower有没有同步过去这条消息了。

这种设置其实是kafka认的设置方式

也就是说认情况下,要是不设置这个参数,只要Partition leader写成功就算成功。

但是这里有一个问题,万一Partition leader刚刚接收到消息,Follower还没来得及同步过去,结果leader所在的broker宕机了,此时也会导致这条消息丢失,因为人家客户端已经认为发送成功了。

最后一种情况就是设置为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个以上的副本都收到了才算是成功,此时任何一个副本宕机,不会导致数据丢失。

 

相关文章

# 前言 现有主流消息中间件都是生产者-消费者模型,主要角色...
错误的根源是:kafka版本过高所致,2.2+=的版本,已经不需要...
DWS层主要是存放大宽表数据,此业务中主要是针对Kafka topic...
不多BB讲原理,只教你怎么用,看了全网没有比我更详细的了,...
终于写完了,其实最开始学kafka的时候是今年2月份,那时候还...
使用GPKafka实现Kafka数据导入Greenplum数据库踩坑问题记录(...