详解Kafka副本同步策略

前言:

Kafka俗称消息队列,既然是消息(即数据)队列就要保证消息能完整送达。所以,为保证producer发送的数据,能可靠的到达指定的Topic,topic的每个partition收到producer收到消息后,都需要向producer发送ack确认收到,如果producer收到ack,就会进行下一轮的发送,否则重新发送数据。如下图:
详解Kafka副本同步策略

副本同步策略

  • 半数以上同步
  • 全同步

两种同步策略优缺点对比

详解Kafka副本同步策略

说明: Kafka选择第二种方案,原因如下:

  • 1.同样为了容忍 n 台节点的故障,第一种方案需要 2n+1 个副本,而第二种方案只需要 n+1个副本,而 Kafka 的每个分区都有大量的数据,第一种方案会造成大量数据的冗余。

  • 2.虽然第二种方案的网络延迟会比较高,但网络延迟对 Kafka 的影响较小。

两种策略,在容忍n台节点故障情况下,所需节点个数说明

如果是半数同步策略,容忍n台节点故障,需要2n+1个副本,而全同步只需要n+1个副本,上面也说了这是Kafka选择全同步策略的主要原因。

注意: 一个topic的某个分区的副本数包含Leader和fllower。

问题: 两种策略为什么需要的副本数不同呢?

假设有5台机器,现在存在一个topic为A,它有一个分区。

全同步策略: 5台机器最多容忍4台机器故障,如果全故障那你的Kafka Cluster不就凉了? 当4台机器故障时,由于你选择的是全同步策略,所以topic A 分区下的5个副本(leader + fllower)分别位于这5台机器上,那么那台没有故障的机器(也就是broker)的副本(fllower,假设此时leader故障)就会成为leader继续工作。也即是全同步策略下,容忍n台节点故障,需要n+1个副本。

半数同步策略: 假设4(n)台机器发生了故障,副本数为5(n+1),由于是半数机制,所以topic A 分区下的副本数只要存在3个(leader + flllower)broker就会发送ack。 可是此时四台节点故障,Kafka集群里面只有三个副本,这就不能保证没故障的节点存在topic A 分区下的副本。 那么副本数至少需要设置为多少?副本数应设置为9个。如果副本数为9,topic A分区下副本数量为5时broker才会发送ack, 这就保证了每个节点都存在topic A 分区下的一个副本,此时如果4台节点故障(假设leader故障),那台没故障的机器就会成为leader继续工作。也即是半同步策略下,容忍n台节点故障,需要2n+1个副本。