kafka集群参数配置

Broker端参数

Broker配置存储信息的

  • log.dirs:指定了Broker需要使用的若干个文件目录路径(无默认值,需要你指定)
  • log.dir:指定单个路径,补充dirs的
线上生产环境只要设置log.dirs,并且设置多个路径。具体格式为CSV格式(多个逗号分隔),且最好挂载到不同的物理磁盘,好处是多块磁盘能提升吞吐量;能实现故障转移(kafka1.1后实现)
  • listeners:监听器。指定该用哪种协议访问指定主机名和端口开放的Kafka服务。

监听器从构成上来说,它是若干个逗号分隔的三元组,每个三元组的格式为<协议名称,主机名,端口号>。这里的协议名称可能是标准的名字,比如PLAINTEXT表示明文传输、SSL表示使用SSL或TLS加密传输等;也可能是你自己定义的协议名字,比如CONTROLLER: //localhost:9092。假如自定义了协议名称,必须还要指定listener.security.protocol.map参数告诉这个协议底层使用了哪种安全协议,比如指定listener.security.protocol.map=CONTROLLER:PLAINTEXT表示CONTROLLER这个自定义协议底层使用明文不加密传输数据。

此外主机名不要用IP最好全部使用主机名,即Broker端和Client端应用配置中全部填写主机名。 Broker源代码中也使用的是主机名,如果在某些地方使用了IP地址进行连接,可能会发生无法连接的问题。

  • auto.create.topics.enable:是否允许自动创建Topic。(最好设置成false,即不允许自动创建Topic)
  • unclean.leader.election.enable:是否允许Unclean Leader选举,副本是否有资格竞争Leader(建议设置false但可以酌情考虑)

设置成false,即不让落后太多的副本竞选Leader,没有Leader,分区不可用

设置成true,即可能让落后太多的副本竞选Leader,有Leader,副本数据不全可能造成数据丢失

  • auto.leader.rebalance.enable:是否允许定期进行Leader选举。(设置成false)
与上一个不同,它不是选Leader,而是换Leader(可能发生在原Leader正常的情况下)。换Leader代价很大,原本向A发送请求的所有客户端都要切换成向B发送请求,而且这种换Leader本质上没有任何性能收益
  • log.retention.{hours|minutes|ms}:这是个“三兄弟”,都是控制一条消息数据被保存多长时间。从优先级上来说ms设置最高、minutes次之、hours最低。
  • log.retention.bytes:这是指定Broker为消息保存的总磁盘容量大小。(这个值默认是-1,表明你想在这台Broker上保存多少数据都可以)
  • message.max.bytes:控制Broker能够接收的最大消息大小。默认的1000012太少了,还不到1MB(可酌情调大)

Topic级别参数

如果同时设置了Topic级别参数和全局Broker参数,Topic级别参数会覆盖全局Broker参数的值,而每个Topic都能设置自己的参数值,这就是所谓的Topic级别参数。

  • retention.ms:规定了该Topic消息被保存的时长。默认是7天,即该Topic只保存最近7天的消息。一旦设置了这个值,它会覆盖掉Broker端的全局参数值。
  • retention.bytes:规定了要为该Topic预留多大的磁盘空间。和全局参数作用相似,这个值通常在多租户的Kafka集群中会有用武之地。当前默认值是-1,表示可以无限使用磁盘空间。

JVM参数

Kafka服务器端代码是用Scala语言编写的,但终归还是编译成Class文件在JVM上运行。

  • 最好使用Java8及以上,选择G1垃圾回收器
  • KAFKA_HEAP_OPTS:指定堆大小
  • KAFKA_JVM_PERFORMANCE_OPTS:指定GC参数

操作系统

  • 文件描述符限制(ulimit -n)设置大点
  • 文件系统类型(最好使用XFS)
  • Swappiness(设置成一个比较小的值,至少能够观测到Broker性能开始出现急剧下降,从而给进一步调优和诊断问题的时间)
  • 提交时间(默认是5秒)可以适当地增加提交间隔来降低物理磁盘的写操作