目前Kafka Broker提供了近200个参数,笔者将按照大的用途进行介绍:

Broker配置存储信息

  • log.dirs:这是非常重要的参数,指定了Broker需要使用的若干个文件目录路径。这个参数没有默认值,必须亲自指定。

  • log.dir:这个参数只表示单个路径,它是补充上一个参数用的。

这两个参数怎么设置呢?很简单,只要设置log.dirs即可,不要设置log.dir。在生产环境中一定要为log.dirs配置多个路径,具体格式是一个CSV格式,多个路径以逗号分隔,如/home/Kafka1,/home/Kafka2,/home/Kafka3。如果条件允许的话保证这些目录挂载到不同的物理磁盘上。这样做(1)提升读写性能;(2)能够实现故障转移,既Failover,这是Kafka1.1引入的功能,坏掉的磁盘上的数据会被转移到其他正常磁盘,不影响Broker的正常工作。

Zookeeper相关配置

Zookeeper主要负责协调管理并保存Kafka集群的元数据信息,比如集群有哪些Broker在运行、创建了哪些Topic,每个Topic有多少分区以及这些分区的Leader副本都在哪些机器上等信息

Zookeeper.connect:这个参数配置Zookeeper的连接信息,如zk1:2181,zk2:2181,zk3:2181如果多个Kafka集群同用一套Zookeeper集群比如有两个Kafka集群分别叫Kafka1,Kafka2那么Zookeeper.connect参数可以这样指定zk1:2181,zk2:2181,zk3:2181/Kafka1zk1:2181,zk2:2181,zk3:2181/Kafka2切记集群名称只需要指定一次,而且是追加到最后。

Broker连接相关

  • listeners:学名叫监听器,指定外部连接者需要通过什么协议访问指定主机名和端口开放的Kafka服务

  • advertised.listeners:指定的监听器是Broker用于对外发布的

什么是监听器呢?从构成上说,是若干个逗号分隔的三元组,每个三元组的格式为<协议名称,主机名,端口号>。这里的协议名称可能是标准的名字,比如PLAINTEXT表示明文传输、SSL表示使用SSL或者TLS加密传输等;也可以用自己定义的协议名字,比如CONTROLLER://localhost:9092。

一旦你自己定义了协议名称,你必须指定listener.security.protocol.map参数告诉这个协议底层使用了那种安全协议,比如指定:listener.security.protocol.map=CONTROLLER:PLAINTEXT表示CONTROLLER这个自定义协议底层使用明文不加密传输数据。

Topic管理

  • auto.create.Topics.enable:是否允许自动创建Topic。

  • unclean.leader.election.enable:是否允许 Unclean Leader 选举。

  • auto.leader.rebalance.enable:是否允许定期进行 Leader 选举

下边一个一个分析,auto.create.Topics.enable最好设置成false。在线上环境里边会出现很多稀奇古怪的Topic名字,可能是由于这个参数设置成true的缘故,对于大公司而言,每个部门分配的Topic应该由运维严格把控,绝不能允许自行创建任何Topic。

第二个参数unclean.leader.election.enable是关闭Unclean Leader选举的,何谓Unclean

简单提一下,后续,Kafka相关文章中笔者会详尽的介绍。Kafka的Topic可以设置多个分区,每个分区又可以有多个副本,这些副本中有一个是Leader副本。正常情况下,保存数据比较多的副本才有资格精选Leader,如果存数据较多的副本挂了怎么办呢?还要不要进行选举了呢?此时这个参数就有用了,如果设置成false,那么就坚持之前原则,坚决不让落后太多的副本竞选Leader,这样的后果是这个分区不可用,因为没有Leader,反之如果设置成true,那么Kafka允许落后数据多的副本参选Leader,这样就可能造成数据的丢失。

第三个参数auto.leader.rebalance.enable如果设置成true则允许Kafka定期对Topic分区进行重选举,严格上说这个参数不是选Leader,是换Leader,要知道换一次Leader的代价是极其昂贵的,本质上没有任何性能收益,我建议在生产环境中把这个参数设置成false。

数据留存

  • log.retention.{hour|minutes|ms}:这是个"三兄弟",控制每条消息数据保存的时间长度。从优先级上ms>minutes>hour。

  • log.retention.bytes:这是指定Broker为消息保存的总磁盘容量大小。

  • message.max.bytes:控制Broker能够接收的最大消息。

先说第一个参数,通常情况下设置成hour级别,如log.retention.hour=168表示保存七天数据,很多公司把Kafka当作存储来使用,这个值就要调整的大一些。

log.retention.bytes这个参数的默认值是-1,表明Broker上保存多少数据都可以。

message.max.bytes这个参数的默认值是1000012,非常小,还不到1MB。实际场景中突破1MB的消息屡见不鲜,因此在线上环境设置一个比较大的值是可行的。毕竟参数仅仅是标尺而已,设置的大一点也不会耗费磁盘。

尾声

本文主要介绍了一下Kafka的Broker端的参数设置,在紧接着的下一篇文章中,笔者将继续介绍Topic级、JVM级以及操作系统级别的参数。小伙伴们敬请期待吧。