生产者数据的可靠性保证。

刚才已经讲完了,数据发到哪个分区,但是,数据生产者已经发过去了,但是kafka有没有接到,那就是另一个问题。现在就准备讲,生产者数据的可靠性保证怎么实现的。

生产者发送数据一般是和leader进行交互的,怎么才能保证数据不丢失呢?

14_Kafka高级_生产者ISR_数据


14_Kafka高级_生产者ISR_生产环境_02


正常来说生产者是给leader来发消息的,follower向leader同步数据。

那什么时候发送ack呢?

14_Kafka高级_生产者ISR_生产环境_03


14_Kafka高级_生产者ISR_数据_04


比较半数机制和全部机制:

14_Kafka高级_生产者ISR_生产环境_05

14_Kafka高级_生产者ISR_kafka_06


14_Kafka高级_生产者ISR_生产环境_07


kafka选择了这种:

14_Kafka高级_生产者ISR_数据_08


但是这种方案有个问题就是,同步的时候,有个副本挂了,而且很久才能好起来,那就需要等很长的时间。

所以选择第二种方案的时候,做了一个优化。(提出ISR机制)

去查看topic

14_Kafka高级_生产者ISR_生产环境_09


14_Kafka高级_生产者ISR_kafka_10


14_Kafka高级_生产者ISR_生产环境_11


什么是ISR?

叫做同步副本。

14_Kafka高级_生产者ISR_kafka_12


主要是解决刚才说的问题,防止所有副本再同步的时候,这个突然坏的副本怎么处理呢。从而影响整个团队。

10个副本:1个leader和9个follower

之前说的等待所有副本都同步结束之后再发送ack不行,而应该把部分副本放到ISR里面,等ISR里面的所有副本全部同步结束之后再发送ack。

问:需要把哪几个副本放到ISR里面呢?看什么选择?

答:ISR,就是为了数据可靠性。为了保证数据不丢失。ISR核心作用就是:

leader挂掉之后,从这里面选取新的leader

你想进ISR的条件:

1、你的通信必须快,通信时间,leader刚写完,你这个副本就写完了,good。

2、数据量高的。比如leader写了10条,其他的有些同步了7条,6条。肯定选择那些同步数据量多的优先选择。

在高版本当中,我们只保留了一个。

实际上保留的是:时间的。也就是最看重的还是你的延迟时间。

14_Kafka高级_生产者ISR_生产环境_13


默认时间=10s

14_Kafka高级_生产者ISR_生产环境_14


为什么移除另外一个参考因素同步的数据量呢,而采用时间呢?

因为:

1、生产者这里是批量发送数据的。

2、ISR这个队列维护的时候。在生产环境中,kafka是维护在内存中的。同时kafka还需要将数据写到zk中去。在kafka集群中维护了内存中的队列。如果全部的follower的差值都大于10,那这时候全部的follower都需要从ISR中剔除。

但是之后又会拉进来,可能会频繁的操作ISR,剔除ISR,加入ISR,在内存中操作,因为数据还存放在zk中,所以你还要频繁的去操作zk。

因为下图的信息,我们连接了zk才拿到的。所以,还要频繁的操作zk。ISR的频繁进出和频繁操作zk,所以新版本就移除掉了。

14_Kafka高级_生产者ISR_数据_15