1、broker.id

每个 broker 都需要一个整数标识符,该标识符通过 broker.id 指定。默认值为0,但可以被设置为其他任意整数。这个值在整个 Kafka 集群中必须是唯一的,并且可以在服务器节点间移动。

如果未设置,将生成一个唯一的 broker id。为了避免 ZooKeeper 生成的 broker id 和用户配置的 broker id 之间有冲突,自动生成的 broker id 为reserved.broker.max.id + 1

2、log.dirs

Kafka 把所有消息都保存在磁盘上,存放日志片段的目录是通过 log.dir 来指定的。

如果有多个目录,则可以用 log.dirs 来指定。如果没有指定这个参数,则默认使用 log.dir

log.dirs 是一组用逗号分隔的本地文件系统路径。如果指定了多条路径,那么 broker 会根据“最少使用”原则,把同一个分区的日志片段保存到同一条路径下。需要注意的是,broker 会向分区数量最少的目录新增分区,而不是向可用磁盘空间最小的目录新增分区,所以并不能保证数据会被均匀地分布在多个目录中。

如果未设置,则使用log.dir的值

3、zookeeper.connect

指定 ZooKeeper 连接地址。格式为 hostname:port,其中hostname、port与zookeeper服务对应。

可以指定多个来预防zookeeper机器崩溃,多个地址之间用英文逗号分隔,格式为hostname:port,hostname2:port2,hostname3:port3

也可以使用zookeeper chroot路径作为kafka中zookeeper连接字符串的一部分,该连接字符串将其数据存放在全局zookeeper命名空间的某个路径下。比如有chroot路径如下/chroot/path,连接地址可以写成hostname:port,hostname2:port2,hostname3:port3/chroot/path

为什么要使用 chroot 路径

使用 chroot 是一种最佳实践。可以不发生冲突的情况下将 ZooKeeper 群组共享给其他应用程序(包括其他 Kafka 集群)。

4、log.dir

日志文件存储位置。为log.dirs配置的补充

默认值为/tmp/kafka-logs

5、broker.heartbeat.interval.ms

Broker心跳间隔时间,毫秒为单位。在KRaft模式下运行时使用。

6、broker.id.generation.enable

能够自动生成broker id。

配置成允许时,应该受到reserved.broker.max.id值的限制

7、reserved.broker.max.id

可以用来作为broker.id的最大值。

int类型。默认值为1000。

8、auto.create.topics.enable

该配置用于指定 Kafka 服务是否可以自动创建topic。布尔类型。默认 true,即自动创建。

如果设置为可以自动创建,Kafka 会在如下情形中自动创建 topic:

  • 当一个生产者开始向主题写入消息时
  • 当一个消费者开始从主题读取消息时
  • 当客户端向主题发送获取元数据的请求时

很多时候,自动创建 topic 并不是期望的行为。

9、auto.leader.rebalance.enable

为了确保主题的所有权不会集中在一台 broker 上,可以将这个参数设置为 true,让主题的所有权尽可能地在集群中保持均衡。

如果启用此功能,就会有一个后台线程定期检查分区的分布情况。检查间隔时间可以通过 leader.imbalance.check.interval.seconds 来配置。

如果 leader 不均衡的所有权超出了 leader.imbalance.per.broker.percentage 指定的百分比,leader重新选举机制将触发。

10、background.threads

用于处理各种后台任务的线程数。

int类型。默认值10个线程。

11、leader.imbalance.check.interval.seconds

集群控制器触发分区重平衡的间隔时间

long类型。秒。默认值300秒

12、leader.imbalance.per.broker.percentage

每个broker允许的leader不平衡比率。如果每个broker的的不平衡比率超过了该值,则集群控制器将触发leader再平衡。

是一个百分比值

int 类型。默认值10,代表百分之十

13、advertised.listeners

如果要发送到 ZooKeeper 供客户端使用的监听器与 listeners 属性配置的监听器不同,则配置该属性。

在 IaaS 环境中,可能需要与 broker 绑定的接口不同。如果未设置此配置,将使用 listeners 的值。与 listeners 不同的是,不能使用 0.0.0.0 作为广播地址。此外,与 listeners 不同,此配置属性中可以有重复的端口,因此一个监听器可以被配置为广播另一个监听器的地址。在某些使用外部负载均衡器的情况下,这可能会很有用。

14、listeners

监听器列表。用逗号分隔的 URI 列表,包括监听的 URI 和监听器名称。

如果没有为监听器指定安全协议,则必须设置 listener.security.protocol.map 属性。

