kafka

Kafka 核心概念、CLI 与生产消费要点

补充说明

kafka 是分布式事件流平台,数据按 Topic 追加到 Partition 日志,Partition 通过 Replica 复制到多个 Broker。每个 Partition 有一个 Leader 和若干 Follower,ISR 是与 Leader 保持同步的副本集合;Consumer Group 把 Partition 分配给成员,同一 Partition 在同一时刻只由一个成员消费。

它解决高吞吐削峰、系统解耦、事件回溯和流处理的数据底座问题。与 RabbitMQ 的队列/确认模型不同,Kafka 保留日志并按 offset 消费,消费者可以重放;与 Pulsar 相比,Kafka 的分区模型更简单,生态和 Connect 连接器更成熟。Broker 启动、磁盘、副本重分配等运维细节见 kafka-broker 页面。

KRaft 模式用 Controller quorum 取代 ZooKeeper,元数据也走 Raft;生产要规划 node.id、controller.quorum.voters、process.roles 和 advertised.listeners。客户端只依赖 bootstrap servers,但拿到的是 broker 返回的 advertised 地址,内网/外网监听要分别配置。

常用示例

kafka-topics.sh --bootstrap-server broker:9092 --create --topic orders --partitions 12 --replication-factor 3 --config min.insync.replicas=2 --config retention.ms=604800000
kafka-topics.sh --bootstrap-server broker:9092 --list
kafka-topics.sh --bootstrap-server broker:9092 --describe --topic orders
kafka-configs.sh --bootstrap-server broker:9092 --alter --entity-type topics --entity-name orders --add-config retention.ms=86400000
kafka-console-producer.sh --bootstrap-server broker:9092 --topic orders --property parse.key=true --property key.separator=:
kafka-console-consumer.sh --bootstrap-server broker:9092 --topic orders --group debug --from-beginning --property print.key=true
kafka-consumer-groups.sh --bootstrap-server broker:9092 --list
kafka-consumer-groups.sh --bootstrap-server broker:9092 --describe --group order-service
kafka-consumer-groups.sh --bootstrap-server broker:9092 --group order-service --topic orders --reset-offsets --to-earliest --dry-run
kafka-consumer-groups.sh --bootstrap-server broker:9092 --group order-service --topic orders --reset-offsets --to-earliest --execute
kafka-get-offsets.sh --bootstrap-server broker:9092 --topic orders
kafka-metadata-quorum.sh --bootstrap-server broker:9092 describe --status
kafka-storage.sh random-uuid
kafka-storage.sh format -t <uuid> -c config/kraft/server.properties
kafka-server-start.sh config/kraft/server.properties

生产者与消费者关键参数:

# producer
acks=all
enable.idempotence=true
retries=2147483647
max.in.flight.requests.per.connection=5
delivery.timeout.ms=120000
linger.ms=5
batch.size=16384
compression.type=lz4

# consumer
group.id=order-service
enable.auto.commit=false
auto.offset.reset=earliest
max.poll.records=500
max.poll.interval.ms=300000
isolation.level=read_committed

常见配置

Broker/Topic 侧常用项:

num.partitions=12
default.replication.factor=3
min.insync.replicas=2
auto.create.topics.enable=false
log.retention.hours=168
log.segment.bytes=1073741824
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
unclean.leader.election.enable=false

num.partitions 服务端默认 1,retention.ms 默认 604800000(7 天),segment.bytes 默认 1GiB,min.insync.replicas 默认 1;生产不要依赖这些默认值。acks=all + min.insync.replicas=2 + 3 副本,才能在单副本故障时仍可写。

易错点与排错

相关命令

读完自测

  1. Partition、Replica、ISR 和 Consumer Group 之间是什么关系?
  2. acks=all、min.insync.replicas=2、3 副本同时满足时能容忍什么故障?
  3. 为什么关闭自动提交后仍可能重复消费?
答案
  1. Partition 是并行与顺序单位,Replica 是其副本,ISR 是同步副本集合,Consumer Group 按 Partition 分配给成员消费。
  2. 可容忍一个副本离线仍能写入;若 ISR 少于 2,acks=all 写入会失败而不是静默丢数据。
  3. 处理完成但提交 offset 前崩溃/再平衡,下一任消费者会从上次提交位点重放,形成至少一次语义。