上一篇【第78篇】Kafka生态全景图——与大数据技术栈的完美融合下一篇【第80篇】Kafka分区重分配实战——分区负载均衡不再头疼摘要如果把Kafka比作一辆跑车前几篇文章都在讲怎么开快“怎么漂移”这篇我们打开引擎盖——聊聊怎么修车。Topic怎么创建才规范分区不够了在线扩容会不会丢数据配置改了必须重启吗消费者Group卡住了怎么重置本文是一份纯操作的Kafka运维手册覆盖Topic管理的完整生命周期、分区在线扩容的原理与限制、消费者组的7种操作姿势、以及kafka-configs动态配置变更的精髓。每个操作都标注了风险等级附带回滚方案——生产环境的运维容不得半点马虎。一、Topic管理——生、改、死1.1 创建Topic规范姿势# 最简创建不推荐参数不可控kafka-topics.sh--create\--topictest\--bootstrap-server localhost:9092# 规范创建生产推荐kafka-topics.sh--create\--topicorders\--partitions12\--replication-factor3\--bootstrap-server localhost:9092\--configretention.ms604800000\--configmax.message.bytes1048576\--configcompression.typeproducer关键参数说明参数推荐值说明--partitions根据吞吐量估算分区数 期望吞吐量 / 单分区吞吐量--replication-factor3生产环境最少3关键Topic可为5retention.ms6048000007天消息保留时间按业务需求设retention.bytes-1不限制按大小保留与按时间取最小值max.message.bytes10485761MB单条消息最大体积compression.typeproducer让Producer控制压缩分区数估算公式【分区数计算】 方式一按吞吐量 分区数 期望吞吐量 / 单分区吞吐量 示例期望100MB/s写入单分区极限25MB/s 分区数 100 / 25 4取6-8留余量 方式二按消费者并发 分区数 期望消费者并发数 示例Flink Job的并行度为16 分区数 16 最终取两者中的较大值再加20-30%的余量1.2 查看Topic# 列出所有Topickafka-topics.sh--list--bootstrap-server localhost:9092# 查看Topic详情最常用命令kafka-topics.sh--describe--topicorders --bootstrap-server localhost:9092# 输出示例# Topic: orders PartitionCount: 12 ReplicationFactor: 3# Partition: 0 Leader: 2 Replicas: 2,1,3 Isr: 2,1,3# Partition: 1 Leader: 3 Replicas: 3,2,1 Isr: 3,2,1# ...# 解读# - Leader: 负责读写的Broker ID# - Replicas: 所有副本所在的Broker列表# - Isr: 跟上Leader同步的副本列表# 如果Isr数量 Replicas数量 → 有副本掉队了1.3 修改Topic配置# 修改消息保留时间动态变更无需重启kafka-configs.sh--alter\--topicorders\--add-configretention.ms259200000\--bootstrap-server localhost:9092# 修改多个配置kafka-configs.sh--alter\--topicorders\--add-configretention.ms259200000,max.message.bytes2097152\--bootstrap-server localhost:9092# 查看Topic的动态配置kafka-configs.sh--describe\--topicorders\--bootstrap-server localhost:90921.4 删除Topic高风险操作# ⚠️ 风险等级高# 前提Broker配置中 delete.topic.enabletrue默认# 删除Topickafka-topics.sh--delete\--topicorders\--bootstrap-server localhost:9092# 验证是否删除成功会留在标记删除状态一段时间kafka-topics.sh--list--bootstrap-server localhost:9092|greporders# 如果删不掉检查是否有生产者/消费者还在连接该Topic删除前必做检查清单确认是否有Active Producer确认是否有Active Consumer Group确认下游无依赖Flink Job / 数据管道确认数据已有备份非生产环境验证删除流程二、分区在线扩容——只能增加不能减少2.1 核心规则【分区数的铁律】 ✅ 可以增加分区数 ❌ 不能减少分区数 ⚠️ 增加分区不会自动重分布历史数据 为什么不能减少 1. 历史数据的存储已经按旧分区数分布 2. 删除分区意味着删除数据 3. 减少分区会导致有Key的消息Hash结果变化2.2 扩容操作# 将orders Topic的分区数从12增加到18kafka-topics.sh--alter\--topicorders\--partitions18\--bootstrap-server localhost:9092# 验证kafka-topics.sh--describe--topicorders --bootstrap-server localhost:90922.3 扩容的重要影响【分区扩容后的数据分布】 扩容前3分区 P0: [msg1] [msg2] [msg3] [msg4] [msg5] P1: [msg1] [msg2] [msg3] [msg4] P2: [msg1] [msg2] [msg3] [msg4] [msg5] [msg6] 扩容后6分区 P0: [msg1] [msg2] [msg3] [msg4] [msg5] ← 旧数据不动 P1: [msg1] [msg2] [msg3] [msg4] ← 旧数据不动 P2: [msg1] [msg2] [msg3] [msg4] [msg5] [msg6] ← 旧数据不动 P3: [] ← 新分区空的 P4: [] ← 新分区空的 P5: [] ← 新分区空的 ⛔ 关键影响 1. 带Key的消息扩容后同一个Key可能被Hash到不同分区 → 这破坏了分区内的消息顺序保证 2. 消费者可以立即增加并发度 → 从最多3个Consumer变成最多6个 解决方案 - 如果关注Key顺序扩容前先评估Key的Hash分布 - 如果消息无Key或不关注顺序大胆扩2.4 扩容的时机指标阈值建议单分区吞吐量 30MB/s扩容Consumer Lag持续增长扩容增加消费并发单分区文件大小 100GB扩容分散存储压力Producer发送延迟 100ms扩容三、消费者组管理——一切尽在掌握3.1 列出所有消费者组# 列出所有消费者组kafka-consumer-groups.sh--list--bootstrap-server localhost:90923.2 查看消费者组详情# 查看消费状态最常用命令kafka-consumer-groups.sh--describe\--grouporder-service\--bootstrap-server localhost:9092# 输出示例# GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG# order-service orders 0 1520 1523 3# order-service orders 1 2301 2301 0# order-service orders 2 980 1800 820# 关键字段解读# CURRENT-OFFSET: 消费者已消费到的位置# LOG-END-OFFSET: 分区最新消息的位置# LAG: 积压量 LOG-END-OFFSET - CURRENT-OFFSET# → LAG 0 说明消费者追不上生产者3.3 重置Offset八大场景# 场景1重置到最早重新消费所有历史数据kafka-consumer-groups.sh\--grouporder-service\--topicorders\--reset-offsets --to-earliest\--execute\--bootstrap-server localhost:9092# 场景2重置到最新跳过所有积压数据kafka-consumer-groups.sh\--grouporder-service\--topicorders\--reset-offsets --to-latest\--execute\--bootstrap-server localhost:9092# 场景3按时间重置回到1小时前kafka-consumer-groups.sh\--grouporder-service\--topicorders\--reset-offsets --to-datetime2026-05-30T14:00:00.000\--execute\--bootstrap-server localhost:9092# 场景4按偏移量减少减少1000条kafka-consumer-groups.sh\--grouporder-service\--topicorders\--reset-offsets --shift-by-1000\--execute\--bootstrap-server localhost:9092# 场景5重置到指定offset精确到分区# 先导出当前offsetkafka-consumer-groups.sh\--grouporder-service\--topicorders:0,1,2\--reset-offsets --to-offset500\--execute\--bootstrap-server localhost:9092重置前强制检查# 先用 --dry-run 看看会改成什么样确认无误再 --executekafka-consumer-groups.sh\--grouporder-service\--topicorders\--reset-offsets --to-earliest\--dry-run\--bootstrap-server localhost:90923.4 删除消费者组# 前提消费者组已无Active成员kafka-consumer-groups.sh--delete\--groupold-consumer-group\--bootstrap-server localhost:9092消费者组操作风险等级操作风险等级影响回滚方案--describe无风险只读无需--list无风险只读无需--reset-offsets⚠️ 中消息重复消费或跳过--shift-by回退--delete⚠️ 高消费进度丢失无法回滚需从备份恢复四、动态配置变更——无需重启可以改什么Kafka支持动态修改大部分配置无需重启Broker。这是运维人员的免死金牌。4.1 可动态变更的Topic级别配置# 修改Topic的消息保留时间kafka-configs.sh--alter\--topicorders\--add-configretention.ms86400000\--bootstrap-server localhost:9092# 修改Topic的消息大小限制kafka-configs.sh--alter\--topicorders\--add-configmax.message.bytes2097152\--bootstrap-server localhost:9092# 修改Topic的清理策略delete → compactkafka-configs.sh--alter\--topicuser-logs\--add-configcleanup.policycompact\--bootstrap-server localhost:90924.2 可动态变更的Broker级别配置# 查看某个Broker的动态配置kafka-configs.sh--describe\--entity-type brokers\--entity-name1\--bootstrap-server localhost:9092# 动态修改Broker配置例如日志清理线程数kafka-configs.sh--alter\--entity-type brokers\--entity-name1\--add-configlog.cleaner.threads4\--bootstrap-server localhost:9092# 修改所有Brokerkafka-configs.sh--alter\--entity-type brokers\--entity-default\--add-configlog.cleaner.threads4\--bootstrap-server localhost:90924.3 需要重启Broker的配置不可动态变更【这些配置改了必须重启】 - broker.id - log.dirs数据目录 - zookeeper.connect - listeners监听地址和端口 - advertised.listeners - num.network.threads - num.io.threads - ssl.*SSL相关配置 - sasl.*SASL认证相关配置 经验之谈网络、认证、存储路径的配置都需要重启。 性能调优类参数大部分可以动态改。常用动态配置速查表配置项级别默认值动态作用retention.msTopic6048000007天✅消息保留时间retention.bytesTopic-1无限✅消息保留大小max.message.bytesTopic10485761MB✅单条消息上限min.insync.replicasTopic/Broker1✅最小同步副本数unclean.leader.election.enableTopic/Brokerfalse✅是否允许非同步副本选为Leadersegment.bytesTopic10737418241GB✅日志分段大小compression.typeTopicproducer✅压缩类型cleanup.policyTopicdelete✅清理策略五、操作回滚方案运维操作的黄金法则凡事留后路。配置回滚# 1. 修改前先备份当前配置kafka-configs.sh--describe\--topicorders--all\--bootstrap-server localhost:9092topic-orders-config-bak.txt# 2. 执行修改kafka-configs.sh--alter\--topicorders\--add-configretention.ms259200000\--bootstrap-server localhost:9092# 3. 如果出问题回滚到原值kafka-configs.sh--alter\--topicorders\--add-configretention.ms604800000\--bootstrap-server localhost:9092Topic删除后悔药# Kafka没有原生的回收站。删除Topic后# 1. 数据文件在磁盘上在log.dirs中找到.TopicName-delete标记# 2. 在标记时间内默认60秒ZooKeeper中还有元数据# 3. 如果真的删了只能从备份恢复# 如果Topic还在标记删除状态# 删除ZK中的 admin/delete_topics/TopicName 节点# 可中止删除但不推荐请让删除正常完成本篇小结Kafka运维管理的核心操作要点Topic创建要规范分区数 max(吞吐量/单分区吞吐量, 消费者并发) 30%余量副本因子最少3分区只能增不能减增加分区不会重分布历史数据带Key的消息可能导致顺序问题消费者组管理三板斧--describe看状态→--reset-offsets --dry-run预览→--execute执行绝不跳过dry-run动态配置是宝贝大部分Topic和Broker配置可在线改无需重启。但网络/认证/存储配置必须重启运维铁律改前备份describe导出→ dry-run预览 → 执行 → 验证 → 保留回滚能力下一篇我们解决一个让所有Kafka运维头痛的问题——分区数据不均衡怎么办上一篇【第78篇】Kafka生态全景图——与大数据技术栈的完美融合下一篇【第80篇】Kafka分区重分配实战——分区负载均衡不再头疼
【Kafka源码解读和使用指南】第79篇:Kafka运维手册——Topic管理、分区扩容、动态配置变更完全指南
上一篇【第78篇】Kafka生态全景图——与大数据技术栈的完美融合下一篇【第80篇】Kafka分区重分配实战——分区负载均衡不再头疼摘要如果把Kafka比作一辆跑车前几篇文章都在讲怎么开快“怎么漂移”这篇我们打开引擎盖——聊聊怎么修车。Topic怎么创建才规范分区不够了在线扩容会不会丢数据配置改了必须重启吗消费者Group卡住了怎么重置本文是一份纯操作的Kafka运维手册覆盖Topic管理的完整生命周期、分区在线扩容的原理与限制、消费者组的7种操作姿势、以及kafka-configs动态配置变更的精髓。每个操作都标注了风险等级附带回滚方案——生产环境的运维容不得半点马虎。一、Topic管理——生、改、死1.1 创建Topic规范姿势# 最简创建不推荐参数不可控kafka-topics.sh--create\--topictest\--bootstrap-server localhost:9092# 规范创建生产推荐kafka-topics.sh--create\--topicorders\--partitions12\--replication-factor3\--bootstrap-server localhost:9092\--configretention.ms604800000\--configmax.message.bytes1048576\--configcompression.typeproducer关键参数说明参数推荐值说明--partitions根据吞吐量估算分区数 期望吞吐量 / 单分区吞吐量--replication-factor3生产环境最少3关键Topic可为5retention.ms6048000007天消息保留时间按业务需求设retention.bytes-1不限制按大小保留与按时间取最小值max.message.bytes10485761MB单条消息最大体积compression.typeproducer让Producer控制压缩分区数估算公式【分区数计算】 方式一按吞吐量 分区数 期望吞吐量 / 单分区吞吐量 示例期望100MB/s写入单分区极限25MB/s 分区数 100 / 25 4取6-8留余量 方式二按消费者并发 分区数 期望消费者并发数 示例Flink Job的并行度为16 分区数 16 最终取两者中的较大值再加20-30%的余量1.2 查看Topic# 列出所有Topickafka-topics.sh--list--bootstrap-server localhost:9092# 查看Topic详情最常用命令kafka-topics.sh--describe--topicorders --bootstrap-server localhost:9092# 输出示例# Topic: orders PartitionCount: 12 ReplicationFactor: 3# Partition: 0 Leader: 2 Replicas: 2,1,3 Isr: 2,1,3# Partition: 1 Leader: 3 Replicas: 3,2,1 Isr: 3,2,1# ...# 解读# - Leader: 负责读写的Broker ID# - Replicas: 所有副本所在的Broker列表# - Isr: 跟上Leader同步的副本列表# 如果Isr数量 Replicas数量 → 有副本掉队了1.3 修改Topic配置# 修改消息保留时间动态变更无需重启kafka-configs.sh--alter\--topicorders\--add-configretention.ms259200000\--bootstrap-server localhost:9092# 修改多个配置kafka-configs.sh--alter\--topicorders\--add-configretention.ms259200000,max.message.bytes2097152\--bootstrap-server localhost:9092# 查看Topic的动态配置kafka-configs.sh--describe\--topicorders\--bootstrap-server localhost:90921.4 删除Topic高风险操作# ⚠️ 风险等级高# 前提Broker配置中 delete.topic.enabletrue默认# 删除Topickafka-topics.sh--delete\--topicorders\--bootstrap-server localhost:9092# 验证是否删除成功会留在标记删除状态一段时间kafka-topics.sh--list--bootstrap-server localhost:9092|greporders# 如果删不掉检查是否有生产者/消费者还在连接该Topic删除前必做检查清单确认是否有Active Producer确认是否有Active Consumer Group确认下游无依赖Flink Job / 数据管道确认数据已有备份非生产环境验证删除流程二、分区在线扩容——只能增加不能减少2.1 核心规则【分区数的铁律】 ✅ 可以增加分区数 ❌ 不能减少分区数 ⚠️ 增加分区不会自动重分布历史数据 为什么不能减少 1. 历史数据的存储已经按旧分区数分布 2. 删除分区意味着删除数据 3. 减少分区会导致有Key的消息Hash结果变化2.2 扩容操作# 将orders Topic的分区数从12增加到18kafka-topics.sh--alter\--topicorders\--partitions18\--bootstrap-server localhost:9092# 验证kafka-topics.sh--describe--topicorders --bootstrap-server localhost:90922.3 扩容的重要影响【分区扩容后的数据分布】 扩容前3分区 P0: [msg1] [msg2] [msg3] [msg4] [msg5] P1: [msg1] [msg2] [msg3] [msg4] P2: [msg1] [msg2] [msg3] [msg4] [msg5] [msg6] 扩容后6分区 P0: [msg1] [msg2] [msg3] [msg4] [msg5] ← 旧数据不动 P1: [msg1] [msg2] [msg3] [msg4] ← 旧数据不动 P2: [msg1] [msg2] [msg3] [msg4] [msg5] [msg6] ← 旧数据不动 P3: [] ← 新分区空的 P4: [] ← 新分区空的 P5: [] ← 新分区空的 ⛔ 关键影响 1. 带Key的消息扩容后同一个Key可能被Hash到不同分区 → 这破坏了分区内的消息顺序保证 2. 消费者可以立即增加并发度 → 从最多3个Consumer变成最多6个 解决方案 - 如果关注Key顺序扩容前先评估Key的Hash分布 - 如果消息无Key或不关注顺序大胆扩2.4 扩容的时机指标阈值建议单分区吞吐量 30MB/s扩容Consumer Lag持续增长扩容增加消费并发单分区文件大小 100GB扩容分散存储压力Producer发送延迟 100ms扩容三、消费者组管理——一切尽在掌握3.1 列出所有消费者组# 列出所有消费者组kafka-consumer-groups.sh--list--bootstrap-server localhost:90923.2 查看消费者组详情# 查看消费状态最常用命令kafka-consumer-groups.sh--describe\--grouporder-service\--bootstrap-server localhost:9092# 输出示例# GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG# order-service orders 0 1520 1523 3# order-service orders 1 2301 2301 0# order-service orders 2 980 1800 820# 关键字段解读# CURRENT-OFFSET: 消费者已消费到的位置# LOG-END-OFFSET: 分区最新消息的位置# LAG: 积压量 LOG-END-OFFSET - CURRENT-OFFSET# → LAG 0 说明消费者追不上生产者3.3 重置Offset八大场景# 场景1重置到最早重新消费所有历史数据kafka-consumer-groups.sh\--grouporder-service\--topicorders\--reset-offsets --to-earliest\--execute\--bootstrap-server localhost:9092# 场景2重置到最新跳过所有积压数据kafka-consumer-groups.sh\--grouporder-service\--topicorders\--reset-offsets --to-latest\--execute\--bootstrap-server localhost:9092# 场景3按时间重置回到1小时前kafka-consumer-groups.sh\--grouporder-service\--topicorders\--reset-offsets --to-datetime2026-05-30T14:00:00.000\--execute\--bootstrap-server localhost:9092# 场景4按偏移量减少减少1000条kafka-consumer-groups.sh\--grouporder-service\--topicorders\--reset-offsets --shift-by-1000\--execute\--bootstrap-server localhost:9092# 场景5重置到指定offset精确到分区# 先导出当前offsetkafka-consumer-groups.sh\--grouporder-service\--topicorders:0,1,2\--reset-offsets --to-offset500\--execute\--bootstrap-server localhost:9092重置前强制检查# 先用 --dry-run 看看会改成什么样确认无误再 --executekafka-consumer-groups.sh\--grouporder-service\--topicorders\--reset-offsets --to-earliest\--dry-run\--bootstrap-server localhost:90923.4 删除消费者组# 前提消费者组已无Active成员kafka-consumer-groups.sh--delete\--groupold-consumer-group\--bootstrap-server localhost:9092消费者组操作风险等级操作风险等级影响回滚方案--describe无风险只读无需--list无风险只读无需--reset-offsets⚠️ 中消息重复消费或跳过--shift-by回退--delete⚠️ 高消费进度丢失无法回滚需从备份恢复四、动态配置变更——无需重启可以改什么Kafka支持动态修改大部分配置无需重启Broker。这是运维人员的免死金牌。4.1 可动态变更的Topic级别配置# 修改Topic的消息保留时间kafka-configs.sh--alter\--topicorders\--add-configretention.ms86400000\--bootstrap-server localhost:9092# 修改Topic的消息大小限制kafka-configs.sh--alter\--topicorders\--add-configmax.message.bytes2097152\--bootstrap-server localhost:9092# 修改Topic的清理策略delete → compactkafka-configs.sh--alter\--topicuser-logs\--add-configcleanup.policycompact\--bootstrap-server localhost:90924.2 可动态变更的Broker级别配置# 查看某个Broker的动态配置kafka-configs.sh--describe\--entity-type brokers\--entity-name1\--bootstrap-server localhost:9092# 动态修改Broker配置例如日志清理线程数kafka-configs.sh--alter\--entity-type brokers\--entity-name1\--add-configlog.cleaner.threads4\--bootstrap-server localhost:9092# 修改所有Brokerkafka-configs.sh--alter\--entity-type brokers\--entity-default\--add-configlog.cleaner.threads4\--bootstrap-server localhost:90924.3 需要重启Broker的配置不可动态变更【这些配置改了必须重启】 - broker.id - log.dirs数据目录 - zookeeper.connect - listeners监听地址和端口 - advertised.listeners - num.network.threads - num.io.threads - ssl.*SSL相关配置 - sasl.*SASL认证相关配置 经验之谈网络、认证、存储路径的配置都需要重启。 性能调优类参数大部分可以动态改。常用动态配置速查表配置项级别默认值动态作用retention.msTopic6048000007天✅消息保留时间retention.bytesTopic-1无限✅消息保留大小max.message.bytesTopic10485761MB✅单条消息上限min.insync.replicasTopic/Broker1✅最小同步副本数unclean.leader.election.enableTopic/Brokerfalse✅是否允许非同步副本选为Leadersegment.bytesTopic10737418241GB✅日志分段大小compression.typeTopicproducer✅压缩类型cleanup.policyTopicdelete✅清理策略五、操作回滚方案运维操作的黄金法则凡事留后路。配置回滚# 1. 修改前先备份当前配置kafka-configs.sh--describe\--topicorders--all\--bootstrap-server localhost:9092topic-orders-config-bak.txt# 2. 执行修改kafka-configs.sh--alter\--topicorders\--add-configretention.ms259200000\--bootstrap-server localhost:9092# 3. 如果出问题回滚到原值kafka-configs.sh--alter\--topicorders\--add-configretention.ms604800000\--bootstrap-server localhost:9092Topic删除后悔药# Kafka没有原生的回收站。删除Topic后# 1. 数据文件在磁盘上在log.dirs中找到.TopicName-delete标记# 2. 在标记时间内默认60秒ZooKeeper中还有元数据# 3. 如果真的删了只能从备份恢复# 如果Topic还在标记删除状态# 删除ZK中的 admin/delete_topics/TopicName 节点# 可中止删除但不推荐请让删除正常完成本篇小结Kafka运维管理的核心操作要点Topic创建要规范分区数 max(吞吐量/单分区吞吐量, 消费者并发) 30%余量副本因子最少3分区只能增不能减增加分区不会重分布历史数据带Key的消息可能导致顺序问题消费者组管理三板斧--describe看状态→--reset-offsets --dry-run预览→--execute执行绝不跳过dry-run动态配置是宝贝大部分Topic和Broker配置可在线改无需重启。但网络/认证/存储配置必须重启运维铁律改前备份describe导出→ dry-run预览 → 执行 → 验证 → 保留回滚能力下一篇我们解决一个让所有Kafka运维头痛的问题——分区数据不均衡怎么办上一篇【第78篇】Kafka生态全景图——与大数据技术栈的完美融合下一篇【第80篇】Kafka分区重分配实战——分区负载均衡不再头疼