Kafka Broker 配置
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,也可以将它们分开。具体来说,用户可以定义名称为 INTERNAL
和 EXTERNAL
的监听器,并将此属性设置为: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 | listeners=INTERNAL://:9092,EXTERNAL://:9093 |
17、num.recovery.threads.per.data.dir
Kafka 使用线程池来处理日志片段。线程池被用于一下情形:
- 当服务器正常启动时,用于打开每个分区的日志片段
- 当服务器发生崩溃并重启时,用于检查和截断每个分区的日志片段
- 当服务器正常关闭时,用于关闭日志片段
默认情况下,每个日志片段只使用一个线程。因为这些线程只在服务器启动和关闭时使用,所以可以多设置一些线程来实现并行操作。
特别是对包含大量分区的服务器来说,一旦发生崩溃,在从错误中恢复时可以通过并行操作省下数小时时间。
此配置的含义是,每个用于存储数据的目录需要用到几个线程。如果 log.dirs
配置指定了3个目录,此配置被设置为5,那么将有15个线程。
18、delete.topic.enable
根据应用场景和数据保留策略的不同,可能希望将集群锁定,以防止主题被随意删除。
此配置指定为 false,可以禁用主题删除功能。
相关链接
OB links
OB tags
#Kafka