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.bat
This tool helps to manipulate and describe entity config for a topic, client, user or broker
Option Description
------ -----------
--add-config <String> Key Value pairs of configs to add.
Square brackets can be used to group
values which contain commas: 'k1=v1,
k2=[v1,v2,v2],k3=v3'. The following
is a list of valid configurations:
For entity-type 'topics':
cleanup.policy
compression.type
delete.retention.ms
file.delete.delay.ms
flush.messages
flush.ms
follower.replication.throttled.
replicas
index.interval.bytes
leader.replication.throttled.replicas
max.compaction.lag.ms
max.message.bytes
message.downconversion.enable
message.format.version
message.timestamp.difference.max.ms
message.timestamp.type
min.cleanable.dirty.ratio
min.compaction.lag.ms
min.insync.replicas
preallocate
retention.bytes
retention.ms
segment.bytes
segment.index.bytes
segment.jitter.ms
segment.ms
unclean.leader.election.enable
For entity-type 'brokers':
advertised.listeners
background.threads
compression.type
follower.replication.throttled.rate
leader.replication.throttled.rate
listener.security.protocol.map
listeners
log.cleaner.backoff.ms
log.cleaner.dedupe.buffer.size
log.cleaner.delete.retention.ms
log.cleaner.io.buffer.load.factor
log.cleaner.io.buffer.size
log.cleaner.io.max.bytes.per.second
log.cleaner.max.compaction.lag.ms
log.cleaner.min.cleanable.ratio
log.cleaner.min.compaction.lag.ms
log.cleaner.threads
log.cleanup.policy
log.flush.interval.messages
log.flush.interval.ms
log.index.interval.bytes
log.index.size.max.bytes
log.message.downconversion.enable
log.message.timestamp.difference.max.
ms
log.message.timestamp.type
log.preallocate
log.retention.bytes
log.retention.ms
log.roll.jitter.ms
log.roll.ms
log.segment.bytes
log.segment.delete.delay.ms
max.connections
max.connections.per.ip
max.connections.per.ip.overrides
message.max.bytes
metric.reporters
min.insync.replicas
num.io.threads
num.network.threads
num.recovery.threads.per.data.dir
num.replica.fetchers
principal.builder.class
replica.alter.log.dirs.io.max.bytes.
per.second
sasl.enabled.mechanisms
sasl.jaas.config
sasl.kerberos.kinit.cmd
sasl.kerberos.min.time.before.relogin
sasl.kerberos.principal.to.local.rules
sasl.kerberos.service.name
sasl.kerberos.ticket.renew.jitter
sasl.kerberos.ticket.renew.window.
factor
sasl.login.refresh.buffer.seconds
sasl.login.refresh.min.period.seconds
sasl.login.refresh.window.factor
sasl.login.refresh.window.jitter
sasl.mechanism.inter.broker.protocol
ssl.cipher.suites
ssl.client.auth
ssl.enabled.protocols
ssl.endpoint.identification.algorithm
ssl.key.password
ssl.keymanager.algorithm
ssl.keystore.location
ssl.keystore.password
ssl.keystore.type
ssl.protocol
ssl.provider
ssl.secure.random.implementation
ssl.trustmanager.algorithm
ssl.truststore.location
ssl.truststore.password
ssl.truststore.type
unclean.leader.election.enable
For entity-type 'users':
SCRAM-SHA-256
SCRAM-SHA-512
consumer_byte_rate
producer_byte_rate
request_percentage
For entity-type 'clients':
consumer_byte_rate
producer_byte_rate
request_percentage
Entity types 'users' and 'clients' may
be specified together to update
config for clients of a specific
user.
--alter Alter the configuration for the entity.
--bootstrap-server <String: server to The Kafka server to connect to. This
connect to> is required for describing and
altering broker configs.
--command-config <String: command Property file containing configs to be
config property file> passed to Admin Client. This is used
only with --bootstrap-server option
for describing and altering broker
configs.
--delete-config <String> config keys to remove 'k1,k2'
--describe List configs for the given entity.
--entity-default Default entity name for
clients/users/brokers (applies to
corresponding entity type in command
line)
--entity-name <String> Name of entity (topic name/client
id/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 for
the zookeeper connection in the form
host:port. Multiple URLS can be
given 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 端生效,因此我说这是很实用的应用场景