社区于 1.1.0 版本中正式引入了动态 Broker 参数(Dynamic Broker Configs)。所谓动态,就是指修改参数值后,无需重启 Broker 就能立即生效,而在 server.properties 中配置的参数则称为静态参数(Static Configs)。
1.1.0 版本之后,在 Kafka 官网,Broker Configs 表中增加了 Dynamic Update Mode 列。该列有 3 类值,分别是 read-only、per-broker 和 cluster-wide。
动态 Broker 参数的使用场景非常广泛,通常包括但不限于以下几种:
当 Kafka Broker 入站流量(inbound data)激增时,会造成 Broker 端请求积压(Backlog)。通过动态参数,能够动态增加网络线程数和 I/O 线程数,快速消耗一些积压。当突发流量过去后,也能将线程数调整回来,减少对资源的浪费。整个过程都不需要重启 Broker。
Kafka 将动态 Broker 参数保存在 ZooKeeper 中,具体的 znode 路径如下图所示:
changes 是用来实时监测动态参数变更的,不会保存参数值。
topics 是用来保存 Kafka 主题级别参数的。虽然它们不属于动态 Broker 端参数,但其实它们也是能够动态变更的。
users 和 clients 则是用于动态调整客户端配额(Quota)的 znode 节点。所谓配额,是指 Kafka 运维人员限制连入集群的客户端的吞吐量或者是限定它们使用的 CPU 资源。
/config/brokers znode 才是真正保存动态 Broker 参数的地方。 该 znode 下有两大类子节点。第一类子节点就只有一个,它有个固定的名字叫 < default >,保存的是 cluster-wide 范围的动态参数;另一类则以 broker.id 为名,保存的是特定 Broker 的 per-broker 范围参数。由于是 per-broker 范围,因此这类子节点可能存在多个。
Broker 单独设置的值,会覆盖掉 cluster-wide 值。
cluster-wide、per-broker 和 static 参数的优先级是这样的:per-broker 参数 > cluster-wide 参数 > static 参数 > Kafka 默认值。
ephemeralOwner 字段的值是 0x0,表示这些 znode 都是持久化节点,它们将一直存在。
目前,设置动态参数的工具行命令只有一个,那就是 Kafka 自带的 kafka-configs 脚本。
以 unclean.leader.election.enable 参数为例,在集群层面设置全局值,即设置 cluster-wide 范围值。
如果要设置 cluster-wide 范围的动态参数,需要显式指定 --entity-default。
bin/kafka-configs.sh --bootstrap-server kafka-host:port
--entity-type brokers --entity-default --alter --add-config
unclean.leader.election.enable=true
以 unclean.leader.election.enable 参数为例,设置 per-broker 范围参数。
如果要设置 per-broker 范围的动态参数,需要显式指定 --entity-name。
bin/kafka-configs.sh --bootstrap-server kafka-host:port
--entity-type brokers --entity-name 1 --alter --add-config
unclean.leader.election.enable=false
删除 cluster-wide 范围参数或 per-broker 范围参数,分别执行下面的命令:
# 删除cluster-wide范围参数
bin/kafka-configs.sh --bootstrap-server kafka-host:port
--entity-type brokers --entity-default --alter --delete-config
unclean.leader.election.enable
# 删除per-broker范围参数
bin/kafka-configs.sh --bootstrap-server kafka-host:port
--entity-type brokers --entity-name 1 --alter --delete-config
unclean.leader.election.enable
如果想要知道动态 Broker 参数都有哪些,一种方式是在 Kafka 官网中查看 Broker 端参数列表,另一种方式是直接运行无参数的 kafka-configs 脚本。
动态 Broker 参数很多,其中有较大几率被动态调整值的参数如下: