10.3.4 多副本与分区分布策略
多副本与分区分布策略用于提升可用性与容错能力,并在一致性与成本之间平衡。副本因子(replication.factor)决定每个分区的副本数量,Leader 负责读写,Follower 同步日志并在故障时接管。与之配合的 min.insync.replicas 与 acks=all 能保证写入必须被足够的 ISR 成员确认。
安装与环境准备(Kafka 工具)#
以下示例使用 Kafka 自带 CLI 工具完成主题创建与副本分配验证:
# 1) 安装 Kafka(示例路径 /opt/kafka)
wget https://downloads.apache.org/kafka/3.6.0/kafka_2.13-3.6.0.tgz
tar -xf kafka_2.13-3.6.0.tgz -C /opt
ln -s /opt/kafka_2.13-3.6.0 /opt/kafka
# 2) 设置 PATH,确保 kafka-topics.sh 可用
echo 'export PATH=/opt/kafka/bin:$PATH' >> /etc/profile
source /etc/profile
# 3) 验证工具
kafka-topics.sh --version
# 预期:输出版本号
关键配置与示例(含命令解释)#
Broker 机架感知配置(示例:/opt/kafka/config/server.properties)
建议每台 Broker 配置不同机架,保证副本跨机架分布。
broker.id=1
listeners=PLAINTEXT://0.0.0.0:9092
log.dirs=/data/kafka-logs
broker.rack=rack-a
default.replication.factor=3
min.insync.replicas=2
unclean.leader.election.enable=false
创建主题并设置副本因子与分区数
# 创建主题:3 副本、6 分区
kafka-topics.sh --bootstrap-server 10.0.0.10:9092 \
--create --topic order-events \
--replication-factor 3 --partitions 6
# 命令解释:
# --bootstrap-server 连接集群入口
# --replication-factor 每个分区副本数
# --partitions 分区数量
查看副本分布与 ISR
kafka-topics.sh --bootstrap-server 10.0.0.10:9092 \
--describe --topic order-events
# 输出示例字段含义:
# Leader: 当前分区 Leader 所在 broker
# Replicas: 该分区所有副本 broker 列表
# Isr: 当前同步中的副本列表
副本重分配(示例流程)#
当新增/退役 Broker 或分布不均时,执行 Reassignment:
# 1) 生成计划(仅示例,需替换 broker 列表)
cat > /tmp/reassign.json <<'EOF'
{
"version":1,
"partitions":[
{"topic":"order-events","partition":0,"replicas":[1,2,3]},
{"topic":"order-events","partition":1,"replicas":[2,3,4]}
]
}
EOF
# 2) 执行重分配
kafka-reassign-partitions.sh \
--bootstrap-server 10.0.0.10:9092 \
--execute --reassignment-json-file /tmp/reassign.json
# 3) 验证进度
kafka-reassign-partitions.sh \
--bootstrap-server 10.0.0.10:9092 \
--verify --reassignment-json-file /tmp/reassign.json
# 命令解释:
# --execute 触发迁移
# --verify 观察迁移完成度
可靠性参数建议#
- 副本因子:3(常规生产),5(强一致)
- min.insync.replicas:2(副本因子=3)
- acks=all:保证 ISR 确认
- unclean.leader.election.enable=false:避免脏 Leader
生产者配置示例
acks=all
retries=10
delivery.timeout.ms=120000
排错与诊断(常见场景)#
1) ISR 缩小
kafka-topics.sh --bootstrap-server 10.0.0.10:9092 \
--describe --topic order-events | grep -E 'Isr|Leader'
# 若 Isr 长期小于 min.insync.replicas:
# 检查网络与磁盘 IO、Follower 是否宕机
2) Leader 不均衡
kafka-leader-election.sh --bootstrap-server 10.0.0.10:9092 \
--election-type PREFERRED --all-topic-partitions
# 解释:将 Leader 迁回首选副本,改善写入均衡
3) 副本同步慢
# 查看 broker 日志(示例路径)
tail -f /opt/kafka/logs/server.log | grep -E 'ReplicaFetcher|ISR'
练习#
1) 创建一个主题 log-events,设置 4 分区、3 副本,并验证 ISR。
2) 手动下线一个 Broker,观察 ISR 变化与生产者写入是否失败。
3) 通过重分配将 log-events 的分区均衡到新增 Broker,验证 Leader 分布是否更均衡。