Kafka 集群参数配置介绍
Broker 端
Broker 端参数也被称为静态参数(Static Configs),必须在 Kafka 的配置文件 server.properties 中进行设置的参数,不管是新增、修改还是删除。同时,你必须重启 Broker 进程才能令它们生效。
存储信息相关参数
-
lod.dirs
: 指定了 Broker 需要使用的若干个文件目录路径。该参数没有默认值,需要手动指定多个路径,以逗号分隔,例如:
/home/kafka1,/home/kafka2,/home/kafka3
。有条件的话,可以使这些目录挂载到不同的物理磁盘上,这样做有两个好处:
-
提升读写性能:比起单块磁盘,多块物理磁盘同时读写数据有更高的吞吐量。
-
能够实现故障转移:即 Failover。
这是 Kafka 1.1 版本新引入的强大功能。要知道在以前,只要 Kafka Broker 使用的任何一块磁盘挂掉了,整个 Broker 进程都会关闭。
从Kafka 1.1 版本开始,这种情况被修正了,出现坏盘后,Broker进程依然可以为好盘正常提供服务,一旦用户触发了reassign,Kafka支持将坏掉磁盘上的数据自动地转移到其他正常的磁盘上。
-
ZooKeeper 相关参数
ZooKeeper 是一个分布式协调框架,负责协调管理并保存 Kafka 集群的所有元数据信息,比如集群都有哪些 Broker 在运行、创建了哪些 Topic,每个 Topic 都有多少分区以及这些分区的 Leader 副本都在哪些机器上等信息。
-
zookeeper.connect
该参数没有默认值,格式:
zk1:2181,zk2:2181,zk3:2181
当多套集群共用一个 ZooKeeper 时,可以使用增加一个 “chroot” 路径,将集群中所有kafka数据存放在特定的路径下,如下格式:
-
zk1:2181,zk2:2181,zk3:2181/kafka1
-
zk1:2181,zk2:2181,zk3:2181/kafka2
-
-
listeners
:告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务。 -
advertised.listeners
:这组监听器是 Broker 用于对外发布的。一般用于双网卡主机或者 Docker 容器场景下,
advertised.listeners
配置为外网网卡,listeners
配置为内网网卡。
Topic 相关参数
-
auto.create.topics.enable
:是否允许自动创建 Topic。建议设置成 false,即不允许自动创建 Topic。
-
unclean.leader.election.enable
:是否允许 Unclean Leader 选举。建议设置成 false,即不能让那些落后太多的副本竞选 Leader。
-
auto.leader.rebalance.enable
:是否允许定期进行 Leader 选举。建议设置成 false,即不允许 Kafka 定期地对一些 Topic 分区进行 Leader 重选举。
数据存留相关参数
-
log.retention.{hours|minutes|ms}
:这是个“三兄弟”,都是控制一条消息数据被保存多长时间。从优先级上来说 ms 设置最高、minutes 次之、hours 最低。通常情况下,我们还是设置 hours 级别即可,比如,
log.retention.hours=168
表示默认保存 7 天的数据,自动删除 7 天前的数据。 -
log.retention.bytes
:这是指定 Broker 为消息保存的总磁盘容量大小。一般云上构建多租户场景,需要关注这个参数。
-
message.max.bytes
:控制 Broker 能够接收的最大消息大小。默认值 1000012 较小,建议设置为一个较大的数值。
Topic 级别参数
如果同时设置了 Topic 级别参数和全局 Broker 参数,Topic 级别参数会覆盖全局 Broker 参数的值,而每个 Topic 都能设置自己的参数值,这就是所谓的 Topic 级别参数。
Topic 级别参数有两种方式可以设置:
-
创建 Topic 时进行设置
例如,创建 Topic:
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
-
修改 Topic 时设置
例如,修改 Topic:
bin/kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name transaction --alter \ --add-config max.message.bytes=10485760
保存消息
-
retention.ms
:规定了该 Topic 消息被保存的时长。默认是 7 天,即该 Topic 只保存最近 7 天的消息。一旦设置了这个值,它会覆盖掉 Broker 端的全局参数值。
-
retention.bytes
:规定了要为该 Topic 预留多大的磁盘空间。和全局参数作用相似,这个值通常在多租户的 Kafka 集群中会有用到。当前默认值是 -1,表示可以无限使用磁盘空间。
JVM 参数
-
堆空间大小
建议将 JVM 堆大小设置成 6GB ,这是目前业界比较公认的一个合理值。默认的 1GB, 较小。
-
垃圾回收器
-
Java 7
-
如果 Broker 所在机器的 CPU 资源非常充裕,建议使用 CMS 收集器。
开启方法:指定
-XX:+UseCurrentMarkSweepG
C 即可。 -
否则,使用吞吐量收集器。
开启方法:指定
-XX:+UseParallelGC
即可。
-
-
Java 8
直接使用 G1 收集器即可。
-
具体设置堆空间和垃圾回收期的方法如下,只需要设置下面这两个环境变量即可:
-
KAFKA_HEAP_OPTS:指定堆大小。
-
KAFKA_JVM_PERFORMANCE_OPTS:指定 GC 参数。
例如,可以在启动 Kafka Broker 之前,先设置上这两个环境变量:
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 1000000
文件系统类型
这里所说的文件系统指的是如 ext3、ext4 或 XFS 这样的日志型文件系统。根据官网的测试报告,XFS 的性能要强于 ext4,所以,生产环境建议选择 XFS。
Swappiness
Swappiness 的值可以在 0 到 100 之间,0 值指示内核积极避免尽可能使用物理内存。值 100 将积极地将进程的内存移动交换空间。大多数Linux发行版的默认 swappiness 值为 60。
建议设置成一个接近 0 但不为 0 的值,比如 1,例如
-
临时修改
sysctl vm.swappiness=1
-
永久修改
在文件
/etc/sysctl.conf
中添加:vm.swappiness=1
提交时间
向 Kafka 发送数据并不是真要等数据被写入磁盘才会认为成功,而是只要数据被写入到操作系统的页缓存(Page Cache) 上就可以了,随后,操作系统根据 LRU 算法,会定期将页缓存上的“脏”数据,落盘到物理磁盘上。
这个定期就是由提交时间来确定的,默认是 5 秒。一般情况下我们会认为这个时间太频繁了,可以适当地增加提交间隔来降低物理磁盘的写操作。
配置 flushd 进程把脏页写回到磁盘的是时间间隔,单位是 10ms。
例如,配置为10s,在文件 /etc/sysctl.conf
中编辑:
vm.dirty_writeback_centisecs=1000
当然你可能会有这样的疑问:如果在页缓存中的数据在写入到磁盘前机器宕机了,那岂不是数据就丢失了。
的确,这种情况数据确实就丢失了,但鉴于 Kafka 在软件层面已经提供了多副本的冗余机制,因此这里稍微拉大提交间隔去换取性能,还是一个合理的做法。
参考: