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 分布是否更均衡。