4. Kafka命令行操作:从创建Topic到管理Consumer Group

说实话,很多初学者一上来就扎进Kafka的API开发,结果连最基本的命令行操作都磕磕绊绊。我个人觉得,命令行才是理解Kafka运行机制最快的方式。你想想看,你亲手创建了一个Topic,看着消息从生产者流向消费者,这种直观感受比看十篇理论文章都管用。

这一节,我们就来把Kafka的命令行操作彻底搞明白。我会结合我在金融项目中的实际经验,把那些容易踩坑的地方都给你指出来。

4.1 创建Topic:你的第一个Kafka主题

创建Topic是Kafka操作的第一步。命令很简单,但参数背后的门道不少。

# 创建一个名为"financial-transactions"的Topic
# 3个分区,2个副本
kafka-topics.sh --create \
  --bootstrap-server localhost:9092 \
  --topic financial-transactions \
  --partitions 3 \
  --replication-factor 2

这里我要特别强调一下分区数的选择。我在项目中遇到过,有人图省事,所有Topic都用默认的1个分区。结果业务量一上来,消费者根本扛不住。为什么?因为Kafka的并行消费能力,本质上就是靠分区数来支撑的。

核心原则:分区数决定了消费的并行度。一般建议分区数至少是消费者线程数的2-3倍。

副本因子呢?在金融场景下,我建议至少设置为2。我曾经因为磁盘故障丢过数据,那教训太深刻了。不过也别设太多,3个副本就足够了,再多就是浪费资源。

4.2 查看Topic详情:知己知彼

创建完Topic,我们得确认一下它是不是真的按预期工作了。

# 查看所有Topic列表
kafka-topics.sh --list --bootstrap-server localhost:9092

# 查看指定Topic的详细信息
kafka-topics.sh --describe \
  --bootstrap-server localhost:9092 \
  --topic financial-transactions

输出结果会告诉你分区分布、Leader副本、ISR列表等信息。这里有个小技巧:重点关注ISR(In-Sync Replicas)的数量。如果ISR数量小于副本因子,说明有副本落后了,得赶紧排查。

我的习惯:每次上线新Topic,我都会先跑一遍--describe,确认分区和副本都正常。这花不了10秒钟,但能避免很多线上问题。

4.3 生产消息:把数据送进Kafka

生产消息我们用kafka-console-producer.sh。这个工具特别适合做功能验证。

# 启动生产者,发送消息
kafka-console-producer.sh \
  --bootstrap-server localhost:9092 \
  --topic financial-transactions

# 然后输入消息内容,每行一条
> {"orderId": "TX001", "amount": 1500.00, "currency": "CNY"}
> {"orderId": "TX002", "amount": 3200.50, "currency": "USD"}

嗯,这里要注意:默认情况下,生产者发送的消息是没有key的,会以轮询方式分配到各个分区。如果你需要保证相同key的消息进入同一个分区,可以加上--property parse.key=true --property key.separator=:参数。

# 带key的生产消息
kafka-console-producer.sh \
  --bootstrap-server localhost:9092 \
  --topic financial-transactions \
  --property parse.key=true \
  --property key.separator=:

> user001:{"orderId": "TX003", "amount": 500.00}

为什么强调这个?在金融系统中,同一个用户的交易记录必须有序处理。如果你不指定key,消息可能分散到不同分区,消费顺序就乱了。我见过有人因为这个原因,对账系统跑出来全是乱账。

4.4 消费消息:把数据读出来

消费消息用kafka-console-consumer.sh。这个工具默认只消费新消息,不会读取历史数据。

# 启动消费者,从最新消息开始消费
kafka-console-consumer.sh \
  --bootstrap-server localhost:9092 \
  --topic financial-transactions

# 从最开始的消息开始消费
kafka-console-consumer.sh \
  --bootstrap-server localhost:9092 \
  --topic financial-transactions \
  --from-beginning

避坑指南:我曾经在生产环境上误加了--from-beginning参数,结果消费者把Topic里上亿条历史消息全拉下来了,磁盘IO直接打满。所以,这个参数一定要慎用,尤其是在生产环境。

如果你想看消息的key、分区、偏移量等元数据,可以加上--property print.key=true --property print.partition=true --property print.offset=true

kafka-console-consumer.sh \
  --bootstrap-server localhost:9092 \
  --topic financial-transactions \
  --property print.key=true \
  --property print.partition=true \
  --property print.offset=true \
  --from-beginning

4.5 管理Consumer Group:掌控消费进度

Consumer Group是Kafka实现高可用的核心机制。同一个Group内的消费者共同消费一个Topic,每个分区只能被一个消费者消费。

# 列出所有Consumer Group
kafka-consumer-groups.sh --list --bootstrap-server localhost:9092

# 查看指定Group的详细信息
kafka-consumer-groups.sh --describe \
  --bootstrap-server localhost:9092 \
  --group my-consumer-group

输出结果会显示每个分区的当前偏移量(CURRENT-OFFSET)、日志结束偏移量(LOG-END-OFFSET)以及消费者落后多少(LAG)。这个LAG值特别重要,它直接反映了消费者的处理能力是否跟得上生产速度。

字段 含义 监控建议
CURRENT-OFFSET 当前消费者已消费到的位置 持续增长说明消费正常
LOG-END-OFFSET 生产者写入的最新位置 与CURRENT-OFFSET的差值就是LAG
LAG 消费者落后消息数 LAG持续增大说明消费能力不足

实战经验:在金融系统中,我们会对LAG设置告警阈值。比如,LAG超过1000条就触发告警。为什么?因为交易数据有实时性要求,延迟太久会导致风控系统失效。

如果你需要重置消费偏移量,可以用--reset-offsets参数。这个操作很危险,我建议只在测试环境使用。

# 将消费偏移量重置到最早位置
kafka-consumer-groups.sh --reset-offsets \
  --bootstrap-server localhost:9092 \
  --group my-consumer-group \
  --topic financial-transactions \
  --to-earliest \
  --execute

4.6 本章知识体系

下面这张图展示了Kafka命令行操作的核心逻辑,从创建Topic到消费消息,再到管理Consumer Group,每一步都有明确的输入输出。

Kafka命令行操作核心流程 创建Topic kafka-topics.sh --create 查看Topic详情 kafka-topics.sh --describe 生产消息 kafka-console-producer.sh 消费消息 kafka-console-consumer.sh 管理Consumer Group kafka-consumer-groups.sh 监控与运维 查看LAG、重置偏移量 关键参数说明 --bootstrap-server: 指定Kafka地址 --partitions: 分区数(影响并行度) --replication-factor: 副本数 --from-beginning: 从头消费 --group: 指定消费者组

这张图把整个流程串起来了。你从创建Topic开始,然后查看详情确认配置正确,接着生产消息验证写入,再消费消息确认读取,最后通过Consumer Group管理消费进度。每一步都有对应的命令和参数。

我的建议:刚开始学的时候,别急着写代码。先把这些命令行操作练熟。你可以在本地搭一个单节点Kafka,反复创建、删除Topic,生产消费消息,看看不同参数会带来什么效果。这种动手实践,比看十遍文档都管用。

好了,Kafka命令行操作就讲到这里。这些命令你平时开发、测试、排查问题都会频繁用到。记住,多动手,多实践,遇到问题别慌,先用命令行看看Topic和Consumer Group的状态,往往就能找到线索。


公众号:蓝海资料掘金营,微信deep3321