配置参数说明

Broker端参数

目前Kafka Broker提供了近200个参数,这其中绝大部分参数都不需要修改。当谈及这些参数的用法时,这里列举一些比较重要的配置说下进行说明

log.dirs

Kafka消息日志的存储目录,可以配置多个目录。

  • log.dirs支持配置多个目录,用于存储不同topic的消息日志文件。

  • 配置多个log.dirs目录可以实现对数据的冗余备份。

  • 不同的topic可以配置到不同的log.dirs目录,实现负载隔离。

  • 每个日志目录下数据以segment文件形式存储,文件名形如:topic名-分区号.log。

  • Cleaner线程会在这些目录下定期清理过期或过大的日志段。

  • 多个log.dirs之间不会同步数据,只是冗余备份。

  • 新增目录时,不会主动将数据移动到新目录。

  • 如果所有log.dirs目录都失效了,Kafka将无法启动

listeners

Kafka中listeners参数用于配置Kafka broker的监听网络端口,其实就是告诉外部连接者要通过什么协议访问指定主机名和端口开放的Kafka服务。格式为:

listeners=protocol://host_name:port

listeners支持配置多个地址,使用逗号分隔。

listeners参数的主要作用:

  • 配置broker的对外服务网络地址和端口。

  • 支持配置多个listener,进行多地址监听。

  • 不同地址可以使用不同协议(PLAINTEXT、SSL等)。

  • 便于客户端连接,advertised.listeners参数将配置广播给客户端。

配置示例:

1、单个端口:

listeners=PLAINTEXT://broker1:9092

2、多个端口

listeners=PLAINTEXT://broker1:9092,SSL://broker1:9093

3、不同协议

listeners=PLAINTEXT://broker1:9092,SSL://broker1:9093,SASL_SSL://broker1:9094

通过listeners参数可以配置Kafka Broker的服务端点信息,实现安全、扩展等目的。

advertised.listeners

Kafka中的advertised.listeners配置参数主要用于配置Kafka broker向客户端公布的监听地址信息。其用法和作用如下:

  • 格式为:advertised.listeners=protocol://host:port

  • 当设置了listeners参数配置多个监听端口时,需要设置advertised.listeners将Broker的监听信息公布给客户端。

  • 客户端将使用advertised.listeners公布的信息连接到Broker。

  • 可指定advertised.listeners为内外网地址,用于跨网络访问。

配置示例:

  1. 公布一个监听地址

    advertised.listeners=PLAINTEXT://broker1:9092

  2. 公布内外网地址

    advertised.listeners=PLAINTEXT://broker1_ext:9092,PLAINTEXT://broker1_int:9093

  3. 公布HTTPS地址

    advertised.listeners=HTTPS://broker1:9094

auto.create.topics.enable

auto.create.topics.enable参数用于控制Kafka broker是否可以自动创建不存在的topic。

默认情况下,该参数的值为true,也就是说当producer开始向一个未知的topic发送消息时,broker端会自动帮助创建这个topic。这为用户提供了便利。

但是在一些安全性要求较高的场景下,可能需要禁用这个自动创建topic的功能。比如想精细控制topic的数量,预设partition数等。若自动创建可能导致用户随意产生大量topic,带来维护管理上的困难。

unclean.leader.election.enable

Kafka中的unclean.leader.election.enable参数用于控制在不可用分区数达到设定限制之前,是否允许非ISR成员作为分区leader。这关系到Kafka在极端条件下的可用性。

该参数的详细说明如下:

  • 默认值为true,允许非ISR成员临时作为leader,保证服务可用性。

  • ISR(in-sync replicas)是同步的副本集合,是可用的和同步了数据的副本列表。

  • 当ISR所有的副本都不可用时,若此参数为true,则会从其他非ISR副本中选举一个作为leader。

  • 如果此参数设置为false,则要求leader必须是ISR成员,提高数据一致性。但整个ISR不可用时服务不可用。

  • 此参数需要根据对可用性和一致性的要求进行调整。通常在非关键业务系统中放宽限制。

