kafka 参数 acks详解

人的一生,三分天注定七分靠打拼,剩下的九十分靠父母。

 

问题:如何保证数据不丢失问题?

答:内部机制,创建2个或者2个以上的副本,其中一个为Leader,其余的都是follower,然后分布在不同的broker上面。

 

问题:多个副本之间是如何进行同步的?

答:有一个客户端往一个Partition写入数据,此时一般就是写入这个Partition的Leader副本。然后Leader副本接收到数据之后,Follower副本会不停的给他发送请求尝试去拉取最新的数据,拉取到自己本地后,写入磁盘中。

 

问题:ISR是什么?

答:ISR全称是“In-Sync Replicas”,也就是保持同步的副本,他的含义就是,跟Leader始终保持同步的Follower有哪些。但是只要Follower一直及时从Leader同步数据,就可以保证他们是处于同步的关系的。所以每个Partition都有一个ISR,这个ISR里一定会有Leader自己,因为Leader肯定数据是最新的,然后就是那些跟Leader保持同步的Follower,也会在ISR里。

 

问题:ACKS参数的含义是什么?

答:这个acks参数,是在Kafka的Producer(生产者客户端)里设置的。也就是说,你往kafka写数据的时候,就可以来设置这个acks参数。然后这个参数实际上有三种常见的值可以设置,分别是:0、1 、-1 和 all。

当 acks 设置为 0 时,就是KafkaProducer在客户端,只要把消息发送出去,不管那条数据有没有在哪怕Partition Leader上落到磁盘,就不管他了,直接就认为这个消息发送成功了。

  弊端:可能你发送出去的消息还在半路时,Partition Leader所在Broker就直接挂了,然后结果你的客户端还认为消息发送成功了,此时就会导致这条消息就丢失了。

当acks 设置为 1 时(kafka默认值),就是只要Partition Leader接收到消息而且写入本地磁盘了,就认为成功了,不管他其他的Follower有没有同步过去这条消息了。

  弊端:当Leader刚刚接收到消息,Follower还没来得及同步过去,结果Leader所在的broker宕机了,此时也会导致这条消息丢失,因为人家客户端已经认为发送成功了。

当acks 设置为 -1时(all一样的含义),Partition Leader接收到消息之后,还必须要求ISR列表里跟Leader保持同步的那些Follower都要把消息同步过去,才能认为这条消息是写入成功了。

  注意:当Leader刚接收到了消息,Follower还没有收到消息,此时Leader宕机了,那么客户端会感知到这个消息没发送成功,他会重试再次发送消息过去。此时可能Partition 2的Follower变成Leader了,此时ISR列表里只有最新的这个Follower转变成的Leader了,那么只要这个新的Leader接收消息就算成功了。

 

问题:acks=all, -1  就可以代表数据一定不会丢失了吗?

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

 

posted @ 2022-01-07 08:55  方达达  阅读(24)  评论(0编辑  收藏  举报