3. Kafka 主题创建、分区与副本参数配置

Kafka 主题创建、分区与副本参数配置 学习卡片

吞吐与可靠性的参数组合

创建主题时,分区数决定并行度上限,副本因子决定数据冗余份数,min.insync.replicas 决定生产者 acks=all 时至少需要多少个副本确认写入。三者共同决定“能写多快”和“丢不丢数据”。

本案例以三节点集群(broker.id 1/2/3)为例,创建主题 orders,目标:分区数 6、副本因子 3、min.insync.replicas=2。含义是每个分区有 1 个 Leader + 2 个 Follower,写入需至少 2 个副本确认;可容忍 1 个副本失效仍能写入,若失效副本达到 2 个则写入被拒绝(NOT_ENOUGH_REPLICAS),从而避免在冗余不足时继续接受数据。

主题 orders:6 分区 × 3 副本 × min.insync.replicas=2 生产者 acks=all retries>0 分区(Partition) P0 Leader b1 Follower b2 Follower b3 P1 Follower b1 Leader b2 Follower b3 P2 Follower b1 Follower b2 Leader b3 P3 Leader b1 Follower b2 Follower b3 P4 Follower b1 Leader b2 Follower b3 P5 Follower b1 Follower b2 Leader b3 写入确认条件 acks=all ISR ≥ min.insync.replicas 即 ISR ≥ 2 满足 → 提交成功 副本失效场景 失效 1 个副本 ISR=2 → 仍可写 失效 2 个副本 ISR=1 < 2 NOT_ENOUGH_REPLICAS 写入被拒绝 参数关系: 分区数 ↑ → 并行消费能力 ↑(但受消费者数限制) | 副本因子 ↑ → 冗余 ↑、存储与网络开销 ↑ | min.insync.replicas ↑ → 一致性更强、可用性 ↓ 推荐:副本因子=3,min.insync.replicas=2,兼顾容错与可用性

创建命令与参数设置

使用 kafka-topics.sh 创建主题,关键参数通过 --config 传入:

kafka-topics.sh --bootstrap-server localhost:9092 \
  --create --topic orders \
  --partitions 6 \
  --replication-factor 3 \
  --config min.insync.replicas=2 \
  --config retention.ms=604800000

参数含义:--partitions 6 设置 6 个分区;--replication-factor 3 每个分区 3 份副本;min.insync.replicas=2 要求 ISR 至少 2 个副本;retention.ms=604800000 保留 7 天。

验证参数生效

创建后先确认主题描述:

kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic orders

预期输出中每个分区显示 Replicas: 3,且 Configs: min.insync.replicas=2。随后用生产者写入并消费验证:

# 生产 100 条消息
seq 1 100 | kafka-console-producer.sh \
  --bootstrap-server localhost:9092 \
  --topic orders \
  --producer-property acks=all

# 消费验证
kafka-console-consumer.sh \
  --bootstrap-server localhost:9092 \
  --topic orders \
  --from-beginning \
  --max-messages 100

若 100 条全部消费成功,说明在 3 副本、min.insync.replicas=2 条件下生产消费闭环正常。可进一步停掉一个 broker 再写入,验证 ISR=2 时仍可写入;停掉两个 broker 后写入应报 NOT_ENOUGH_REPLICAS。

分区数只能增加不能减少;副本因子创建后不可直接修改,需通过分区重分配工具调整。生产环境建议副本因子≥3,min.insync.replicas=副本因子-1。
若 min.insync.replicas 设置过高(如等于副本因子),任一副本失效都会导致写入不可用;设置过低(如 1)则 acks=all 退化为单副本确认,失去冗余保护意义。