| — | — | — |
| 半数以上完成同步,就发 送 ack | 延迟低 | 选举新的 leader 时,容忍 n 台 节点的故障,需要 2n+1 个副 本 |
| 全部完成同步,才发送 | | |
| ack | 选举新的 leader 时,容忍 n 台 节点的故障,需要 n+1 个副 本 | 延迟高 |
Kafka 选择了第二种方案,原因如下:
-
同样为了容忍 n 台节点的故障,第一种方案需要 2n+1 个副本,而第二种方案只需要 n+1 个副本,而 Kafka 的每个分区都有大量的数据,第一种方案会造成大量数据的冗余。
-
虽然第二种方案的网络延迟会比较高,但网络延迟对 Kafka 的影响较小。
Ack应答机制
对于某些不太重要的数据,对数据的可靠性要求不是很高,能够容忍数据的少量丢失, 所以没必要等 ISR 中的 follower 全部接收成功。
所以 Kafka 为用户提供了三种可靠性级别,用户根据对可靠性和延迟的要求进行权衡, 选择以下的配置。
acks 参数配置:
---- acks:
0:
producer 不等待 broker 的 ack,这一操作提供了一个最低的延迟,broker 一接收到还 没有写入磁盘就已经返回,当 broker 故障时有可能 丢失数据
;
1:
producer 等待 broker 的 ack,partition 的 leader 落盘成功后返回 ack,如果在 follower 同步成功之前 leader 故障,那么将会 丢失数据
;
acks = 1 丢失案例