Kafka重要的集群参数

Kafka重要的集群参数

Scroll Down

15

这里主要从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就好。

如果有条件的话你最好保证这些目录挂载到不同的物理磁盘上。这样做有两个好处:

  1. 提升读写性能:比起单块磁盘,多块物理磁盘同时读写数据有更高的吞吐量。
  2. 能够实现故障转移:即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”的错误。