【Kafka源码解读和使用指南】第07篇:Kafka的配置圣经——broker配置参数全解析
2026/6/6 10:25:05 网站建设 项目流程

上一篇:【第06篇】Kafka集群搭建实战——三节点集群从零到一
下一篇:【第08篇】Kafka硬件选型指南——磁盘、内存、网络怎么配才不踩坑


摘要

server.properties里有上百个参数,哪些是必须改的?哪些保持默认就好?本文把Kafka broker的核心配置参数按功能分为六大类——节点身份、网络通信、存储引擎、数据保留、Topic默认值、线程与性能——逐类逐一讲解。每个参数都给出含义、默认值、推荐值和踩坑提醒。不管你是在搭开发环境还是准备上线,这份配置速查手册都能帮你少走弯路。读完这篇,你不会再对着server.properties一脸茫然。


一、配置全景图

【Kafka Broker 配置分类】 ┌────────────────────────────────────────────────────┐ │ server.properties │ │ │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ ① 节点身份 │ │ ② 网络与通信 │ │ │ │ node.id │ │ listeners │ │ │ │ process.roles │ │ advertised.* │ │ │ │ controller.* │ │ socket/buffer │ │ │ └──────────────────┘ └──────────────────┘ │ │ │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ ③ 存储引擎 │ │ ④ 数据保留 │ │ │ │ log.dirs │ │ log.retention.* │ │ │ │ log.segment.* │ │ log.cleanup.* │ │ │ │ log.flush.* │ │ log.cleaner.* │ │ │ └──────────────────┘ └──────────────────┘ │ │ │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ ⑤ Topic默认值 │ │ ⑥ 线程与性能 │ │ │ │ num.partitions │ │ num.network.* │ │ │ │ default.replica* │ │ num.io.threads │ │ │ │ offsets.topic.* │ │ num.replica.* │ │ │ └──────────────────┘ └──────────────────┘ │ │ │ └────────────────────────────────────────────────────┘

二、节点身份配置

node.id

node.id=1 # 默认0,但生产环境请显式设置
  • 含义:Broker在集群中的唯一标识
  • 规则:集群内每个Broker的node.id必须唯一,可以是任意整数
  • 推荐:用与主机名相关的数字,如host1 → 1, host2 → 2

process.roles(KRaft模式专有)

process.roles=broker,controller
  • 含义:节点角色,broker=数据面,controller=元数据管理面
  • 可选值brokercontrollerbroker,controller(合体模式)
  • 推荐:小集群(≤3节点)全部用broker,controller;大集群可以把controller单独拆出来

controller.quorum.voters(KRaft模式专有)

controller.quorum.voters=1@host1:9093,2@host2:9093,3@host3:9093
  • 含义:参与Raft法定人数的投票者列表
  • 格式node.id@host:port,逗号分隔
  • 规则:所有节点的此配置必须完全一致

三、网络与通信配置

listeners 与 advertised.listeners

# 内部监听 listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 # 对外广播(告诉客户端和别的Broker怎么连过来) advertised.listeners=PLAINTEXT://公网IP:9092

这两个参数的区别

  • listeners:Broker实际绑定的地址
  • advertised.listeners:Broker告诉客户端"用这个地址来连我"

如果你在云上(AWS/阿里云),机器有内网IP和外网IP:

listeners=PLAINTEXT://内网IP:9092 advertised.listeners=PLAINTEXT://外网IP:9092

Socket缓冲区

socket.send.buffer.bytes=102400 # 100KB,默认值一般够用 socket.receive.buffer.bytes=102400 # 100KB

调优方向:高吞吐场景可调到1MB(1048576),但要确保OS参数支持。

最大请求大小

socket.request.max.bytes=104857600 # 100MB,默认值

注意:如果Producer的max.request.size大于这个值,Broker会直接拒绝请求。

连接数限制

