https://kafka.apache.org/documentation/#dynamicbrokerconfigs
- 在 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 参数
- 优先级
- per-broker 参数 > cluster-wide 参数 > static 参数 > Kafka 默认值
原理
- Kafka 将动态 Broker 参数保存在 ZooKeeper 中
- 使用永久节点

changes是用来实时监测动态参数变更的,不会保存参数值;topics 是用来保存 Kafka 主题级别参数的- 虽然它们不属于动态 Broker 端参数,但其实它们也是能够动态变更的
users和clients则是用于动态调整客户端配额(Quota)的 znode 节点- 所谓配额,是指 Kafka 运维人员限制连入集群的客户端的吞吐量或者是限定它们使用的 CPU 资源。
/config/brokers才是真正保存动态 Broker 参数的地方。该 znode 下有两大类子节点- 第一类子节点就只有一个,它有个固定的名字叫
< default >,保存的是前面说过的cluster-wide范围的动态参数 - 另一类则以
broker.id为名,保存的是特定 Broker 的per-broker范围参数。由于是per-broker范围,因此这类子节点可能存在多个
- 第一类子节点就只有一个,它有个固定的名字叫
配置
kafka-configs脚本查看
集群层面
kafka-configs.sh --bootstrap-server kafka-host:port \--entity-type brokers --entity-default --describe
单体层面
kafka-configs.sh --bootstrap-server kafka-host:port \--entity-type brokers --entity-name <broker.id> --describe
创建
集群层面
kafka-configs.sh --bootstrap-server kafka-host:port \--entity-type brokers --entity-default \--alter --add-config unclean.leader.election.enable=true
- 如果要设置
cluster-wide范围的动态参数,需要显式指定entity-default
单体层面
kafka-configs.sh --bootstrap-server kafka-host:port \--entity-type brokers --entity-name <broker.id> \--alter --add-config unclean.leader.election.enable=false
删除
- 删除动态参数要指定
**delete-config**集群层面
kafka-configs.sh --bootstrap-server kafka-host:port \--entity-type brokers --entity-default \--alter --delete-config unclean.leader.election.enable
单体层面
kafka-configs.sh --bootstrap-server kafka-host:port \--entity-type brokers --entity-name <broker.id> \--alter --delete-config unclean.leader.election.enable
可选参数
kafka-configs.batThis tool helps to manipulate and describe entity config for a topic, client, user or brokerOption Description------ -------------add-config <String> Key Value pairs of configs to add.Square brackets can be used to groupvalues which contain commas: 'k1=v1,k2=[v1,v2,v2],k3=v3'. The followingis a list of valid configurations:For entity-type 'topics':cleanup.policycompression.typedelete.retention.msfile.delete.delay.msflush.messagesflush.msfollower.replication.throttled.replicasindex.interval.bytesleader.replication.throttled.replicasmax.compaction.lag.msmax.message.bytesmessage.downconversion.enablemessage.format.versionmessage.timestamp.difference.max.msmessage.timestamp.typemin.cleanable.dirty.ratiomin.compaction.lag.msmin.insync.replicaspreallocateretention.bytesretention.mssegment.bytessegment.index.bytessegment.jitter.mssegment.msunclean.leader.election.enableFor entity-type 'brokers':advertised.listenersbackground.threadscompression.typefollower.replication.throttled.rateleader.replication.throttled.ratelistener.security.protocol.maplistenerslog.cleaner.backoff.mslog.cleaner.dedupe.buffer.sizelog.cleaner.delete.retention.mslog.cleaner.io.buffer.load.factorlog.cleaner.io.buffer.sizelog.cleaner.io.max.bytes.per.secondlog.cleaner.max.compaction.lag.mslog.cleaner.min.cleanable.ratiolog.cleaner.min.compaction.lag.mslog.cleaner.threadslog.cleanup.policylog.flush.interval.messageslog.flush.interval.mslog.index.interval.byteslog.index.size.max.byteslog.message.downconversion.enablelog.message.timestamp.difference.max.mslog.message.timestamp.typelog.preallocatelog.retention.byteslog.retention.mslog.roll.jitter.mslog.roll.mslog.segment.byteslog.segment.delete.delay.msmax.connectionsmax.connections.per.ipmax.connections.per.ip.overridesmessage.max.bytesmetric.reportersmin.insync.replicasnum.io.threadsnum.network.threadsnum.recovery.threads.per.data.dirnum.replica.fetchersprincipal.builder.classreplica.alter.log.dirs.io.max.bytes.per.secondsasl.enabled.mechanismssasl.jaas.configsasl.kerberos.kinit.cmdsasl.kerberos.min.time.before.reloginsasl.kerberos.principal.to.local.rulessasl.kerberos.service.namesasl.kerberos.ticket.renew.jittersasl.kerberos.ticket.renew.window.factorsasl.login.refresh.buffer.secondssasl.login.refresh.min.period.secondssasl.login.refresh.window.factorsasl.login.refresh.window.jittersasl.mechanism.inter.broker.protocolssl.cipher.suitesssl.client.authssl.enabled.protocolsssl.endpoint.identification.algorithmssl.key.passwordssl.keymanager.algorithmssl.keystore.locationssl.keystore.passwordssl.keystore.typessl.protocolssl.providerssl.secure.random.implementationssl.trustmanager.algorithmssl.truststore.locationssl.truststore.passwordssl.truststore.typeunclean.leader.election.enableFor entity-type 'users':SCRAM-SHA-256SCRAM-SHA-512consumer_byte_rateproducer_byte_raterequest_percentageFor entity-type 'clients':consumer_byte_rateproducer_byte_raterequest_percentageEntity types 'users' and 'clients' maybe specified together to updateconfig for clients of a specificuser.--alter Alter the configuration for the entity.--bootstrap-server <String: server to The Kafka server to connect to. Thisconnect to> is required for describing andaltering broker configs.--command-config <String: command Property file containing configs to beconfig property file> passed to Admin Client. This is usedonly with --bootstrap-server optionfor describing and altering brokerconfigs.--delete-config <String> config keys to remove 'k1,k2'--describe List configs for the given entity.--entity-default Default entity name forclients/users/brokers (applies tocorresponding entity type in commandline)--entity-name <String> Name of entity (topic name/clientid/user principal name/broker id)--entity-type <String> Type of entity(topics/clients/users/brokers/broker-loggers)--force Suppress console prompts--help Print usage information.--version Display Kafka version.--zookeeper <String: urls> REQUIRED: The connection string forthe zookeeper connection in the formhost:port. Multiple URLS can begiven to allow fail-over.
常用的 动态参数 修改
log.retention.ms
修改日志留存时间应该算是一个比较高频的操作,毕竟,我们不可能完美地预估所有业务的消息留存时长。虽然该参数有对应的主题级别参数可以设置,但拥有在全局层面上动态变更的能力,依然是一个很好的功能亮点
num.io.threads 和 num.network.threads。
这是我们在前面提到的两组线程池。就我个人而言,我觉得这是动态 Broker 参数最实用的场景了。毕竟,在实际生产环境中,Broker 端请求处理能力经常要按需扩容。如果没有动态 Broker 参数,我们是无法做到这一点的
与 SSL 相关的参数
主要是 4 个参数(ssl.keystore.type、ssl.keystore.location、ssl.keystore.password 和 ssl.key.password)。允许动态实时调整它们之后,我们就能创建那些过期时间很短的 SSL 证书。每当我们调整时,Kafka 底层会重新配置 Socket 连接通道并更新 Keystore。新的连接会使用新的 Keystore,阶段性地调整这组参数,有利于增加安全性
num.replica.fetchers
这也是我认为的最实用的动态 Broker 参数之一。Follower 副本拉取速度慢,在线上 Kafka 环境中一直是一个老大难的问题。针对这个问题,常见的做法是增加该参数值,确保有充足的线程可以执行 Follower 副本向 Leader 副本的拉取。现在有了动态参数,你不需要再重启 Broker,就能立即在 Follower 端生效,因此我说这是很实用的应用场景
