29 | Kafka动态配置了解下?

文章目录

  • 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-onlyper-brokercluster-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 路径如下图所示:

29 | Kafka动态配置了解下?_第1张图片

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 范围,因此这类子节点可能存在多个。

29 | Kafka动态配置了解下?_第2张图片

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 副本的拉取。

你可能感兴趣的:(kafka,Broker,ZooKeeper,kafka-configs)