max.connections.per.ip=2147483647 # 默认值,几乎无限制 max.connections=2147483647 # 总连接数限制

推荐:生产环境建议设个合理上限,防止某个客户端恶意占满连接。


四、存储引擎配置

log.dirs

log.dirs=/data/kafka-logs # 绝对路径,可以配多个逗号分隔

推荐

  • 多块物理磁盘的话,每块配一个目录,Kafka会自动分散负载
  • 千万不要用NAS/NFS做log.dirs,延迟和可靠性都不行
  • 开发环境用SSD,生产环境用SSD或SAS HDD的RAID

log.segment.bytes

log.segment.bytes=1073741824 # 默认1GB
  • 每个分区日志被分成多个segment文件,此参数控制每个segment的大小
  • 影响
    • 值越小 → segment越频繁关闭 → 更多文件 → 文件句柄开销大
    • 值越大 → 数据保留策略执行越慢
  • 推荐:高吞吐场景保持默认1GB即可;低流量Topic可以调小到128MB

log.segment.ms

log.segment.ms=604800000 # 7天后强制关闭segment,默认不设置
  • 即使segment没达到log.segment.bytes大小,到时间也关闭

log.flush.interval.messages 与 log.flush.interval.ms

# 建议不要设置!依赖操作系统页缓存管理 log.flush.interval.messages=9223372036854775807 # 默认永不触发 log.flush.interval.ms=9223372036854775807 # 默认永不触发

重要警告:这两参数默认值是"从不主动flush",由Linux的脏页机制管理。不要随意设置小值——会造成大量fsync,性能断崖式下跌!


五、数据保留配置

log.retention.ms(时间保留)

log.retention.ms=604800000 # 7天,默认值 log.retention.hours=168 # 也是7天(已废弃,但还能用) log.retention.minutes=10080 # 也是7天(已废弃)

优先级ms>minutes>hours(取最小值生效)

推荐

  • 日志类数据:3-7天
  • 业务事件:14-30天
  • 审计数据:按合规要求

log.retention.bytes(大小保留)

log.retention.bytes=-1 # 默认无限制

注意:这个值作用在每个分区上,不是整个Topic!如果Topic有10个分区,设1GB,实际最多保留10GB。

时间和大小同时设置

log.retention.ms=86400000 # 1天 log.retention.bytes=1073741824 # 1GB # 效果:时间或大小任意一个条件满足就删除

log.cleanup.policy(清理策略)

log.cleanup.policy=delete # 默认:删除过期数据 # 可选:compact(保留每个key的最新值)
  • delete:普通的TTL模式,过期就删
  • compact:保留每个key的最新的那条消息,旧版本被压缩掉(用于__consumer_offsets等场景)

六、Topic默认配置

num.partitions

num.partitions=3 # 默认1,建议改

这是最容易被遗忘但影响最大的配置之一。

  • 开发环境:3个分区够用
  • 生产环境:按吞吐量估算
    • 如果你需要每秒消费100MB,单个Consumer每秒能处理50MB,那至少2个分区
    • 总原则:分区数 >= 目标吞吐量 / 单Consumer处理能力

default.replication.factor

default.replication.factor=3 # 默认1,生产环境建议3
  • 生产环境最少3个副本(P0是Leader,P1和P2是Follower)
  • 永远不要让这个值超过Broker数量

offsets.topic.replication.factor

offsets.topic.replication.factor=3 # 默认3(Kafka 3.3+),建议确认
  • __consumer_offsets这个内部Topic的副本数
  • 如果这个Topic丢数据,所有消费者组的offset都丢了

auto.create.topics.enable

auto.create.topics.enable=false # 生产环境建议设为false
  • 生产环境建议关闭自动创建Topic
  • 理由:自动创建的Topic使用默认参数(可能分区数、副本数都不对)
  • 改为手动创建Topic,参数一目了然

七、线程与性能配置

num.network.threads

num.network.threads=3 # 默认值,处理网络请求的线程数

