这里主要从4大块来总结,分别为Broker端、topic级别、JVM级别和操作系统级别。
Broker端
Broker 端参数也被称为静态参数(Static Configs)。 所谓静态参数,是指你必须在 Kafka 的配置文件 server.properties 中进行设置的参数。 不管你是新增、修改还是删除。同时,你必须重启 Broker 进程才能令它们生效。
broker端的参数可以从三方面入手了解,分别为存储相关的、topic管理相关的和数据留存相关的。
存储相关
- log.dirs:消息的存储位置。正确的设置格式为CSV格式,比如/home/kafka1,/home/kafka2,/home/kafka3。这里要注意的是还有个参数为log.dir,实际生产环境中,这个可以不用理会了,设置log.dirs就好。
如果有条件的话你最好保证这些目录挂载到不同的物理磁盘上。这样做有两个好处:
- 提升读写性能:比起单块磁盘,多块物理磁盘同时读写数据有更高的吞吐量。
- 能够实现故障转移:即Failover。 这是 Kafka 1.1 版本新引入的强大功能, 坏掉的磁盘上的数据会自动地转移到其他正常的磁盘上,而且 Broker 还能正常工作。
topic管理相关
- auto.create.topics.enable:是否允许自动创建 Topic。建议false,不要开启,不然到时候会有奇奇怪怪的名字出现。
- unclean.leader.election.enable:是否允许 Unclean Leader 选举。 这个参数说明一下,Kafka是多副本机制,只有leader副本才能对外提供服务,那么leader副本挂了之后,什么样的副本有条件竞争leader呢?明显落后太多的副本,是没有资格进行竞选的。这个参数默认false,不允许竞选。
- auto.leader.rebalance.enable:是否允许定期选举。这个建议为false,更换一次leader代价很高,原本向 A 发送请求的所有客户端都要切换成向 B 发送请求,而且这种换 Leader 本质上没有任何性能收益。
数据留存相关的
- log.retention.{hours|minutes|ms}:这是从三个层级来设置消息最大的保留时间,实际使用中hours或多点,比如log.retention.hours=168,代表7天。
- log.retention.bytes:这是指定 Broker 为消息保存的总磁盘容量大小。默认为-1表示无限制。
- message.max.bytes:控制 Broker 能够接收的最大消息大小。默认的 1000012 太少了,还不到 1MB。生产中要评估一下消息的大小,看看要不要改这个值。
Topic级别参数
topic级别参数分两个方面了解,分别为消息保存方面、消息大小方面。
消息保存方面
- retention.ms:规定了该 Topic 消息被保存的时长。默认是 7 天,即该 Topic 只保存最近 7 天的消息。一旦设置了这个值,它会覆盖掉 Broker 端的全局参数值。
- retention.bytes:规定了要为该 Topic 预留多大的磁盘空间。
消息大小方面
- max.message.bytes: 决定了 Kafka Broker 能够正常接收该 Topic 的最大消息大小。
注意区分与broker端的消息相关参数,可看作是broker端是全局参数,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
bin/kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name transaction --alter --add-config max.message.bytes=10485760
推荐坚持使用第二种。根据胡夕大神说的,以后 Kafka 社区很有可能统一使用kafka-configs脚本来调整 Topic 级别参数。
JVM参数
首先声明:Kafka从2.0.0版本开始不再支持java7了。
JVM 端配置的另一个重要参数就是垃圾回收器的设置。如果使用的java7,可以考虑一下两种:
- 如果Broker所在机器的CPU资源非常充足,建议使用CMS收集器。 -XX:+UseCurrentMarkSweepGC。
- 否则使用吞吐量收集器。开启方法: -XX:+UseParallelGC
java8默认使用 ParallelGC,java9默认使用G1收集器。G1是比较好的选择,主要体现在需要更少的Full GC,同时兼顾了低延迟和高吞吐量的特性。
Kafka设置堆大小: KAFKA_HEAP_OPTS Kafka设置GC参数: KAFKA_JVM_PERFORMANCE_OPTS
使用方式是再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。这个文件描述符系统资源没有我们想象的那么昂贵,设大点没事,设的过小会报错,比如 会经常看到“Too many open files”的错误。