Replica如何分布

为了尽量做好负载均衡和容错能力,需要将同一个Partition的Replica尽量分散到不同的机器。如果所有的Replica都在同一个Broker上,那一旦该Broker宕机,该Partition的所有Replica都无法工作,那么这些Replica也就失去的意义。

Replica如何同步

当没有Replica的时候,producer向broker写入消息非常简单,当有很多Replica的时候是如何处理的呢?

一般来说,对于这种情况有两个处理方法:

  1. 同步复制,当producer向所有的Replica写入成功消息后才返回。一致性得到保障,但是延迟太高,吞吐率降低。
  2. 异步复制,所有的Replica选取一个一个leader,producer向leader写入成功即返回,leader负责将消息同步给其他的所有Replica。但是消息同步一致性得不到保证,但是保证了快速的响应。

而kafka选取了一个折中的方式:ISR(in-sync replicas)。producer每次发送消息,将消息发送给leader,leader将消息同步给他“信任”的“小弟们”就算成功,巧妙的均衡了确保数据不丢失以及吞吐率。具体的:

  1. 在所有的Replica中,leader会维护一个与其基本保持同步的Replica列表,该列表称为ISR(in-sync Replica),每个Partition都会有一个ISR,而且是由leader动态维护。
  2. 如果一个replica落后leader太多,leader会将其剔除。如果另外的replica跟上脚步,leader会将其加入。
  3. 同步:leader向ISR中的所有replica同步消息,当收到所有ISR中replica的ack之后,leader才commit。
  4. 异步:收到同步消息的ISR中的replica,异步将消息同步给ISR集合外的replica。

kafka 知识点_同步复制