Ubuntu 上 Kafka 配置优化实操指南
一 环境与基础设施优化
- 硬件与存储:优先选用 SSD/NVMe,多盘并行可显著提升吞吐;将不同磁盘挂载路径配置到 log.dirs,Kafka 会优先把新分区放到分区数更少的目录,减少同盘争用。单盘性能有限时,避免把多个目录落在同一块磁盘上。
- 网络:保证 1Gbps/10Gbps 以上带宽与低时延;跨机房部署时优先同域。
- 操作系统:选用 XFS/ext4,挂载选项建议 noatime,nodiratime;I/O 调度器可选 deadline/noop;必要时调大 read_ahead_kb;生产环境建议 禁用 swap;适度提高 vm.dirty_background_ratio / vm.dirty_ratio 以利用 PageCache 顺序写优势(需结合负载压测验证)。
- 版本与架构:Kafka 2.8+ 支持 KRaft 模式,可去除外部 ZooKeeper 依赖,简化部署与运维。
二 Broker 关键配置 server.properties
- 基础网络与目录
- 明确监听与对外地址:listeners、advertised.listeners、listener.security.protocol.map(云上或容器环境尤为重要)。
- 多盘日志目录:log.dirs=/disk1/kafka-logs,/disk2/kafka-logs。
- 线程与网络
- num.network.threads:建议 CPU 核数 + 1(处理网络 I/O 与协议解析)。
- num.io.threads:建议 CPU 核数 × 2,最大不超过 ×3(磁盘 I/O 并发)。
- socket.send.buffer.bytes / socket.receive.buffer.bytes:适度增大(如 1MB 左右)以适配大消息与高吞吐。
- socket.request.max.bytes:根据业务最大消息尺寸合理上调,避免请求被截断。
- 可靠性与一致性
- replication.factor:建议 3(跨机架/可用区更稳健)。
- min.insync.replicas:建议 2(与 acks=all 配合,显著降低数据丢失风险)。
- unclean.leader.election.enable:false(避免脏 leader 导致数据空洞)。
- 日志与段管理
- log.retention.hours:按合规与恢复目标设置(如 72 小时)。
- log.segment.bytes:建议 1GB,减少小文件数量、加快启动扫描与日志清理。
- 刷盘策略:生产环境不建议通过 Broker 端 log.flush.interval.messages/ms 强制刷盘,可靠性由副本机制保障;如需更强持久化可按需调大内核脏页阈值并充分压测。
三 生产者与消费者配置
- 生产者
- batch.size:适度增大(如 16KB–64KB 起步,视吞吐与延迟目标调优)。
- linger.ms:适度增大(如 5–20ms)以积累批次,提高吞吐。
- compression.type:snappy/lz4/zstd,在 CPU 允许下优先 zstd。
- acks:all 配合 min.insync.replicas=2 实现强一致;对延迟极敏感场景可权衡为 1。
- 消费者
- fetch.min.bytes / fetch.max.wait.ms:适度增大以减少请求次数、提升吞吐。
- max.partition.fetch.bytes:确保单次拉取能覆盖业务单批处理需求。
- 并发度:一个分区同一时刻只能被同一消费者组内的 1 个消费者 消费,消费者并发度上限≈分区数。
四 JVM 与操作系统调优
- JVM
- 堆大小:设置 -Xmx 与 -Xms 相等(如 4–8GB 起步,视数据规模与容器/物理内存调整),避免运行期扩缩堆带来的停顿抖动。
- 垃圾回收器:优先 G1GC,如:
-XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35
容器场景需保证容器内存限制 > 堆内存,为堆外与 OS 预留空间。
- 文件描述符与 TCP
- ulimit -n:65536 或更高(Broker/系统均需调整)。
- net.core.somaxconn、net.ipv4.tcp_max_syn_backlog:适度增大以支撑高并发连接。
五 监控 维护与常见故障排查
- 监控与告警
- 开启 JMX,结合 Prometheus + Grafana 监控关键指标:
- Broker:UnderReplicatedPartitions、RequestHandlerAvgIdlePercent、NetworkProcessorAvgIdlePercent、Disk Usage。
- 生产者/消费者:发送/拉取速率、请求耗时、错误率、Lag。
- 运维与自启
- 使用 systemd 管理服务(zookeeper.service / kafka.service),配置开机自启与日志轮转,便于故障恢复与审计。
- 常见问题速查
- 端口占用:lsof -i:9092 / 2181 定位并释放进程。
- 磁盘空间不足:调整 log.retention.hours / log.segment.bytes,清理过期数据或扩容磁盘。
- 消费者无法消费:核对 group.id、订阅主题/分区、消费者数量与分区数匹配关系。
- 节点宕机/数据不一致:检查 ISR、网络与资源,必要时重建副本或临时调整 min.insync.replicas 并尽快恢复多数副本。