乐途乐途
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
  • 学习路径
  • 第1章 消息队列与 Kafka 概述

    • 章节导读
    • 消息队列基础
    • Kafka 概述
    • Kafka 为什么快
  • 第2章 快速上手:单机环境搭建

    • 章节导读
    • 环境准备与安装
    • 快速启动
    • Topic 管理
  • 第3章 核心概念:主题、分区与日志

    • 章节导读
    • Topic
    • Partition
    • Offset
    • Segment 与存储结构
  • 第4章 生产者详解

    • 章节导读
    • Producer 概述
    • Producer 发送机制
    • Producer 分区策略
    • Producer 幂等与事务
    • Producer 配置
  • 第5章 消费者与消费组

    • 章节导读
    • Consumer 概述
    • Consumer Group 消费组
    • Consumer 分区分配策略
    • Consumer Offset 提交
    • Consumer 多线程
    • Consumer 配置
  • 第6章 Broker 与控制器

    • 章节导读
    • Broker 概述
    • Broker 配置
    • Controller
    • KRaft 共识协议
  • 第7章 副本与数据可靠性

    • 章节导读
    • 副本机制
    • ISR 与副本同步
    • Leader 选举
    • ACK 与一致性保证
    • 高水位与 Leader Epoch
  • 第8章 存储与性能优化

    • 章节导读
    • 存储架构
    • 日志清理与压缩
    • Page Cache 与零拷贝
    • Producer 性能优化
    • Consumer 性能优化
    • Broker 性能优化
  • 第9章 生产环境运维与监控

    • 章节导读
    • Topic 管理
    • Kafka 运维工具
    • 监控
    • 常见故障排查
  • 第10章 Kafka生态与面试考点

    • 章节导读
    • Kafka 生态全景
    • 面试高频 30 题

Topic 管理

定义与作用

Topic 管理是 Kafka 运维最频繁的操作。包括 Topic 的创建、配置修改、分区扩容、查看详情和删除。本节覆盖 kafka-topics.sh 的完整用法及生产环境最佳实践。

核心原理

Topic 管理操作全景

分区数不可减少

分区不可降的原因:

  1. 数据已按 Key Hash 分布到各分区,合并会破坏分区语义
  2. Consumer 的 Offset 与分区绑定,删除分区会导致 Offset 失效
  3. 分区内部有序,合并多个分区无法保证合并后有序

完整示例

示例一:Topic 完整生命周期

# 1. 创建 Topic
bin/kafka-topics.sh --create --topic orders \
  --partitions 6 --replication-factor 3 \
  --config retention.ms=604800000 \
  --config min.insync.replicas=2 \
  --config max.message.bytes=1048576 \
  --bootstrap-server localhost:9092

# 2. 查看详情
bin/kafka-topics.sh --describe --topic orders --bootstrap-server localhost:9092
# Topic: orders  PartitionCount: 6  ReplicationFactor: 3  Configs: ...
#   Partition: 0  Leader: 1  Replicas: 1,2,3  Isr: 1,2,3
#   Partition: 1  Leader: 2  Replicas: 2,3,1  Isr: 2,3,1
#   ...

# 3. 分区扩容(只能增加)
bin/kafka-topics.sh --alter --topic orders \
  --partitions 12 --bootstrap-server localhost:9092

# 4. 修改配置
bin/kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type topics --entity-name orders \
  --alter --add-config retention.ms=259200000

# 5. 查看覆盖配置
bin/kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type topics --entity-name orders --describe

# 6. 删除 Topic(需 broker 配置 delete.topic.enable=true)
bin/kafka-topics.sh --delete --topic orders --bootstrap-server localhost:9092

操作前后对比:

操作前后
创建无6 分区,3 副本
扩容6 分区12 分区
修改配置retention=7天retention=3天
删除12 分区无

示例二:列出所有 Topic 并过滤

# 列出所有 Topic
bin/kafka-topics.sh --list --bootstrap-server localhost:9092
# orders
# payments
# logs
# __consumer_offsets
# __transaction_state

# 排除内部 Topic
bin/kafka-topics.sh --list --bootstrap-server localhost:9092 \
  --exclude-internal
# orders
# payments
# logs

# 查看有问题的 Topic(无 Leader 的分区)
bin/kafka-topics.sh --describe --under-replicated-partitions \
  --bootstrap-server localhost:9092
#   Partition: 5  Leader: -1  Replicas: 3,1,2  Isr: 1,2
# → Partition 5 无 Leader,需排查

易错场景

易错 1:分区扩容后数据不均匀

场景:分区从 3 扩到 6,但新分区没数据,Producer 的 Key Hash 映射到了新分区。

后果:消费端如果依赖分区内有序性——扩容后同一个 Key 可能换分区,有序性被破坏。且新分区的 Consumer 最初消费不到数据。

事实:分区扩容后已有数据不会自动重分布。只有新写入的数据才会到新分区。扩容不保证顺序消费。

易错 2:未设 min.insync.replicas 即上生产

场景:Topic 创建时使用默认 min.insync.replicas=1。

后果:acks=all 等价于 acks=1,无 Follower 确认。Leader 故障时可能丢数据。

最佳实践:生产 Topic 创建模板:

bin/kafka-topics.sh --create --topic <name> \
  --partitions <N> \
  --replication-factor 3 \
  --config min.insync.replicas=2 \
  --config retention.ms=<N> \
  --bootstrap-server localhost:9092

面试高频考点

Q:为什么 Kafka 分区数只能增加不能减少?如果业务数据量下降怎么办?

A:

  1. 数据完整性:删除分区意味着删除其所有数据,与分区内不可变追加语义冲突
  2. Consumer Offset:删分区会导致 Offset 失效,Consumer 无法继续消费
  3. Key 路由:Partitioner 基于 hash(key) % partitionCount,减分区会破坏所有 Key 的路由一致性

实际做法:

  • 短期:保留分区(无数据不影响性能,只是元数据多几项)
  • 长期:创建新 Topic,迁移消费组到新 Topic,废弃旧 Topic
  • 使用 kafka-reassign-partitions.sh 将分区数据迁移到其他 Topic(重分配不算"减少"分区数)
上一页
章节导读
下一页
Kafka 运维工具