Ubuntu Kafka网络配置优化指南
在server.properties中,listeners参数定义Broker监听的地址和端口(如PLAINTEXT://your.server.ip:9092),需指定Broker所在服务器的具体IP(避免0.0.0.0带来的安全风险);advertised.listeners参数用于告知客户端连接的地址(如集群内其他Broker或客户端机器的IP),需根据实际访问需求配置(如内网用内网IP,外网用公网IP)。例如:
listeners=PLAINTEXT://192.168.1.100:9092
advertised.listeners=PLAINTEXT://192.168.1.100:9092
确保Ubuntu防火墙(ufw)或云服务商安全组开放Kafka使用的端口(默认9092):
sudo ufw allow 9092/tcp
sudo ufw reload
修改/etc/sysctl.conf文件,优化TCP缓冲区和拥塞控制,提升网络吞吐量:
net.core.rmem_max = 16777216 # 接收缓冲区最大值
net.core.wmem_max = 16777216 # 发送缓冲区最大值
net.ipv4.tcp_rmem = 4096 87380 16777216 # 接收缓冲区动态调整范围
net.ipv4.tcp_wmem = 4096 65536 16777216 # 发送缓冲区动态调整范围
net.ipv4.tcp_congestion_control = cubic # 拥塞控制算法(根据网络环境选择)
net.ipv4.tcp_low_latency = 1 # 启用低延迟模式
应用配置:sudo sysctl -p。
Kafka需要处理大量并发连接,需提高文件描述符限制。编辑/etc/security/limits.conf:
* soft nofile 65536
* hard nofile 65536
重启系统或重新登录生效。
num.network.threads:处理网络请求的线程数,建议设置为CPU核心数的50%-75%(如8核CPU设置为4-6);num.io.threads:处理磁盘I/O的线程数,建议设置为CPU核心数的50%(如8核CPU设置为4)。num.network.threads=6
num.io.threads=4
socket.send.buffer.bytes:生产者发送缓冲区大小,建议设置为1MB(1048576字节);socket.receive.buffer.bytes:消费者接收缓冲区大小,建议设置为1MB。socket.request.max.bytes:单个socket请求的最大大小,建议设置为100MB(104857600字节),避免大消息导致请求失败。
batch.size:批量发送的消息大小,建议设置为1MB(16384字节),减少网络请求次数;linger.ms:生产者等待更多消息加入批次的时间,建议设置为100ms以上(如200ms),提高批处理效率;compression.type:消息压缩类型,推荐lz4(压缩率高且CPU开销低)。batch.size=16384
linger.ms=200
compression.type=lz4
fetch.min.bytes:消费者从Broker拉取的最小数据量,建议设置为1MB(1024字节),减少拉取次数;fetch.max.wait.ms:未达到fetch.min.bytes时的最大等待时间,建议设置为1000ms(1秒),平衡延迟与吞吐量。fetch.min.bytes=1024
fetch.max.wait.ms=1000
若集群有内外网需求,可通过listeners和advertised.listeners配置多网卡监听。例如:
listeners=INTERNAL://192.168.1.100:9092,EXTERNAL://203.0.113.5:9092
advertised.listeners=INTERNAL://192.168.1.100:9092,EXTERNAL://203.0.113.5:9092
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:SSL
此配置中,集群内Broker通过内网IP通信,客户端通过外网IP访问(并启用SSL加密)。
若使用Docker/Kubernetes,需通过环境变量设置advertised.listeners,指向宿主机的Service域名或IP。例如Dockerfile中:
ENV KAFKA_ADVERTISED_HOST_NAME=${HOST_IP}
CMD ["--override", "advertised.listeners=PLAINTEXT://${HOST_IP}:9092"]
确保容器能被客户端正确访问。
使用监控工具(如Prometheus+Grafana)实时监控Kafka网络指标(如吞吐量、延迟、连接数),及时发现网络瓶颈。定期清理日志文件(如/var/log/kafka),避免磁盘空间不足影响网络性能。