文章目录
- Kafka 核心技术与实战
- 管理与监控
- 29 | Kafka动态配置了解下?
- 什么是动态 Broker 参数配置?
- 使用场景
- 如何保存?
- 如何配置?
Kafka 核心技术与实战
管理与监控
29 | Kafka动态配置了解下?
什么是动态 Broker 参数配置?
社区于 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。
- read-only。被标记为 read-only 的参数和原来的参数行为一样,只有重启 Broker,才能令修改生效。
- per-broker。被标记为 per-broker 的参数属于动态参数,修改它之后,只会在对应的 Broker 上生效。
- cluster-wide。被标记为 cluster-wide 的参数也属于动态参数,修改它之后,会在整个集群范围内生效,也就是说,对所有 Broker 都生效。也可以为具体的 Broker 修改 cluster-wide 参数。
使用场景
动态 Broker 参数的使用场景非常广泛,通常包括但不限于以下几种:
- 动态调整 Broker 端各种线程池大小,实时应对突发流量。
- 动态调整 Broker 端连接信息或安全配置信息。
- 动态更新 SSL Keystore 有效期。
- 动态调整 Broker 端 Compact 操作性能。
- 实时变更 JMX 指标收集器 (JMX Metrics Reporter)。
当 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 参数很多,其中有较大几率被动态调整值的参数如下:
- log.retention.ms
修改日志留存时间算是一个比较高频的操作,因为不可能完美地预估所有业务的消息留存时长。 - num.io.threads 和 num.network.threads
在实际生产环境中,Broker 端请求处理能力经常要按需扩容。如果没有动态 Broker 参数,是无法做到这一点的。 - 与 SSL 相关的参数
主要是 4 个参数(ssl.keystore.type、ssl.keystore.location、ssl.keystore.password 和 ssl.key.password)。允许动态实时调整它们之后,就能创建那些过期时间很短的 SSL 证书。每当调整时,Kafka 底层会重新配置 Socket 连接通道并更新 Keystore。新的连接会使用新的Keystore,阶段性地调整这组参数,有利于增加安全性。 - num.replica.fetchers
Follower 副本拉取速度慢,在线上 Kafka 环境中一直是一个老大难的问题。针对这个问题,常见的做法是增加该参数值,确保有充足的线程可以执行 Follower 副本向 Leader 副本的拉取。