
上一篇【第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.idnode.id1 # 默认0但生产环境请显式设置含义Broker在集群中的唯一标识规则集群内每个Broker的node.id必须唯一可以是任意整数推荐用与主机名相关的数字如host1 → 1, host2 → 2process.rolesKRaft模式专有process.rolesbroker,controller含义节点角色broker数据面controller元数据管理面可选值broker、controller、broker,controller合体模式推荐小集群≤3节点全部用broker,controller大集群可以把controller单独拆出来controller.quorum.votersKRaft模式专有controller.quorum.voters1host1:9093,2host2:9093,3host3:9093含义参与Raft法定人数的投票者列表格式node.idhost:port逗号分隔规则所有节点的此配置必须完全一致三、网络与通信配置listeners 与 advertised.listeners# 内部监听 listenersPLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 # 对外广播告诉客户端和别的Broker怎么连过来 advertised.listenersPLAINTEXT://公网IP:9092这两个参数的区别listenersBroker实际绑定的地址advertised.listenersBroker告诉客户端用这个地址来连我如果你在云上AWS/阿里云机器有内网IP和外网IPlistenersPLAINTEXT://内网IP:9092 advertised.listenersPLAINTEXT://外网IP:9092Socket缓冲区socket.send.buffer.bytes102400 # 100KB默认值一般够用 socket.receive.buffer.bytes102400 # 100KB调优方向高吞吐场景可调到1MB1048576但要确保OS参数支持。最大请求大小socket.request.max.bytes104857600 # 100MB默认值注意如果Producer的max.request.size大于这个值Broker会直接拒绝请求。连接数限制max.connections.per.ip2147483647 # 默认值几乎无限制 max.connections2147483647 # 总连接数限制推荐生产环境建议设个合理上限防止某个客户端恶意占满连接。四、存储引擎配置log.dirslog.dirs/data/kafka-logs # 绝对路径可以配多个逗号分隔推荐多块物理磁盘的话每块配一个目录Kafka会自动分散负载千万不要用NAS/NFS做log.dirs延迟和可靠性都不行开发环境用SSD生产环境用SSD或SAS HDD的RAIDlog.segment.byteslog.segment.bytes1073741824 # 默认1GB每个分区日志被分成多个segment文件此参数控制每个segment的大小影响值越小 → segment越频繁关闭 → 更多文件 → 文件句柄开销大值越大 → 数据保留策略执行越慢推荐高吞吐场景保持默认1GB即可低流量Topic可以调小到128MBlog.segment.mslog.segment.ms604800000 # 7天后强制关闭segment默认不设置即使segment没达到log.segment.bytes大小到时间也关闭log.flush.interval.messages 与 log.flush.interval.ms# 建议不要设置依赖操作系统页缓存管理 log.flush.interval.messages9223372036854775807 # 默认永不触发 log.flush.interval.ms9223372036854775807 # 默认永不触发重要警告这两参数默认值是从不主动flush由Linux的脏页机制管理。不要随意设置小值——会造成大量fsync性能断崖式下跌五、数据保留配置log.retention.ms时间保留log.retention.ms604800000 # 7天默认值 log.retention.hours168 # 也是7天已废弃但还能用 log.retention.minutes10080 # 也是7天已废弃优先级msminuteshours取最小值生效推荐日志类数据3-7天业务事件14-30天审计数据按合规要求log.retention.bytes大小保留log.retention.bytes-1 # 默认无限制注意这个值作用在每个分区上不是整个Topic如果Topic有10个分区设1GB实际最多保留10GB。时间和大小同时设置log.retention.ms86400000 # 1天 log.retention.bytes1073741824 # 1GB # 效果时间或大小任意一个条件满足就删除log.cleanup.policy清理策略log.cleanup.policydelete # 默认删除过期数据 # 可选compact保留每个key的最新值delete普通的TTL模式过期就删compact保留每个key的最新的那条消息旧版本被压缩掉用于__consumer_offsets等场景六、Topic默认配置num.partitionsnum.partitions3 # 默认1建议改这是最容易被遗忘但影响最大的配置之一。开发环境3个分区够用生产环境按吞吐量估算如果你需要每秒消费100MB单个Consumer每秒能处理50MB那至少2个分区总原则分区数 目标吞吐量 / 单Consumer处理能力default.replication.factordefault.replication.factor3 # 默认1生产环境建议3生产环境最少3个副本P0是LeaderP1和P2是Follower永远不要让这个值超过Broker数量offsets.topic.replication.factoroffsets.topic.replication.factor3 # 默认3Kafka 3.3)建议确认__consumer_offsets这个内部Topic的副本数如果这个Topic丢数据所有消费者组的offset都丢了auto.create.topics.enableauto.create.topics.enablefalse # 生产环境建议设为false生产环境建议关闭自动创建Topic理由自动创建的Topic使用默认参数可能分区数、副本数都不对改为手动创建Topic参数一目了然七、线程与性能配置num.network.threadsnum.network.threads3 # 默认值处理网络请求的线程数推荐常规场景保持默认3高吞吐场景100MB/s调到6-9公式参考num.network.threads CPU核心数num.io.threadsnum.io.threads8 # 默认值处理磁盘I/O的线程数推荐常规场景保持默认8高吞吐SSD12-16公式参考num.io.threads 2 × CPU核心数num.replica.fetchersnum.replica.fetchers1 # 默认值Follower拉取Leader数据的线程数推荐高吞吐副本同步建议调到2-4。但注意num.replica.fetchers必须小于num.io.threads % num.network.threadsnum.recovery.threads.per.data.dirnum.recovery.threads.per.data.dir1 # 每个数据目录的恢复线程数推荐分区数多1000时调到4-8。启动和崩溃恢复时能省很多时间。【线程分配一览】 Acceptor(1) ← 接收新连接 │ ┌────────┼────────┐ ▼ ▼ ▼ Processor Processor Processor ← num.network.threads │ │ │ └────────┼────────┘ ▼ RequestQueue │ ┌────────┼────────┐ ▼ ▼ ▼ Handler Handler Handler ... ← num.io.threads │ │ │ └────────┼────────┘ ▼ 磁盘读写/日志操作八、生产环境推荐配置速查# 节点身份 node.id1 process.rolesbroker,controller controller.quorum.voters1kafka1:9093,2kafka2:9093,3kafka3:9093 controller.listener.namesCONTROLLER # 网络 listenersPLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 advertised.listenersPLAINTEXT://kafka1.yourdomain.com:9092 # 存储 log.dirs/data1/kafka-logs,/data2/kafka-logs log.segment.bytes1073741824 log.retention.ms604800000 log.cleanup.policydelete # Topic默认值 num.partitions6 default.replication.factor3 offsets.topic.replication.factor3 auto.create.topics.enablefalse # 性能 num.network.threads6 num.io.threads12 num.replica.fetchers2 num.recovery.threads.per.data.dir4 # 最大消息大小 message.max.bytes10485760 # 10MB默认1MB根据需要调大 replica.fetch.max.bytes10485760 # 与上面保持一致 # 压缩 compression.typeproducer # 保留Producer的压缩推荐九、配置变更须知哪些配置改了要重启?哪些可以动态变更?参数类型是否需要重启动态变更命令num.partitions、log.dirs需要重启—log.retention.ms可动态kafka-configs.sh --alterlog.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.ms259200000本篇小结Kafka broker配置六大类节点身份node.id、process.roles、controller.quorum.voters是KRaft模式的基石网络通信listenersvsadvertised.listeners的区分是云环境配置的头号坑存储引擎log.dirs多目录可以分散IOlog.segment.bytes控制文件粒度数据保留log.retention.ms和log.retention.bytes可以同时用任一满足就清理Topic默认值num.partitions和default.replication.factor是决定数据分布的全局开关线程调优num.network.threads和num.io.threads按CPU核心数调整配置讲究够用不浪费。下一篇我们继续深入讲怎么根据业务量选硬件——磁盘、内存、网络到底怎么配。上一篇【第06篇】Kafka集群搭建实战——三节点集群从零到一下一篇【第08篇】Kafka硬件选型指南——磁盘、内存、网络怎么配才不踩坑