1 kafka基本架构

  kafka的partion分为leader和follow。leader参与允许,二follower仅作为备份。

  那么,leader和follower之间是怎么同步的呢

 

2 leader和follower的同步

  Partition只有Leader是对外提供读写服务的

  也就是说,如果有一个客户端往一个Partition写入数据,此时一般就是写入这个Partition的Leader。

  然后Leader副本接收到数据之后,Follower副本会不停的给他发送请求尝试去拉取最新的数据,完成同步。

 

3 ISR和OSR和ASR

  ISR全称是“In-Sync Replicas”,也就是保持同步的副本,他的含义就是,跟Leader始终保持同步的Follower有哪些。

  大家可以想一下 ,如果说某个Follower所在的Broker因为JVM FullGC之类的问题,导致自己卡顿了,无法及时从Leader拉取同步数据,那么是不是会导致Follower的数据比Leader要落后很多?

  所以这个时候,就意味着Follower已经跟Leader不再处于同步的关系了。

  所以每个Partition都有一个ISR列表,这个ISR里一定会有Leader自己,因为Leader肯定数据是最新的,然后就是那些跟Leader保持同步的Follower,也会在ISR里。

  OSR:无法保存和leader同步的就会被放入到OSR列表。默认超过10s没有同步成功,进入OSR。

  ASR:ISR和OSR的总和

  

 

4 acks参数的含义

4.1 简介


  铺垫了那么多的东西,最后终于可以进入主题来聊一下acks参数的含义了。

  如果大家没看明白前面的那些副本机制、同步机制、ISR机制,那么就无法充分的理解acks参数的含义,这个参数实际上决定了很多重要的东西。

  首先这个acks参数,是在KafkaProducer,也就是生产者客户端里设置的

  也就是说,你往kafka写数据的时候,就可以来设置这个acks参数。然后这个参数实际上有三种常见的值可以设置,分别是:0、1 和 all。

 

4.2 ack=0

  ack=0生产者将数据发送出去就算发送成功,不去等待任何返回,容易丢失数据

  如果你采用这种设置的话,那么你必须注意的一点是,可能你发送出去的消息还在半路,Partition Leader所在Broker就直接挂了,然后结果你的客户端还认为消息发送成功了,此时就会导致这条消息就丢失了。

4.3 ack=1

  默认值。ack=1只关注producer是否把消息推送到了leader的partion,不关注其它副本的同步是否成功。

 

4.4 ack=-1

   ack= -1 关注producer是否把消息推送到了leader的partion,还关注其它副本的同步是否成功。

  多少个副本同步成功才会返回成功呢?producer需要等待ISR中的所有follower都确认接收到数据后才算一次发送完成