Ubuntu上Kafka配置关键注意事项
Kafka是基于Java的应用,需先安装JDK(推荐OpenJDK 8及以上):
sudo apt update && sudo apt install -y openjdk-11-jdk java -version # 验证安装 Kafka依赖Zookeeper进行集群管理和元数据存储(Kafka 3.x及以上版本支持KRaft模式,可脱离Zookeeper,但需额外配置集群ID)。Zookeeper需单独安装并配置zoo.cfg(设置dataDir和clientPort),启动后再启动Kafka。
/usr/local/kafka/config/server.properties是Kafka的主配置文件,需重点设置以下参数:
broker.id(每个broker的唯一整数,集群中不可重复);listeners(指定broker监听的地址和端口,如PLAINTEXT://0.0.0.0:9092允许所有IP访问,生产环境建议限制为内网IP);log.dirs(日志文件存储目录,建议使用独立分区或SSD,如/opt/kafka/logs);zookeeper.connect(集群模式下为多个节点的地址,如localhost:2181,192.168.1.2:2181,单机模式为localhost:2181);num.partitions(默认分区数,根据吞吐量需求调整,如3)、default.replication.factor(默认副本因子,生产环境建议≥3以保证高可用)。Kafka运行在JVM上,内存配置直接影响性能:
KAFKA_HEAP_OPTS设置初始堆内存(-Xms)和最大堆内存(-Xmx),建议设置为物理内存的1/4~1/2(如4GB内存可设为-Xms2G -Xmx2G),避免过大导致GC停顿:export KAFKA_HEAP_OPTS="-Xms2G -Xmx2G" log.segment.bytes(日志段大小,默认1GB,可根据数据量调整为2~4GB,减少分段数量)、log.retention.hours(日志保留时间,默认168小时/7天,根据业务需求调整)、message.max.bytes(单条消息最大大小,默认1MB,如需传输大文件可调整为10MB)。Kafka依赖顺序写入磁盘,需优化磁盘和参数:
log.dirs可指定多个目录(如/mnt/ssd1/kafka,/mnt/ssd2/kafka),Kafka会将分区均匀分布到不同磁盘,提高并行I/O能力;ulimit -n 65535)、调整TCP参数(net.ipv4.tcp_fin_timeout=30、net.core.rmem_max=16777216)、设置vm.swappiness=1(减少交换空间使用,避免磁盘I/O瓶颈);num.io.threads(磁盘I/O线程数,建议为CPU核心数的2倍,如8核设为16)、log.flush.interval.messages(批量刷盘的消息数,默认10000,可调整为50000~100000,减少刷盘次数)。ufw:sudo ufw allow 9092/tcp sudo ufw allow 2181/tcp sudo ufw reload listeners绑定到正确的网络接口(如PLAINTEXT://0.0.0.0:9092允许所有IP访问,或PLAINTEXT://192.168.1.100:9092限制为内网IP);num.network.threads(网络I/O线程数,建议为CPU核心数的1~2倍,如4核设为4),处理客户端请求。server.properties中的broker.id(如broker1设为0,broker2设为1)、listeners(如PLAINTEXT://192.168.1.100:9092、PLAINTEXT://192.168.1.101:9092)、zookeeper.connect(指向同一组Zookeeper节点);default.replication.factor≥3(生产环境建议),确保数据在多个broker上冗余存储,避免单点故障;UnderReplicatedPartitions指标(未同步的分区数),确保副本同步正常。ssl.keystore.location(密钥库路径)、ssl.keystore.password(密钥库密码)、ssl.truststore.location(信任库路径),启用listeners=SSL://:9093,强制客户端使用SSL连接;security.inter.broker.protocol=SASL_PLAINTEXT、sasl.mechanism.inter.broker.protocol=PLAIN、sasl.enabled.mechanisms=PLAIN,并设置jaas.conf文件(包含用户名和密码),防止未授权访问;kafka-acls.sh命令配置访问控制列表(ACL),限制用户对topic的读写权限(如kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:alice --operation Produce --topic test)。/usr/local/kafka/logs/server.log),查看错误信息(如ERROR、WARN)和警告信息(如磁盘空间不足);UnderReplicatedPartitions(未同步分区数)、RequestQueueTimeMs(请求队列时间)、MessagesInPerSec(每秒消息数)),设置告警规则(如未同步分区数超过1时触发告警);log.retention.hours(日志保留时间)和log.cleanup.policy(清理策略,默认delete,可设置为compact用于日志压缩),定期清理过期数据,避免磁盘空间耗尽。