Linux 上部署与调优 Kafka 的关键注意事项
一 基础环境与系统前置
- 运行环境:安装 Java 8 或 Java 11,并校验版本(java -version)。避免使用过旧或不受支持的 JDK。
- 资源基线:建议空闲内存 ≥4GB、磁盘可用空间 ≥10GB(按业务实际调整)。
- 端口与防火墙:开放 9092(Kafka)与 2181(ZooKeeper);如使用 firewalld:firewall-cmd --permanent --add-port={9092,2181}/tcp && firewall-cmd --reload。
- 运行身份与权限:创建专用 kafka 用户/组,避免使用 root;正确设置安装目录与数据目录的所有权与权限。
- 服务管理:建议使用 systemd 托管 Kafka 服务,设置依赖与自动启动,便于维护与监控。
二 Broker 核心配置
- 基础标识与连接:
- 每个 Broker 设置唯一 broker.id。
- 明确 listeners(对内监听地址)与 advertised.listeners(对外暴露地址),外网访问必须正确配置,否则客户端将连不通。
- 存储路径使用 log.dirs(可配置多磁盘目录,提升吞吐),避免继续使用已弃用的 log.dir。
- 主题与副本:
- 合理规划 num.partitions 与 default.replication.factor;关键内部主题如 offsets.topic.replication.factor、transaction.state.log.replication.factor 建议设为 ≥3(生产环境)。
- 可靠性:设置 min.insync.replicas(如 2),生产者使用 acks=all,避免数据丢失。
- 数据留存与大小:
- 配置 log.retention.{hours|minutes|ms} 与 log.retention.bytes,按合规与容量规划设置;
- 设置 message.max.bytes 与 replica.fetch.max.bytes,确保消息上限与副本拉取上限匹配业务。
- 启动恢复与线程:
- 根据磁盘数调整 num.recovery.threads.per.data.dir,加快启动恢复与关闭刷新。
三 网络与安全
- 监听与可达性:
- 正确填写 listeners 与 advertised.listeners;多网卡/内外网并存场景需分别指定,避免客户端拿到不可达地址。
- 防火墙放行 9092/2181,并限制来源网段(如仅内网网段可访问)。
- 传输安全:
- 启用 SSL/TLS 加密(配置 truststore/keystore);
- 启用 SASL 认证(如 PLAIN、SCRAM-SHA-256),并为跨机房/公网场景强制使用安全协议。
- 连接与性能:
- 适度增大 socket.send.buffer.bytes / socket.receive.buffer.bytes;
- 开启压缩(如 snappy、lz4、gzip)降低网络流量;
- 规划带宽与副本同步流量,避免高峰期拥塞。
四 磁盘 I/O 与操作系统调优
- 存储与 I/O:
- 优先使用 SSD;为顺序写优化,合理设置 num.io.threads(如接近 CPU 核数的 2 倍);
- 使用 XFS/ext4 并挂载选项 noatime,nodiratime;根据负载选择 deadline/noop I/O 调度器;
- 多磁盘时,将 log.dirs 指向不同物理盘,提升并发吞吐。
- 容量规划:按“增量消息数 × 平均消息大小 × 副本数 ×(1+其他空间占比)÷ 压缩比”估算容量,并预留 10%–20% 缓冲。
- 系统参数:
- 提升文件描述符限制(如 ulimit -n 65535 或 /etc/security/limits.conf 配置);
- 适度降低 vm.swappiness,避免 swap 影响延迟;
- 规划 JVM 堆(如 -Xms/-Xmx 相等,常见 4G–8G,视内存与负载而定),并启用 GC 日志便于排障。
五 常见坑与快速排障
- 消息积压:增加 分区数、优化消费端并发与批量(如提高 max.poll.records、合理批量),必要时调整分区分配策略(如 RoundRobinAssignor)。
- 数据丢失:生产者 acks=all + Broker min.insync.replicas≥2 + 合理重试(retries/backoff)。
- 重复消费:处理完成后 手动提交 或使用更短的 auto.commit.interval.ms;确保处理逻辑幂等。
- 频繁重平衡:提高 session.timeout.ms 与 max.poll.interval.ms,避免单次处理耗时过长。
- 磁盘写满:缩短 log.retention.hours 或设置 log.retention.bytes;紧急清理可用 kafka-delete-records.sh。
- ZooKeeper 会话过期/Controller 切换频繁:检查 zookeeper.session.timeout.ms、ZK 负载与网络稳定性,必要时分离部署。
- 端口冲突:检查 9092 占用(netstat -tulnp | grep 9092),释放或更换端口。