Kafka的参数配置主要分为5个部分:

  • broker端配置(包含topic级别的配置)
  • producer端配置
  • consumer端配置
  • streams端配置
  • connect端配置

本文主要关注broker端配置并且详细罗列出笔者认为重要的那些参数。另外本文针对的是Kafka0.10以后的版本。

Broker端主要参数

broker端的配置中有一些参数是所有Kafka环境都需要考虑和配置的,不论是单机环境(standalone)还是集群环境(cluster)。这些参数都是Kafka broker的基础配置,一定要明确它们的含义。

Broker端的参数需要在/config/server.properties文件中进行设置,另外若需要修改配置,则必须重启对应的Kafka broker。

下面就让我们来看看它们都是什么。

broker.id

参数含义

Kafka使用一个唯一的整数来标识每个broker,即设置broker.id。该参数默认值是0。当然你不指定也可以,Kafka会自动生成一个唯一值。总之,不管你指定什么都必须要确保该值在Kafka集群中是唯一的,不能与其他broker冲突。

推荐配置

使用从0开始的数字序列

log.dirs

参数含义

Kafka保存消息的目录,一定要配置!如果你要持久化的消息数目非常多,最好确保该目录有比较大的硬盘空间。你可以指定多个目录,以逗号分隔即可,比如/home/kafka1,/home/kafka2。这样做的好处是Kafka会力求均匀地在多个目录下存放分区(partition)数据。
倘若你的机器有N块物理硬盘(并且假设这台机器可以完全给Kafka使用),那么设置N个目录(挂载在不同磁盘下的目录)则是一个不错的选择。毕竟N个磁头可以同时执行写操作,极大地提升吞吐率。注意:这里的“均匀”是根据目录下的分区数进行比较,而不是根据实际的硬盘空间。另外值得一提的是,这个参数如果不设置,Kafka默认使用/tmp/kafka-logs,这肯定不是你想要的,对吧?

推荐配置

找一个或多个硬盘空间比较大的目录

zookeeper.connect

参数含义

个人认为是Kafka最重要的参数,没有之一! 如果说前两个参数还有默认值可以使用的话(虽然默认值极其不适合生产环境),那么这个参数则完全没有默认值,必须要配置。这个参数也可以是一个CSV(逗号分隔值)的列表,比如zk1:2181,zk2:2181,zk3:2181/kafka。注意结尾的/kafka,它是zookeeper的chroot,是可选的配置,如果不指定的话就默认使用zookeeper的根路径。

推荐配置

确保有一个可用的Zookeeper单机环境或集群环境,并配置该参数为对应的连接信息。另外最好配置chroot,可以很好地起到隔离的效果。这样zookeeper中的目录管理将更加容易。

listeners

参数含义

broker监听器CSV列表,格式是[协议]://[主机名]:[端口],[[协议]://[主机名]:[端口]]… 如果不指定主机名,则表示绑定默认的网卡,如果主机名是0.0.0.0,则表示绑定所有网卡。另外常见的协议配置包括PLAINTEXT,SSL, SASL_SSL等。关于listener方面的参数,笔者推荐只配置这一个参数就可以了,至于已经过时的两个参数:host.name和port,就不要配置了。

推荐配置

PLAINTEXT://hostname:port(未启用安全认证) SSL://hostname:port(启用安全认证)

advertised.listeners

参数含义

发布给producer和consumer使用的监听器。通常用于IaaS环境。比如云上的机器通常有多块网卡,你就可以设置这个参数来绑定公网IP供客户端使用,然后配置listeners绑定私网IP供broker间通信使用。当然不设定该参数也是可以的,但是在云上机器多出现客户端无法获取元数据的问题,这是因为listeners绑定的是默认网卡,而默认网卡通常是绑定私网IP的。

推荐配置

与listener配置一致

PLAINTEXT://hostname:port(未启用安全认证) SSL://hostname:port(启用安全认证)

unclean.leader.election.enable

参数含义

是否开启unclean leader选举,即不在同步副本集合(in-sync replicas, ISR)中的副本也能被选举为leader。默认是开启的,这样就有可能丢失数据,所以最好还是关闭它。

推荐配置

false —— 关闭unclean leader选举,其实社区最近已经在考虑把该参数的默认值调整为false

delete.topic.enable

参数含义

是否允许删除topic

推荐配置

true —— 打开的话会方便一点,毕竟可以随时删除topic

log.retention.{hours|minutes|ms}

参数含义

日志留存的时长。这是个“三兄弟”,如果同时配置,优先选取ms的配置,minutes次之,hours最后。Kafka默认保存7天的数据,也就是说7天前的数据会被删除掉。目前Kafka优先基于消息中的时间戳来进行判断,如果没有指定时间戳才会根据日志文件的最新修改时间进行比较。这是日志留存策略基于时间的一组参数。

推荐配置

根据你的业务需求设置

log.retention.bytes

参数含义

这是日志留存策略基于文件大小的参数。Kafka会定期删除那些大小超过该参数值的日志文件。默认值是-1,表示Kafka永远不会根据大小来删除日志。

推荐配置

根据你的业务需求设置

min.insync.replicas

参数含义

与producer端的参数acks配合使用。只有在acks=all(或-1)时才有意义。它指定了必须要应答写请求的最小数量的副本。如果不能被满足,producer将会抛出NotEnoughReplicas或NotEnoughReplicasAfterAppend异常。该参数用于实现更好的消息持久性。

推荐配置

如果acks设置成了all,那么该参数最佳取值区间是[1, replication.factor)。

num.network.threads

参数含义

单台Kafka broker创建的用于处理网络请求的线程数,默认值是3

推荐配置

生产环境中监控NetworkProcessorAvgIdlePercent指标,如果低于0.3,则需要调高此值。

num.io.threads

参数含义

单台Kafka broker创建的用于应答网络请求的线程数,默认值是8。

推荐配置

生产环境中监控RequestHandlerAvgIdlePercent指标,如果低于0.3,则需要调高此值。