当acks=all且所有副本健康时Kafka的确认时机及吞吐量疑问
Kafka Acks与同步副本配置问题解答
核心逻辑前置说明
acks=all:生产者需等待当前ISR(同步副本列表)中的所有副本完成消息写入,才会收到leader节点的确认响应。min.insync.replicas:集群允许正常处理写入请求的ISR最小数量阈值——仅当ISR内副本数≥该值时,leader才接受写入;若低于该值,leader会拒绝写入,以此保证消息可用性的最低底线。
问题1&2的答案
当所有5个broker均健康时,ISR列表会包含全部5个副本(无同步延迟或故障的前提下)。此时因为配置了acks=all,生产者必须等待这5个副本全部完成消息写入才会收到确认,并非仅需2个副本写入就返回。
min.insync.replicas=2的作用是:当ISR数量因故障/延迟降到2个时(比如你提到的3个broker下线场景),集群仍能正常处理写入,此时acks=all才会只等待这2个同步副本完成写入就返回确认——它是服务可用性的底线,而非确认所需的副本数量。
吞吐量对比
在所有5个broker均健康的场景下:
- 配置
min.insync.replica=2时,ISR为5个副本,acks=all需等待5个副本确认; - 配置
min.insync.replica=5时,ISR同样为5个副本(所有broker同步正常),acks=all也需等待5个副本确认。
这种情况下两者吞吐量基本一致。
但如果集群出现部分副本同步延迟:
min.insync.replica=2允许ISR缩小到2个(延迟副本被踢出ISR),此时acks=all仅需等待2个副本确认,吞吐量会显著高于min.insync.replica=5的情况(后者要求ISR必须维持5个才能写入,一旦有副本延迟就会拒绝写入或等待所有5个同步完成,吞吐量大幅降低)。
内容的提问来源于stack exchange,提问作者Mikhail Geyer
相关产品推荐
相关产品推荐

