在 Linux 上配置 Kafka 副本的完整指南
一 前置准备与关键概念
- 准备一个已运行的 Kafka 集群(建议至少 3 个 Broker),并确认每个 Broker 的 broker.id 唯一、listeners 正确、以及已正确配置 ZooKeeper/集群连接。这些是确保副本可以跨节点分布的前提。
- 关键概念:
- 每个分区有 Leader/Follower;生产者只写 Leader,Follower 异步复制。
- AR = ISR + OSR;ISR 是与 Leader 保持同步的副本集合,故障切换只会从 ISR 中选新 Leader。
- 相关参数:replica.lag.time.max.ms(默认 30000 ms,判定落后副本的阈值)、min.insync.replicas(最小同步副本数)、unclean.leader.election.enable(是否允许非同步副本成为 Leader,默认 false)。
二 配置 Broker 级默认副本与容错参数
- 编辑配置文件 config/server.properties(或系统服务路径下的同名文件),设置以下核心项:
- default.replication.factor:新建 Topic 的默认副本数,生产环境常用 3。
- min.insync.replicas:建议设置为 2(必须 ≤ 副本因子),保证写入可用性门槛。
- 一致性相关:unclean.leader.election.enable=false(避免数据丢失),replica.lag.time.max.ms=30000(可按网络与负载调整)。
- 示例:
- default.replication.factor=3
- min.insync.replicas=2
- unclean.leader.election.enable=false
- replica.lag.time.max.ms=30000
- 使配置生效:重启 Broker(如使用 systemd:systemctl restart kafka)。注意该参数主要影响后续新建的 Topic,存量 Topic 需单独调整。
三 创建 Topic 时指定副本
- 使用 kafka-topics.sh 创建 Topic 并通过 –replication-factor 指定副本数(示例为 3):
- bin/kafka-topics.sh --create --topic my-topic --partitions 3 --replication-factor 3 --bootstrap-server localhost:9092
- 验证:
- bin/kafka-topics.sh --describe --topic my-topic --bootstrap-server localhost:9092
- 在输出中检查每个分区的 Leader/Replicas/Isr 数量是否符合预期(例如 Replicas 长度为 3)。
四 动态调整现有 Topic 的副本数(扩副本/迁移)
- 步骤概览:
- 导出当前分配(用于回滚):
bin/kafka-reassign-partitions.sh --bootstrap-server broker1:9092,broker2:9092,broker3:9092 --generate --topics-to-move-json-file topics.json --broker-list 0,1,2
- 编辑生成的 JSON,明确每个分区的目标副本列表(跨不同 Broker,避免单点)。示例(单分区扩到 3 副本):
{
“version”: 1,
“partitions”: [
{ “topic”: “my-topic”, “partition”: 0, “replicas”: [0,1,2] }
]
}
- 执行重分配:
bin/kafka-reassign-partitions.sh --bootstrap-server broker1:9092,broker2:9092,broker3:9092 --reassignment-json-file increase-replication-factor.json --execute
- 验证进度/结果:
bin/kafka-reassign-partitions.sh --bootstrap-server broker1:9092,broker2:9092,broker3:9092 --reassignment-json-file increase-replication-factor.json --verify
- 用 describe 复核:
bin/kafka-topics.sh --describe --topic my-topic --bootstrap-server localhost:9092
- 说明:上述流程适用于 Kafka 3.x 使用 –bootstrap-server 的方式;老版本可能使用 –zookeeper 参数,但扩副本思路一致。
五 验证与常见问题
- 验证要点:
- 使用 –describe 查看每个分区的 Replicas 数量是否达到目标、Isr 数量是否满足 min.insync.replicas、以及 Leader 分布是否均衡。
- 写入时若 Isr < min.insync.replicas,将抛出 NotEnoughReplicasException,这是预期的保护行为。
- 常见问题与建议:
- 副本分布不均或机架感知:在分配 JSON 中手动将副本分布到不同 broker.id,避免集中在同一节点/机架。
- 扩副本耗时与带宽:副本数增加会带来 网络与磁盘 开销,建议在低峰期执行并限速(如调小 replica.fetch.max.bytes、socket.send.buffer.bytes 等)。
- 老版本工具路径差异:部分文档仍使用 –zookeeper 方式,实际以你的 Kafka 版本为准;跨大版本升级时优先使用 –bootstrap-server 路径。