监听器名称和端口号必须是唯一的,除非一个监听器是 IPv4 地址,另一个监听器是相同端口的 IPv6 地址。

如果主机名为为 0.0.0.0,那么将绑定所有的网络接口地址。如果主机名留空,将绑定默认的网络接口地址。

监听器的格式为:<protocol>://<hostname>:<port>

合法的监听器列表示例包括:

  • PLAINTEXT://myhost:9092,SSL://:9091
  • CLIENT://0.0.0.0:9092,REPLICATION://localhost:9093
  • PLAINTEXT://127.0.0.1:9092,SSL://[::1]:9092

该配置为旧版本 kafka 使用的简单端口配置。对于简单的应用场景可以继续使用此配置,但这种方式已经被弃用了。

15、listener.security.protocol.map

该属性配置监听器名称与安全协议之间的映射。

为了在多个端口或 IP 上使用相同的安全协议,必须定义此映射。例如,即使内部和外部流量都需要使用 SSL,也可以将它们分开。具体来说,用户可以定义名称为 INTERNALEXTERNAL 的监听器,并将此属性设置为:INTERNAL:SSL,EXTERNAL:SSL

键和值用冒号分隔,映射条目用逗号分隔。每个监听器名称在映射中只能出现一次。可以通过在配置名称前添加规范化前缀(监听器名称的小写形式)为每个监听器配置不同的安全(SSL 和 SASL)设置。例如,为 INTERNAL 监听器设置不同的密钥库,可以设置名为 listener.name.internal.ssl.keystore.location 的配置。如果未设置监听器名称的配置,则配置将回退到通用配置(即 ssl.keystore.location)。请注意,在 KRaft 模式下,如果没有提供显式映射且未使用其他安全协议,则假定从 controller.listener.names 定义的监听器名称到 PLAINTEXT 的默认映射。

监听器名称取值:

  • PLAINTEXT: 表示未加密的普通文本协议,用于不需要任何加密或身份验证的通信。
  • SSL: 表示使用 SSL/TLS 加密的协议,通常用于需要加密数据传输的安全通信。
  • SASL_PLAINTEXT: 表示使用 SASL(Simple Authentication and Security Layer)身份验证的未加密协议。这种配置用于需要认证但不需要加密的情况。
  • SASL_SSL: 表示使用 SASL 进行身份验证并使用 SSL/TLS 加密的协议,这种配置用于需要认证和加密的情况。
  • INTERNAL/EXTERNAL: 这些是自定义的监听器名称,用于区分内部和外部的 Kafka 流量。对于内部流量,监听器名称可能是 INTERNAL,而对于外部流量可能是 EXTERNAL

16、inter.broker.listener.name

该属性用于配置 broker 之间通信的监听器名称。如果未设置此项,则侦听器名称由 security.inter.broker.protocol 配置。同时设置此项和 security.inter.broker.protocol 属性是错误的。

在 Kafka 集群中,broker 之间需要相互通信以复制数据、执行选举等操作。这些内部通信通常不应该暴露给外部客户端,并且可能需要使用与客户端通信不同的网络接口或安全协议。例如,你可能希望 broker 之间使用内部网络进行高速通信,而对外部客户端则使用加密的外部网络。

inter.broker.listener.name 配置允许你指定一个监听器名称,该名称在 listeners 配置中定义,用于 broker 之间的通信。这样,你就可以为内部和外部通信配置不同的监听器,并且 Kafka 会自动使用正确的监听器进行内部通信。

集群节点中配置示例如下:

1
2
listeners=INTERNAL://:9092,EXTERNAL://:9093
inter.broker.listener.name=INTERNAL

17、num.recovery.threads.per.data.dir

Kafka 使用线程池来处理日志片段。线程池被用于一下情形:

  • 当服务器正常启动时,用于打开每个分区的日志片段
  • 当服务器发生崩溃并重启时,用于检查和截断每个分区的日志片段
  • 当服务器正常关闭时,用于关闭日志片段

默认情况下,每个日志片段只使用一个线程。因为这些线程只在服务器启动和关闭时使用,所以可以多设置一些线程来实现并行操作。

特别是对包含大量分区的服务器来说,一旦发生崩溃,在从错误中恢复时可以通过并行操作省下数小时时间。

此配置的含义是,每个用于存储数据的目录需要用到几个线程。如果 log.dirs 配置指定了3个目录,此配置被设置为5,那么将有15个线程。

18、delete.topic.enable

根据应用场景和数据保留策略的不同,可能希望将集群锁定,以防止主题被随意删除。

此配置指定为 false,可以禁用主题删除功能。

相关链接

Apache Kafka

OB tags

#Kafka