目录标题
Kafka 主题分布原理、主题迁移、跨集群复制及配置修改 笔记,按照逻辑结构全面梳理,分为四大部分,适合做为学习文档或运维手册使用。
✅ Kafka 主题分布与管理全解析
涵盖:主题分布原理|分区副本迁移|跨集群复制|配置动态修改
一、Kafka 主题分布原理
Kafka 以主题(Topic)为逻辑单位组织数据,通过 分区(Partition) 和 副本(Replica) 实现高并发读写、容错和扩展。
1. 核心组件关系
| 概念 | 说明 |
|---|---|
| Topic | 主题,Kafka 的逻辑数据通道,生产者按主题发送数据,消费者按主题读取。 |
| Partition | 每个主题包含多个分区,每个分区是一个有序且可追加的日志文件。 |
| Replica | 每个分区可以配置多个副本,存放在不同的 Broker 上。 |
| Leader | 每个分区的主副本,负责读写请求。 |
| Follower | 跟随者副本,从 Leader 同步数据,用于高可用和故障转移。 |
2. 分区与副本的分布策略
- 默认分布策略:Kafka 尽可能将副本均匀分配到不同的 Broker 上。
- Rack 感知策略:配置
broker.rack,Kafka 避免将多个副本分配到同一机架上,提高容灾能力。
3. 示例:分区副本分布
假设集群有 3 个 Broker:B0、B1、B2
创建主题 orders,配置如下:
- 分区数:3
- 副本因子:2
可能的分布:
| 分区 | Leader | Replica 列表 |
|---|---|---|
| P0 | B0 | B0, B1 |
| P1 | B1 | B1, B2 |
| P2 | B2 | B2, B0 |
二、Kafka 主题迁移(同集群内重分配)
Kafka 支持在不影响业务的前提下重新分配主题分区副本位置,常见场景:
- 增加新 Broker 后希望平衡负载
- 某 Broker 故障或退役
- 手动优化数据分布
1. 工具使用:kafka-reassign-partitions.sh
Step 1️⃣:准备要迁移的主题 JSON
{
"topics": [{"topic": "orders"}],
"version": 1
}
保存为 topics-to-move.json
Step 2️⃣:生成新的分区副本方案
bin/kafka-reassign-partitions.sh \
--bootstrap-server localhost:9092 \
--topics-to-move-json-file topics-to-move.json \
--broker-list "0,1,2,3" \
--generate > reassign_plan.json
Step 3️⃣:执行迁移任务
bin/kafka-reassign-partitions.sh \
--bootstrap-server localhost:9092 \
--reassign-json-file reassign_plan.json \
--execute
Step 4️⃣:验证迁移完成状态
bin/kafka-reassign-partitions.sh \
--bootstrap-server localhost:9092 \
--reassign-json-file reassign_plan.json \
--verify
2. 注意事项
- 分区迁移期间会触发数据复制,建议在业务低峰执行。
- 可结合 Kafka 的监控系统(如 Prometheus + Grafana)查看迁移进度。
三、Kafka 跨集群主题复制
跨集群复制用于异地容灾、数据同步、云上云下混合部署,主流方案如下:
1. MirrorMaker 2(官方推荐)
特性:
- 基于 Kafka Connect 架构
- 支持 topic 白名单、黑名单过滤
- 支持自动恢复 leader 和消费位置
启动示例:
准备配置文件 mm2.properties:
clusters = A, B
A.bootstrap.servers=source-cluster:9092
B.bootstrap.servers=target-cluster:9092
tasks.max=1
topics = orders
启动命令:
bin/connect-mirror-maker.sh mm2.properties
2. Kafka Connect + Source/Sink Connector
可组合使用 Kafka Connector 实现以下链路:
- Kafka Source Connector(读源集群)
- Kafka Sink Connector(写目标集群)
适合与 ETL、数据清洗任务结合使用。
四、Kafka 主题配置修改
Kafka 支持动态调整主题的元数据和运行参数,常见包括:
1. 修改分区数(只能增加)
bin/kafka-topics.sh \
--bootstrap-server localhost:9092 \
--topic orders \
--partitions 6 \
--alter
📌 注意:
- Kafka 不支持减少分区数
- 新增分区无初始数据,分配策略可通过
--assignments自定义
2. 修改副本因子(通过副本迁移)
Kafka 不支持通过单条命令直接修改副本数,应使用重分配方案:
{
"partitions": [
{"topic": "orders", "partition": 0, "replicas": [0,1,2]},
{"topic": "orders", "partition": 1, "replicas": [1,2,3]}
],
"version": 1
}
然后执行:
bin/kafka-reassign-partitions.sh \
--bootstrap-server localhost:9092 \
--reassign-json-file increase_replicas.json \
--execute
3. 修改主题配置参数
# 设置压缩策略为 compact
bin/kafka-topics.sh --bootstrap-server localhost:9092 \
--topic orders --alter \
--config cleanup.policy=compact
# 设置消息保留时间为 7 天
bin/kafka-topics.sh --bootstrap-server localhost:9092 \
--topic orders --alter \
--config retention.ms=604800000
常用可修改参数:
| 参数名 | 说明 |
|---|---|
retention.ms | 消息最大保留时间(毫秒) |
cleanup.policy | 清理策略(delete 或 compact) |
segment.bytes | 日志段大小 |
min.insync.replicas | 最小同步副本数 |
五、操作建议与最佳实践
| 操作类别 | 建议与说明 |
|---|---|
| 副本迁移 | 避免高峰时段执行,防止占满带宽与 I/O |
| 分区增加 | 增加后需调整消费者组策略,避免数据倾斜 |
| 跨集群复制 | 事先测试链路稳定性,监控延迟与数据一致性 |
| 参数修改 | 配置生效范围为当前及未来写入数据,不会影响历史记录 |
| 自动化与可视化 | 推荐使用 Kafka Manager、KRaft UI、Prometheus、Control Center 监控与操作 |
| 回滚与备份 | 每次迁移或参数调整前保留原始配置 JSON,便于异常时快速回滚 |
4500

被折叠的 条评论
为什么被折叠?