建议unclean.leader.election.enable参数允许在极端情况下进行风险选举,以保证Kafka服务的可用性。需要根据业务需要谨慎设置。

auto.leader .rebalance.enable

auto.leader.rebalance.enable参数用于控制 Kafka 在做Preferred Leader Election时是否启用自动Leader Rebalance。

Preferred Leader Election(PLE) 会在某些节点失效时,自动从ISR中选举一个最优的Leader副本,参数的作用是:

  • 该参数的默认值为true,表示启用Leader Rebalance。

  • 当一个副本失效,PLE会从ISR中选择一个最合适的副本作为新的Leader。

  • 如果该参数设置为false,则只会触发Leader Election,不做Rebalance。

  • 启用自动Rebalance可以在节点失效时优化Leader分配,提高Broker负载均衡。

  • 但也会在短时间内引起Broker上的Leader动态迁移。

通常在大多数情况下,推荐启用自动Leader Rebalance。但如果对稳定性要求极高,可以禁用该功能。

需要根据实际情况选择启用或禁用auto.leader.rebalance.enable。

log.retention.{hour|minutes|ms}

log.retention系列参数用于控制消息日志文件的最大保留时间,主要有以下三个:

log.retention.hours

  • 用于设置消息日志的最大保留时间,单位是小时。

  • 默认为168,即7天。

  • 这是最常用的日志保留时间设置参数。

log.retention.minutes

  • 用于设置消息日志的最大保留时间,单位是分钟。

  • 与 log.retention.hours 参数互斥,只能设置一个。

  • 如果两个参数都设置了,则以本参数为准。

log.retention.ms

  • 用于设置消息日志的最大保留时间,单位是毫秒。

  • 主要用于执行精确和频繁的日志清理。

  • 一般很少单独使用,而是配合其他两个参数使用。

log.retention.bytes

这是指定Broker为消息保存的总磁盘容量大小。

message.max.bytes

message.max.bytes 是非常重要的一个参数,它决定了producer能够发送的最大消息大小, 具体作用如下:

  • 它定义了producer发送的消息的最大值(以字节为单位)。

  • producer发送的每条消息的大小不能超过这个配置的值。

  • 默认值为1000012(约1MB)。

  • 需要根据发送消息的实际大小进行合理配置。

  • 如果消息可能大于1MB,则需要显式调大该参数的值。

  • 若消息超过了该大小,会被broker拒绝。

  • 该限制是为了避免过大消息导致内存溢出等问题。

  • 也可以防止恶意生产者发送极大消息造成网络拥塞。

Topic参数

retention.ms

retention.ms参数用于控制消息日志文件的保留时间,它的主要作用是:

  • retention.ms用来指定消息日志文件的最长保留时间,单位是毫秒。

  • 该参数的默认值为604800000,即7天。

  • 这个参数的作用是告诉Kafka需要删除早于当前时间减去retention.ms的日志数据。

  • 这个参数可以确保Kafka不会保存超过指定时间的旧数据。

  • 通常情况下,我们会使用更常见的log.retention.hours参数来指定小时级别的保留时间。

  • retention.ms则经常用来作为日志保留时间的微调参数。

  • 将其设置为一个小时或一天的毫秒值,可以进行更细粒度的日志保留时间控制。

retention.bytes

参数用于基于数据大小来控制日志段文件的数据保留时间。其主要作用如下:

  • retention.bytes 用来指定日志段文件达到指定数据大小时,会被删除或关闭。

  • 默认情况下该参数是 -1,即不启用基于数据大小的日志回收。

  • 这通常与基于时间的日志回收参数 log.retention.hours 配合使用。

  • 当日志段文件的大小达到 retention.bytes 指定的大小时,即使还没达到时间阈值,也会被回收删除或关闭。

  • 这样可以避免单个日志段文件过大时磁盘空间耗尽的问题。

  • 一般设置为与 segment 文件大小 log.segment.bytes 相等或其百分比。

  • 需要合理配置该值,既要防止文件过大,也不能导致过于频繁地文件关闭。