推荐

  • 常规场景:保持默认3
  • 高吞吐场景(>100MB/s):调到6-9
  • 公式参考:num.network.threads = CPU核心数

num.io.threads

num.io.threads=8 # 默认值,处理磁盘I/O的线程数

推荐

  • 常规场景:保持默认8
  • 高吞吐+SSD:12-16
  • 公式参考:num.io.threads = 2 × CPU核心数

num.replica.fetchers

num.replica.fetchers=1 # 默认值,Follower拉取Leader数据的线程数

推荐:高吞吐副本同步建议调到2-4。但注意:num.replica.fetchers必须小于num.io.threads % num.network.threads

num.recovery.threads.per.data.dir

num.recovery.threads.per.data.dir=1 # 每个数据目录的恢复线程数

推荐:分区数多(>1000)时调到4-8。启动和崩溃恢复时能省很多时间。


【线程分配一览】 Acceptor(1) ← 接收新连接 │ ┌────────┼────────┐ ▼ ▼ ▼ Processor Processor Processor ← num.network.threads │ │ │ └────────┼────────┘ ▼ RequestQueue │ ┌────────┼────────┐ ▼ ▼ ▼ Handler Handler Handler ... ← num.io.threads │ │ │ └────────┼────────┘ ▼ 磁盘读写/日志操作

八、生产环境推荐配置速查

# ====== 节点身份 ====== node.id=1 process.roles=broker,controller controller.quorum.voters=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093 controller.listener.names=CONTROLLER # ====== 网络 ====== listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 advertised.listeners=PLAINTEXT://kafka1.yourdomain.com:9092 # ====== 存储 ====== log.dirs=/data1/kafka-logs,/data2/kafka-logs log.segment.bytes=1073741824 log.retention.ms=604800000 log.cleanup.policy=delete # ====== Topic默认值 ====== num.partitions=6 default.replication.factor=3 offsets.topic.replication.factor=3 auto.create.topics.enable=false # ====== 性能 ====== num.network.threads=6 num.io.threads=12 num.replica.fetchers=2 num.recovery.threads.per.data.dir=4 # ====== 最大消息大小 ====== message.max.bytes=10485760 # 10MB(默认1MB,根据需要调大) replica.fetch.max.bytes=10485760 # 与上面保持一致 # ====== 压缩 ====== compression.type=producer # 保留Producer的压缩(推荐)

九、配置变更须知

哪些配置改了要重启?哪些可以动态变更?

参数类型是否需要重启动态变更命令
num.partitionslog.dirs需要重启
log.retention.ms可动态kafka-configs.sh --alter
log.segment.bytes需要重启
num.network.threads需要重启
Topic级别的retention.ms可动态kafka-configs.sh --alter --topic

动态变更示例:

# 动态修改某个Topic的保留时间kafka-configs.sh --bootstrap-server localhost:9092\--alter--entity-type topics --entity-name my-topic\--add-configretention.ms=259200000

本篇小结

Kafka broker配置六大类:

  • 节点身份node.idprocess.rolescontroller.quorum.voters是KRaft模式的基石
  • 网络通信listenersvsadvertised.listeners的区分是云环境配置的头号坑
  • 存储引擎log.dirs多目录可以分散IO,log.segment.bytes控制文件粒度
  • 数据保留log.retention.mslog.retention.bytes可以同时用,任一满足就清理
  • Topic默认值num.partitionsdefault.replication.factor是决定数据分布的全局开关
  • 线程调优num.network.threadsnum.io.threads按CPU核心数调整

配置讲究"够用不浪费"。下一篇我们继续深入,讲怎么根据业务量选硬件——磁盘、内存、网络到底怎么配。


上一篇:【第06篇】Kafka集群搭建实战——三节点集群从零到一
下一篇:【第08篇】Kafka硬件选型指南——磁盘、内存、网络怎么配才不踩坑


需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询