ACK应答级别

20220406142617.png

思考

Leader收到数据,所有的Follower都开是同步数据,但有一个Follower,因为某种故障,迟迟不能与Leader进行同步,那这个问题怎么解决呢?

解决

==Leader维护了一个动态的in-sync replica set(ISR),意为和Leader保持同步的Follower+Leader集合(leader:0,isr:0,1,2)。==

如果Follower长时间未向Leader发送通信请求或同步数据,则该Follower将被踢出ISR。该时间阈值由==replica.lag.time.max.ms参数设定,默认30s==。例如2超时,(leader:0, isr:0,1)

这样就不用等长期联系不上或者已经故障的节点

ISR中只保持和Leader正常通讯的Follower

数据可靠性分析

如果分区副本设置为1个,或者ISR里应答的最小副本数量(min.insync.replicas 默认为1 )设置为1,和ack=1的效果是一样的,仍然有丢数据的风险。

==数据完全可靠条件== = ==ACK级别设置为-1== + ==分区副本大于等于2== + ==ISR里应答的最小副本数量大于等于2==;

可靠性总结

  • acks=0:生产者发送过来数据就不管了,可靠性差,效率高。
  • acks=1:生成这发送过来数据等待Leader应答,可靠性中等,效率中等。
  • acks=-1:生产者发送过来数据等待Leader和ISR队列中的素有Follower应答,可靠性高,效率低。

==在生产环境中,acks=0很少使用;acks=1一般用于传输普通日志,允许丢个别数据;acks=-1一般用于传输和钱相关的数据,和其他对可靠性要求比较高的场景==

数据重复分析

==acks:-1(all)==:生产者发送过来的数据,Leader和ISR队列中的所有节点收齐数据后准备应答,此时,Leader突然挂掉,应答失败,然后选举出的新Leader继续接收应答失败的数据,导致数据重复。

20220406144944.png