Kafka之ACK机制

  • acks一般常设置三种值

request.required.acks = 0、1和-1(all)

  • acks=0
  • KafkaProducer把消息发送出去,不需要等待任何确认收到的消息,没有任何保障可以保证此种情况下server已经成功接收到数据,同时重试配置也不会发生作用(因为KafkaProducer并不知道此次发送是否失败)。
  • 该情况,当数据已经发送出去,还在半路,此时leader挂了,但是producer还是认为消息发送成功了,这个时候就会导致这条消息丢失;
  • 数据可靠性是最低的,传输效率也是最高的
  • acks=1(默认)
  • KafkaProducer把消息发送出去,至少要等待leader已经成功将数据写入本地log,但是并没有等待所有follower是否成功写入。该情况下,如果follower没有成功备份数据,而此时leader刚好又挂掉了,就会导致消息丢失
  • acks=-1/all
  • KafkaProducer把消息发送出去,这要求ISR列表离跟leader保持同步的那些follower都要吧消息同步过去,才能认为这条消息是写入成功的。
  • 如果leader接受到数据了,但是follower还未同步数据,此时leader宕机了,那么producer会感知这个消息没有发送成功,会重试再次发送消息过去;此时可能partition 2的follower变成了leader,此时ISR列表离只有最新的这个follower转变成的leader了,那么只要这个新的leader接受消息就算成功,如果ISR列表不仅仅只是这个新的leader,则需要ISR列表所有的follower都成功同步消息,才算发送成功
  • 还有一种情况,比如3副本,producer发送消息过后,leader成功接受到消息,follower1也成功同步了leader的数据,但是follower2还未同步leader数据,而此时leader挂了,follower1变成了新的leader,producer会重新发送消息,此时就会存在重复数据,如果是follower2变成了新的leader,就不会存在重复数据

★★★★★ acks=-1/all 就代表数据一定不会丢失吗?

答案:不是
如果partitin只有一个副本,也就是只有一个leader,没有其他follower,那么虽然他已经完成接受消息,但是接受消息过后宕机了,一样会导致数据丢失。
所以acks=-1/all,必须跟ISR列表离至少有2个以上的副本配合使用,也就是起码有一个leader和一个follower才行,这样才能保证发送一条消息,一定是2个以上的副本都同步到数据才算是成功,此时任何一个副本宕机,都不会导致数据的丢失
★ 要提高数据的可靠性,在设置acks=-1/all的同时,也要设置min.insunc.replicas(默认值是1,可以在broker或者topic层面进行设置)这个参数的配合;min.insunc.replicas设置的是ISR中的最小副本数是多少,当且仅当acks=-1/all时,这个参数才会生效。

你可能感兴趣的:(kafka)