Kafka 配置方法

FreeGuideOnline 最新 2026-07-15

properties

每个 Broker 的唯一 ID,集群内不可重复

broker.id=0

监听客户端请求的地址和端口

格式为:协议://主机名:端口

listeners=PLAINTEXT://your.host.name:9092

对外通告的地址,如果存在代理或 NAT 必须正确设置

advertised.listeners=PLAINTEXT://公网或外部可达IP:9092

连接 Zookeeper 集群地址,用于元数据管理(Kafka 2.8+ 可免 ZooKeeper,使用 KRaft)

zookeeper.connect=zk1:2181,zk2:2181,zk3:2181/kafka


### 日志存储配置

Kafka 的数据以日志文件形式存放,以下参数直接影响磁盘占用与清理策略。

```properties
# 日志文件的存放路径,建议使用独立磁盘,避免与系统盘争抢 IO
log.dirs=/data/kafka-logs

# 每个 Topic 默认的分区数量 (可被创建 Topic 时覆盖)
num.partitions=3

# 默认副本因子,生产环境建议至少为 2
default.replication.factor=2

# 日志段大小,达到该大小即创建一个新 Segment,默认 1GB
log.segment.bytes=1073741824

# 日志保留策略:按时间保留(小时),超过即删除
log.retention.hours=168

# 按容量保留:每个分区日志总大小超过该值则清理旧段
log.retention.bytes=10737418240

# 日志清理策略:delete(直接删除)或 compact(压缩合并,保留每个 key 的最新值)
log.cleanup.policy=delete

集群内部协议配置

为保证高可用和一致性,需调整副本和 Leader 选举相关参数。

# 允许 ISR(In-Sync Replicas)的最小数量,生产者设置 acks=-1 时,数据必须写入该数量的副本才算成功
# 防止数据丢失,但会增加延迟
min.insync.replicas=2

# 是否允许非 ISR 副本被选举为 Leader
# 设为 false 可保证数据一致性,但可能降低可用性
unclean.leader.election.enable=false

# 副本从 Leader 拉取数据的线程数,CPU 密集时可适当增大
num.replica.fetchers=4

# Follower 向 Leader 发送 Fetch 请求的间隔,影响延迟,默认 1 秒
replica.fetch.wait.max.ms=1000
replica.fetch.min.bytes=1

网络与性能优化

# Socket 发送/接收缓冲区大小,大流量场景建议调大
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576

# 请求处理线程数
num.network.threads=8
num.io.threads=16

# Segment 写操作刷盘配置(通常交给 OS 管理,但可增加保护)
# 强制刷盘的间隔时间(毫秒)和消息条数,谨慎使用,影响性能
# log.flush.interval.ms=10000
# log.flush.interval.messages=100000

KRaft 模式配置(KIP-500)

若使用 KRaft 替代 ZooKeeper,需额外配置:

# 启用 KRaft 控制器模式
process.roles=broker,controller
# 控制器仲裁组,所有控制器节点列表
controller.quorum.voters=1@broker1:9093,2@broker2:9093,3@broker3:9093
# 此节点的控制器ID(需 voter 一致)
node.id=1
# 控制器监听地址
controller.listener.names=CONTROLLER
listeners=PLAINTEXT://:9092,CONTROLLER://:9093

客户端配置(生产者与消费者)

客户端配置通过 Properties 对象或配置文件注入。下面列出生产级别的关键参数。

生产者配置

# Kafka 集群地址,多个逗号分隔
bootstrap.servers=kafka1:9092,kafka2:9092

# 消息确认模式:0-不等确认;1-只等 Leader 确认;all 或 -1-等所有 ISR 确认
acks=all

# 重试次数,与 acks=all 配合使用,防止瞬时故障导致消息丢失
retries=3

# 消息发送的批处理设置,提高吞吐
batch.size=16384
linger.ms=10

# 缓冲区内存总量
buffer.memory=33554432

# 键、值的序列化器
key.serializer=org.apache.kafka.common.serialization.StringSerializer
value.serializer=org.apache.kafka.common.serialization.StringSerializer

# 压缩算法,可选 none/gzip/snappy/lz4/zstd
compression.type=lz4

# 幂等性,保证单分区不重复消息,默认 true(Kafka 3.0+)
enable.idempotence=true

消费者配置

bootstrap.servers=kafka1:9092,kafka2:9092

# 消费者组 ID,相同组共享 offset 消费
group.id=my-consumer-group

# 是否自动提交偏移量(简易场景开启,生产环境推荐手动控制)
enable.auto.commit=false

# 自动偏移量重置策略:earliest(从头开始)/ latest(仅新消息)/ none(无偏移量时报错)
auto.offset.reset=earliest

# 反序列化器
key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
value.deserializer=org.apache.kafka.common.serialization.StringDeserializer

# 单次拉取的最大记录数
max.poll.records=500

# 会话超时,消费者未在限定时间内心跳则被踢出并触发再均衡
session.timeout.ms=30000
heartbeat.interval.ms=10000

# 两次 poll 之间的最大允许间隔,超时后消费者被视作死亡
max.poll.interval.ms=300000

Topic 配置管理

通过 kafka-topics.sh 脚本或 AdminClient 修改 Topic 级别配置。

# 创建 Topic 指定分区和副本
kafka-topics.sh --create --topic my-topic --partitions 6 --replication-factor 3 \
  --config retention.ms=86400000 \
  --config max.message.bytes=2097152 \
  --bootstrap-server localhost:9092

# 修改已有 Topic 级别配置
kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics \
  --entity-name my-topic --alter --add-config cleanup.policy=compact

# 查看 Topic 当前配置
kafka-topics.sh --describe --topic my-topic --bootstrap-server localhost:9092