Kafka 重要配置参数

2022/08/11

Broker 参数

存储信息

只要配置 log.dirs ,生产环境必须配置多个路径,格式是逗号分隔的多个路径。最好保证多个目录挂在到不同磁盘上,这么做的好处:

Zookeeper 相关

Zookeeper 是一个分布式协调框架,负责协调管理并保存 Kafka 集群的所有原数据。 zookeeper.connect 指定 zk servers 的值, 例如: zk1:2181,zk2:2181,zk3:2181 如果有两个 Kafka 集群想使用同一套 Zookeeper 集群,那么要用上 chroot 。 两套集群的 zookeeper.connect 配置分别可以是 zk1:2181,zk2:2181,zk3:2181/kafka1 和 zk1:2181,zk2:2181,zk3:2181/kafka2。切记 chroot 只需要写一次,而且是加到最后的。

Broker 连接相关

客户端或其他 Broker 与该 Broker 如何通信

监听器是若干个逗号分隔的三元组,每个三元组的格式为 协议名://主机名:端口号 协议名可以是标准名称:

Topic 管理相关

数据留存相关

Topic 级别的参数

Topic 级别参数优先级高于 Broker 参数。

从保存消息的维度,下面参数很重要:

从能处理消息的大小:

Topic 级别参数的设置

有两种方式:

创建 Topic 时设置参数

设想你的部门需要将交易数据发送 Kafka 进行处理,需要保存最近半年的交易数据,(单条消息)数据大小不超过 5MB :

bin/kafka-topics.sh \
--bootstrap-server localhost:9092 \
--create \
--topic transaction \
--partitions 1 \
--replication-factor 1 \
--config retention.ms=15552000000 \
--config max.message.bytes=5242880

假设要将发送最大值调整为 10MB ,用 kafka-configs 命令来修改:

bin/kafka-configs.sh \
--bootstrap-server localhost:9092 \
--entity-type topics \
--entity-name transaction \
--alter \
--add-config max.message.bytes=10485760

统一使用 kafka-configs 脚本来调整 topic 级别参数。

JVM 参数

KAFKA_HEAP_OPTS 制定堆大小

以后讨论调优 Kafka 性能问题。目前业界比较公认的一个合理值, JVM 堆大小 6GB 。

KAFKA_JVM_PERFORMANCE_OPTS 制定 GC 参数

Java 7 根据以下规则设置:

举例

在启动 Kafka 之前配置环境变量:

export KAFKA_HEAP_OPTS=--Xms6g  --Xmx6g
export KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent -Djava.awt.headless=true"
bin/kafka-server-start.sh config/server.properties

操作系统参数

需要关注的:

ulimit -n

通常情况下将它设置成一个超大的值是合理的做法,比如 ulimit -n 1000000

FS

根据官网的测试报告,XFS 的性能要强于 ext4,所以生产环境最好还是使用 XFS。

最近有个 Kafka 使用 ZFS 的数据报告,貌似性能更加强劲,有条件的话不妨一试。

swap

不要设置成 0 比较好,我们可以设置成一个较小的值。 因为一旦设置成 0,当物理内存耗尽时,操作系统会触发 OOM killer 这个组件,它会随机挑选一个进程然后 kill 掉,即根本不给用户任何的预警。 但如果设置成一个比较小的值,当开始使用 swap 空间时,你至少能够观测到 Broker 性能开始出现急剧下降,从而给你进一步调优和诊断问题的时间。 建议将 swappniess 配置成一个接近 0 但不为 0 的值,比如 1。

Flush

提交时间或者说是 Flush 落盘时间。 向 Kafka 发送数据并不是真要等数据被写入磁盘才会认为成功,而是只要数据被写入到操作系统的页缓存(Page Cache)上就可以了,随后操作系统根据 LRU 算法会定期将页缓存上的“脏”数据落盘到物理磁盘上。 这个定期就是由提交时间来确定的,默认是 5 秒。一般情况下我们会认为这个时间太频繁了,可以适当地增加提交间隔来降低物理磁盘的写操作。 如果在页缓存中的数据在写入到磁盘前机器宕机了,数据就丢失了。但鉴于 Kafka 在软件层面已经提供了多副本的冗余机制,因此这里稍微拉大提交间隔去换取性能还是一个合理的做法。

参考