kafka的ack机制详解

kafka的ack机制详解_第1张图片
request.required.asks=0
当producer向leader发送数据时,可以通过request.required.acks参数来设置数据可靠性的级别:
0:这意味着producer无需等待来自broker的确认而继续发送下一批消息。这种情况下数据传输效率最高,但是数据可靠性确是最低的。
1(默认):这意味着producer在ISR中的leader已成功收到的数据并得到确认后发送下一条message。如果leader宕机了,则会丢失数据。
-1(或者是all):producer需要等待ISR中的所有follower都确认接收到数据后才算一次发送完成,可靠性最高。
但是这样也不能保证数据不丢失,比如当ISR中只有leader时,这样就变成了acks=1的情况。如果要提高数据的可靠性,在设置request.required.acks=-1的同时,也要设置min.insync.replicas这个参数(可以在broker或者topic层面进行设置)的配合,这样才能发挥最大的功效。min.insync.replicas这个参数设定ISR中的最小副本数是多少,默认值为1,当且仅当request.required.acks参数设置为-1时,此参数才生效。
如果ISR中的副本数少于min.insync.replicas配置的数量时,客户端会返回异常:

org.apache.kafka.common.errors.NotEnoughReplicasExceptoin: Messages are rejected since there are fewer in-sync replicas than required

下面详细说一下-1模式
同步(Kafka默认为同步,即producer.type=sync)的发送模式,replication.factor>=2且min.insync.replicas>=2的情况下,不会丢失数据。有两种典型情况。acks=-1的情况下(如无特殊说明,以下acks都表示为参数request.required.acks),数据发送到leader, ISR的follower全部完成数据同步后,leader此时挂掉,那么会选举出新的leader,数据不会丢失,但是在这种情况下producer端会得到返回异常,原因是最小备份数量小于2了,所以合适的设置好参数.

下面详细介绍一下isr

你可能感兴趣的:(hadoop)