ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Kafka Broker 配置详解:必要配置、动态更新与源码级实践指南

Kafka Broker 配置详解:必要配置、动态更新与源码级实践指南 Kafka Broker 配置详解必要配置、动态更新与源码级实践指南【免费下载链接】KafkaApache Kafka - A distributed event streaming platform项目地址: https://gitcode.com/GitHub_Trending/kafka4/kafka本指南基于 Apache Kafka 官方文档 broker-configs.md系统讲解 broker 的核心必要配置node.id、log.dirs、process.roles等、三类动态更新模式read-only/per-broker/cluster-wide以及使用kafka-configs.sh在线修改 SSL 密钥库、默认主题配置、日志清理器、线程池与连接配额的方法。读完本文你将掌握从静态server.properties配置到零停机动态调优的完整 broker 运维能力并理解其底层实现原理。一、Broker 的必要配置Essential Configurations在新版本 KafkaKRaft 模式中以下 5 个配置项是 broker 启动所必需的配置项作用node.id当前节点的唯一标识替代旧版broker.id必须是非负整数log.dirs存储日志文件的目录列表可逗号分隔多个目录process.roles节点的角色取值为broker、controller或其组合设置后即进入 KRaft 模式controller.quorum.bootstrap.servers用于连接控制器集群KRaft quorum的端点列表controller.listener.names控制器使用的 listener 名称列表KRaft 模式下必填仓库中的两个参考配置文件可以直观说明这些必要配置的实际形态config/server.properties组合节点同时承担 broker 与 controller 角色process.rolesbroker,controller node.id1 controller.quorum.bootstrap.serverslocalhost:9093 listenersPLAINTEXT://:9092,CONTROLLER://:9093 inter.broker.listener.namePLAINTEXT advertised.listenersPLAINTEXT://localhost:9092,CONTROLLER://localhost:9093 controller.listener.namesCONTROLLER log.dirs/tmp/kraft-combined-logsconfig/broker.properties纯 broker 节点controller 由独立集群承担process.rolesbroker node.id2 controller.quorum.bootstrap.serverslocalhost:9093 listenersPLAINTEXT://localhost:9092 inter.broker.listener.namePLAINTEXT advertised.listenersPLAINTEXT://localhost:9092 controller.listener.namesCONTROLLER log.dirs/tmp/kraft-broker-logs从源码看必要配置的定义这些必要配置的底层定义位于 KRaft 配置类 raft/src/main/java/org/apache/kafka/raft/KRaftConfigs.java可以看到process.roles定义为LIST类型、无默认值仅允许取值broker、controller且不允许组合重复node.id定义为INT类型、无默认值要求 0controller.listener.names定义为LIST类型、无默认值要求取值为非空且不重复。这意味着三个配置一旦缺失broker 将直接拒绝启动ConfigException而不是回退到某个默认值——这正是它们被列为必要配置的根本原因。而broker.id已被标记为弃用在 core/src/main/scala/kafka/server/KafkaConfig.scala 的fromProps方法中若检测到broker.id会打印警告提示它将在 Apache Kafka 5.0 中移除请改用node.id。二、完整 Broker 配置的权威来源所有 broker 配置项及其默认值的完整参考由 Scala 类kafka.server.KafkaConfig生成。该类位于 core/src/main/scala/kafka/server/KafkaConfig.scala其main方法会将AbstractKafkaConfig.CONFIG_DEF中的全部配置项连同动态更新模式渲染成 HTML 文档brokerconfigs_config锚点并叠加 broker 配额等动态配置供官方文档内嵌展示。从源码结构看KafkaConfig继承自org.apache.kafka.server.config.AbstractKafkaConfig并维护了一个volatile currentConfig引用与DynamicBrokerConfig实例这为后续要讲的动态配置热更新提供了基础设施——新配置到达后通过updateCurrentConfig原子替换当前配置快照而无需重启进程。三、Broker 配置的动态更新模式从 Kafka 1.1 版本起部分 broker 配置可以不重启 broker 而直接在线更新。每一类配置都有明确的更新模式见官方 Broker Configs 文档中的 Dynamic Update Mode 列read-only必须重启 broker 才能生效不可动态更新per-broker可以对单个 broker动态更新主要用于针对性测试cluster-wide可以作为集群级默认值动态更新也可在测试场景下按 per-broker 值更新。动态更新能力的分类实现在 server/src/main/java/org/apache/kafka/server/config/DynamicBrokerConfig.java 中其dynamicConfigUpdateModes()方法将ALL_DYNAMIC_CONFIGS集合中的每个配置名映射为per-broker或cluster-wide同时nonDynamicConfigs()会筛出只读配置validateConfigs()会对非法动态更新例如把只读配置当作动态配置提交、安全配置未加 listener 前缀抛出ConfigException拒绝。动态配置的四个层级与优先级一个配置若在多个层级同时定义生效优先级从高到低为Dynamic per-broker 配置存储在 metadata log 中Dynamic cluster-wide 默认配置存储在 metadata log 中静态 broker 配置来自server.propertiesKafka 内置默认值见 Broker Configs 表也就是说动态配置优先级最高静态文件最低Kafka 默认值垫底。四、使用 kafka-configs.sh 管理动态配置kafka-configs.sh是操作动态配置的官方命令行工具入口脚本 bin/kafka-configs.sh最终调用org.apache.kafka.tools.ConfigCommand。以下示例均以 broker id 0、bootstrap 地址localhost:9092为例。1. 为单个 broker 添加配置per-broker将 broker 0 的日志清理线程数改为 2$ bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type brokers --entity-name 0 --alter --add-config log.cleaner.threads22. 查看单个 broker 的当前动态配置$ bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type brokers --entity-name 0 --describe3. 删除某个配置覆盖删除 broker 0 的log.cleaner.threads覆盖使其回退到静态配置或默认值$ bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type brokers --entity-name 0 --alter --delete-config log.cleaner.threads4. 动态调整 broker 上的日志级别将 broker 0 上指定 logger此处为ClientQuotaManager$ThrottledChannelReaper的日志级别改为 DEBUG$ bin/kafka-configs.sh --bootstrap-server localhost:9092 --broker-logger 0 --add-config org.apache.kafka.server.quota.ClientQuotaManager\$ThrottledChannelReaperDEBUG --alter注意$需要转义为\$避免被 shell 解释为变量。5. 设置集群级默认配置cluster-wide某些配置可以设置为集群级默认值让整个集群的 broker 保持一致所有 broker 都会处理该默认值更新。例如在所有 broker 上将日志清理线程数设为 2$ bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type brokers --entity-default --alter --add-config log.cleaner.threads26. 查看当前集群级默认配置$ bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type brokers --entity-default --describe所有可在集群级配置的项也都可以按 per-broker 配置例如用于测试。注意DynamicBrokerConfig.validateConfigs()会拒绝把只能 per-broker 更新的配置如 listener 安全配置提交到--entity-default层级并提示broker id must be specified。五、动态更新已有 Listener 的 SSL Keystore生产环境中broker 常配置较短有效期的 SSL keystore 以降低证书泄露风险。Kafka 支持不重启 broker地动态更新 keystore配置名必须以 listener 前缀listener.name.{listenerName}.开头确保只更新指定 listener 的 keystore。以下配置可以在一次 alter 请求中按 per-broker 级别更新ssl.keystore.typessl.keystore.locationssl.keystore.passwordssl.key.password关键约束来自官方文档语义若该 listener 是inter-broker listener只有当新 keystore 被该 listener 配置的 truststore 信任时更新才被允许对于其他 listenerbroker 不会对 keystore 做信任校验证书必须由与旧证书相同的 CA签发避免客户端认证失败。六、动态更新已有 Listener 的 SSL Truststorebroker 的 truststore 同样可以不重启地动态更新用于添加或移除证书。更新后的 truststore 会用于新建立的客户端连接的认证。配置名同样必须以listener.name.{listenerName}.前缀限定目标 listener以下配置可在一次 alter 请求中按 per-broker 级别更新ssl.truststore.typessl.truststore.locationssl.truststore.password关键约束若该 listener 是inter-broker listener只有当该 listener 现有的 keystore 被新 truststore信任时更新才被允许对于其他 listenerbroker 在更新前不做信任校验若从新 truststore 中移除了用于签发客户端证书的 CA 证书会导致客户端认证失败——请谨慎操作。从源码看SSL 相关的 keystore/truststore 配置全部位于DynamicListenerConfig.RECONFIGURABLE_CONFIGS集合见 DynamicBrokerConfig.java并被归入PER_BROKER_CONFIGS同时securityConfigsWithoutListenerPrefix()强制要求这些安全配置必须携带 listener 前缀才能动态更新否则直接报错。七、动态更新默认 Topic 配置broker 使用的默认主题配置可以不用重启就完成更新。这些配置只作用于没有对应 topic 级覆盖的主题可以按 cluster-wide 默认级别更新、作用于所有 broker。可更新的配置包括类别配置项日志分段log.segment.bytes滚动策略log.roll.ms、log.roll.hours、log.roll.jitter.ms、log.roll.jitter.hours索引log.index.size.max.bytes、log.index.interval.bytes刷盘log.flush.interval.messages、log.flush.interval.ms保留策略log.retention.bytes、log.retention.ms、log.retention.minutes、log.retention.hours清理器log.cleaner.delete.retention.ms、log.cleaner.min.compaction.lag.ms、log.cleaner.max.compaction.lag.ms、log.cleaner.min.cleanable.ratio清理策略log.cleanup.policy、log.segment.delete.delay.ms可用性unclean.leader.election.enable、min.insync.replicas消息与压缩max.message.bytes、compression.type其他log.preallocate、log.message.timestamp.type从源码结构看这一组配置在 DynamicBrokerConfig.java 的DynamicLogConfig.RECONFIGURABLE_CONFIGS中登记其来源是ServerTopicConfigSynonyms.TOPIC_CONFIG_SYNONYMS——即 broker 级配置名与 topic 级配置名的同义映射表从而保证broker 默认值与topic 覆盖两套体系无缝衔接。八、动态更新 Log Cleaner 配置Log cleaner日志清理器相关配置可以按cluster-wide 默认级别动态更新、作用于所有 broker改动将在下一轮日志清理迭代时生效。可同时更新一个或多个以下配置log.cleaner.threadslog.cleaner.io.max.bytes.per.secondlog.cleaner.dedupe.buffer.sizelog.cleaner.io.buffer.sizelog.cleaner.io.buffer.load.factorlog.cleaner.backoff.ms九、动态更新线程池配置broker 使用的多个线程池大小可以按cluster-wide 默认级别动态更新。为了保证更新被优雅处理更新值被限制在当前值的1/2到2 倍范围内即currentSize / 2到currentSize * 2。可更新的配置包括num.network.threadsnum.io.threadsnum.replica.fetchersnum.recovery.threads.per.data.dirlog.cleaner.threadsbackground.threadsremote.log.reader.threadsremote.log.manager.copier.thread.pool.sizeremote.log.manager.expiration.thread.pool.sizeremote.log.manager.follower.thread.pool.size该范围限制在源码中有精确实现server/src/main/java/org/apache/kafka/server/DynamicThreadPool.java 的validateReconfiguration()方法会逐一校验新值必须 1新值不能小于当前值的一半newValue oldValue / 2则抛ConfigException新值不能大于当前值的两倍newValue oldValue * 2则抛ConfigException。其中num.io.threads、num.replica.fetchers、num.recovery.threads.per.data.dir、background.threads登记在DynamicThreadPool.RECONFIGURABLE_CONFIGSnum.network.threads则在DynamicListenerConfig.RECONFIGURABLE_CONFIGS中且三者num.network.threads、max.connections、max.connection.creation.rate被标记为CLUSTER_LEVEL_LISTENER_CONFIGS即只能按集群级默认值更新。十、动态更新连接配额Connection Quotabroker 对某个 IP/主机允许的最大连接数可以按cluster-wide 默认级别动态更新新限制对新建连接立即生效且已有连接数会计入新配额。可更新的配置max.connections.per.ipmax.connections.per.ip.overrides十一、动态添加与移除 ListenerListener 可以在线添加或移除无需重启新增 listener 时其安全配置必须以listener.name.{listenerName}.前缀作为 listener 配置提供若新 listener 使用 SASL必须通过带 listener 与机制前缀的 JAAS 配置属性sasl.jaas.config提供 JAAS 配置详见 Kafka broker 的 JAAS 配置文档除新 listener 的全部安全配置外以下配置可按per-broker 级别动态更新listenersadvertised.listenerslistener.security.protocol.map兼容性注意点针对 1.1.x 版本的约束在 Kafka 1.1.x 中inter-broker listener 使用的 listener 不能动态更新要更换 inter-broker listener可以先在所有 broker 上不重启地添加新 listener然后通过滚动重启来更新inter.broker.listener.nameinter-broker listener 必须始终通过静态 broker 配置inter.broker.listener.name或security.inter.broker.protocol来指定不能动态修改。十二、实践要点总结先静态、后动态node.id、process.roles、controller.quorum.bootstrap.servers、controller.listener.names、inter.broker.listener.name等属于只读/启动级配置必须写在server.properties中可在线调整的配置优先使用kafka-configs.sh完成。明确更新层级per-broker 只影响单节点cluster-wide 影响整个集群配置生效优先级为「动态 per-broker 动态 cluster-wide 默认 静态文件 Kafka 默认值」。注意安全校验SSL keystore/truststore 更新必须带 listener 前缀inter-broker listener 的更新受信任关系校验约束线程池更新必须落在[current/2, current*2]区间内越界将被源码层的ConfigException拒绝。借助工具验证修改后使用bin/kafka-configs.sh --bootstrap-server addr --entity-type brokers --entity-name id --describe复查当前动态配置使用--entity-default --describe复查集群级默认值。深入源码完整配置表由 core/src/main/scala/kafka/server/KafkaConfig.scala 生成动态更新的分类、校验与优先级实现在 DynamicBrokerConfig.java 与 DynamicThreadPool.javaKRaft 必要配置的定义在 KRaftConfigs.java。【免费下载链接】KafkaApache Kafka - A distributed event streaming platform项目地址: https://gitcode.com/GitHub_Trending/kafka4/kafka创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表