1. 数据应答
acks应答
- 0:生产者发送过来的数据,不需要等数据落盘应答。 丢失数据
- 1:生产者发送过来的数据,Leader收到数据后应答。 可能丢失(生产中用于传输普通日志,10000条数据可以丢失1,2条)
- -1(all):生产者发送过来的数据,Leader+和isr队列里面的所有节点收齐数据后应答。-1和all等价。完全可靠 + 副本数≥2 isr ≥2 —>数据重复
2. 数据可靠性分析
2.1 思考:
- 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)。
- 这样就不用等长期联系不上或者已经故障的节点。
- 数据可靠性分析:
- 如果分区副本设置为1个,或者ISR里应答的最小副本数量( min.insync.replicas 默认为1)设置为1,和ack=1的效果是一样的,仍然有丢数的风险(leader:0,isr:0)。
- 数据完全可靠条件= ACK级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2。
3. 可靠性总结
- acks=0,生产者发送过来数据就不管了,可靠性差,效率高;
- acks=1,生产者发送过来数据Leader应答,可靠性中等,效率中等;
- acks=-1,生产者发送过来数据Leader和ISR队列里面所有Follwer应答,可靠性高,效率低;
- 在生产环境中,acks=0很少使用;acks=1,一般用于传输普通日志,允许丢个别数据;cks=-1,一般用于传输和钱相关的数据,对可靠性要求比较高的场景。