ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Apache Kafka Eligible Leader Replicas(ELR)完整指南:原理、选举机制、升级配置与运维工具

Apache Kafka Eligible Leader Replicas(ELR)完整指南:原理、选举机制、升级配置与运维工具 Apache Kafka Eligible Leader ReplicasELR完整指南原理、选举机制、升级配置与运维工具【免费下载链接】KafkaApache Kafka - A distributed event streaming platform项目地址: https://gitcode.com/GitHub_Trending/kafka4/kafka导读Eligible Leader ReplicasELR合格领导者副本是 Apache Kafka 4.0 起引入、用于改进复制可用性的新机制对应 KIP-966 Part 1在“严格 min ISR”规则下分区高水位只有在 ISR 规模不小于min.insync.replicas时才能推进而 ELR 让那些虽然不在 ISR 中、但数据足够新的副本也能在需要时安全地成为 Leader从而显著提升副本故障时的可用性。本文以仓库 docs/operations/eligible-leader-replicas.md 为骨架结合 KRaft 控制器源码完整讲解 ELR 的选主优先级、特性版本开关、升级/降级路径、启用后的min.insync.replicas迁移规则以及如何通过DescribeTopicPartitionsAPI 与kafka-topics.sh查看 ELR 信息读完即可在生产集群中安全启用并运维该特性。ELR 出现的背景严格 min ISR 带来的可用性痛点在传统 Kafka 复制模型中ISRIn-Sync Replicas同步副本是 Leader 选举的唯一“合格来源”分区的高水位High Watermark只有在 ISR 规模不小于min.insync.replicasmin.insync.replicas默认值为 1时才能推进。这条“严格 min ISR”规则保证了生产端在acksall下写入的数据至少被 min ISR 个副本确认但其副作用是当某个副本落后被剔出 ISR 后即使它后续追平了数据也必须先重新进入 ISR 才能参与选主而当 ISR 收缩到小于 min ISR 时分区甚至进入“无 Leader 可同步推进”的受限状态。ELR 的解决思路很直接把那些“不在 ISR 中但按规则已知其数据与 Leader 差距可控、可以安全接管”的副本单独记录下来形成一份候选名单。KRaft 控制器将这些副本 ID 持久化在元数据PartitionRecord的新字段Eligible Leader Replicas以及配套的LastKnownElr用于记录最后已知 Leader中。从源码可以看到分区注册数据 PartitionRegistration.java 直接维护了elr与lastKnownElr两个数组字段并在PartitionChangeRecord变更时随之更新说明 ELR 是随分区元数据一起在 KRaft 日志中持久化、随快照复制到全集群的状态。Leader 选举优先级ISR → ELR → 最后已知 Leader开启 ELR 后控制器在发生 Leader 选举时会按下述顺序挑选新 Leader这也是原文档给出的核心结论若 ISR 非空从 ISR 中选一个副本若 ISR 为空而 ELR 非空从 ELR 中选一个未处于 fenced被隔离/下线状态的副本否则选择“最后已知 Leader”Last Known Leader前提是它未被 fenced——这与 4.0 之前所有副本都离线时的行为类似。这一逻辑在 PartitionChangeBuilder.java 的选举实现中可以得到印证electLeader()见 L228-L251依次尝试首选副本preferred replica→ 当前 Leader → 按顺序遍历的在线副本每一步都用isValidNewLeader()校验isValidNewLeader()见 L318-L322的注释与实现明确指出“合法的候选新 Leader 要么在 ISR 中要么当 ISR 为空时在 ELR 中”当 ISR 与 ELR 都为空时canElectLastKnownLeader()见 L286-L316会检查lastKnownElr中恰好记录了一个、且仍然存活的副本将其作为最后手段选出。当选出的 Leader 来自 ELR 时tryElection()见 L324-L356会打印一条Setting new leader for topicId ... to ... using ELR的 INFO 日志并把该副本从 ELR 提升进新的 ISR同时从 ELR 中剔除便于后续追平数据。ELR 的维护时机什么时候写入、什么时候清空ELR 并不是一个静态名单而是随 ISR、副本存活状态动态维护的相关逻辑集中在PartitionChangeBuilder中写入/更新maybePopulateTargetElr()见 L532-L563当目标 ISR 规模小于min ISR 时把“当前 ISR 与当前 ELR 的并集”过滤掉目标 ISR 成员与发生过不洁关闭unclean shutdown的副本得到新的 ELR同时把那些既不在 ELR 也不在当前 ISR 的历史成员记入lastKnownElr以降低元数据体积清空maybeUpdateRecordElr()见 L502-L530当发生不洁选举unclean election或 ELR 特性被禁用时ELR 与 lastKnownElr 字段会被置空ISR 恢复健康时只要目标 ISR 规模不小于 min ISRmaybePopulateTargetElr就会直接清空 ELR 与 LastKnownElr见 L535-L540避免无谓地保留候选人名单。另外ReplicationControlManager在处理 Broker 下线/上线、分区副本变更generateLeaderAndIsrUpdates见 metadata/src/main/java/org/apache/kafka/controller/ReplicationControlManager.java#L2075-L2139时也会同步把被移除的 Broker 从 ISR 和 ELR 中一并剔除并保证 ISR 与 ELR 之间没有重叠成员。特性开关与升级 / 降级ELR 通过 Kafka 的动态特性版本Feature Version机制进行开关特性名为eligible.leader.replicas.version其定义位于 EligibleLeaderReplicasVersion.java版本含义依赖的 Metadata Version0ELRV_0禁用 ELR任意最低版本MINIMUM_VERSION1ELRV_1启用 ELRKIP-966要求 metadata version ≥IBP_4_0_IV1源码中还规定了两个关键事实4.0 默认不启用ELRV_1 的bootstrapMetadataVersion是IBP_4_1_IV0且当前仓库中LATEST_PRODUCTION就是 ELRV_14.1 起新建集群默认启用由于新集群以 4.1 及以上的 metadata version 引导ELR 特性随之默认开启。控制器侧通过 FeatureControlManager.isElrFeatureEnabled() 判断“已定稿的特性版本是否 ≥ 1”来决定是否启用 ELR 行为。如何在 4.0 集群手动启用由于 ELR 在 4.0 中默认未启用需要管理员显式打开新协议eligible.leader.replicas.version1将其作为集群动态特性提交后KRaft 控制器即开始跟踪 ELR。可以通过kafka-features.sh查看/变更特性版本例如先查询当前特性状态bin/kafka-features.sh --bootstrap-server controller:port describe确认eligible.leader.replicas.version为 0 后再升级到 1bin/kafka-features.sh --bootstrap-server controller:port upgrade --feature eligible.leader.replicas.version --feature-level 1注意启用 ELR 要求集群 metadata version 至少为IBP_4_0_IV1即 4.0 的 IV1 版本。如果集群 metadata version 偏低需先升级 metadata version 再启用该特性。降级是安全的原文档明确说明降级是安全的。只要将特性版本设回 0 即可bin/kafka-features.sh --bootstrap-server controller:port downgrade --feature eligible.leader.replicas.version --feature-level 0从实现上看EligibleLeaderReplicasVersion.fromFeatureLevel(0)会回退到 ELRV_0此后PartitionChangeBuilder在maybeUpdateRecordElr中会清空所有 ELR 相关字段集群回到 4.0 之前的选主行为。建议在降级前确认 ISR 均已恢复健康ISR ≥ min ISR避免降级瞬间部分分区失去 ELR 后备 Leader。启用 ELR 时的min.insync.replicas迁移规则启用 ELR 会伴随一套强制性的min.insync.replicas配置迁移原文档给出了完整的规则清单这里结合ConfigurationControlManager的源码逐一说明其底层原因自动补充集群级min.insync.replicas如果集群级cluster-level即 controller 上、作用于所有 Broker 的默认配置原本没有min.insync.replicas控制器会自动以“当前活跃控制器的静态配置值”创建一条集群级配置。对应实现是 maybeGenerateElrSafetyRecords()启用 ELR 的updateFeatures请求会原子地追加ConfigRecord把min.insync.replicas写到资源名称为空即集群级的 BROKER 配置上禁止删除集群级min.insync.replicas删除会被拒绝并返回错误Cluster-level min.insync.replicas cannot be removed while ELR is enabled.见 L429-L431因为 ELR 的启用状态本身依赖一个确定的集群级 min ISR 基线更新集群级min.insync.replicas会清空全部 ELR 状态即使新值与旧值完全相同所有分区的 ELR 也会被清理需要按新基线重新累积自动移除 Broker 级min.insync.replicas启用 ELR 时控制器会删除所有 Broker 上单独设置的min.insync.replicas见maybeGenerateElrSafetyRecords中遍历brokersWithConfigs生成删除记录的逻辑。如果需要按 Broker 差异化设置请改到集群级配置禁止修改 Broker 级min.insync.replicas修改会被拒绝并返回错误Broker-level min.insync.replicas cannot be altered while ELR is enabled.见 L425-L427更新某个 Topic 的min.insync.replicas会清空该 Topic 的 ELR 状态以保证 ELR 名单始终基于一致的 min ISR 语义。前 5 条规则在 ConfigurationControlManagerTest.java 中有对应的测试覆盖可以在仓库测试目录中继续深入阅读。查看 ELRDescribeTopicPartitions API 与 kafka-topics.sh原文档指出ELR 字段可以通过DescribeTopicPartitionsAPI 检查——这是 Kafka 3.6 引入、用于逐步替代旧DescribeTopics的 APIAdmin Client 通过describeTopics()即可获取。响应解析位于 DescribeTopicPartitionsResponse.java其中将分区的eligibleLeaderReplicas与lastKnownElr两个字段逐一映射为节点列表返回给客户端。在实际运维中使用kafka-topics.sh描述主题即可直观看到 ELR 信息--describe输出中会包含EligibleLeaderReplicas与LastKnownElr列bin/kafka-topics.sh --bootstrap-server broker:9092 --describe --topic topic-name典型输出示意以仓库源码测试 PartitionChangeBuilderTest.testEligibleLeaderReplicas_ElrCanBeElected 构造的分区状态为例Topic: my-topic TopicId: FbrrdcfiR-KC2CPSTHaJrg PartitionCount: 1 ReplicationFactor: 4 Topic: my-topic Partition: 0 Leader: 3 Replicas: 1,2,3,4 Isr: 3 Elr: 1 LastKnownElr: 2上例对应的场景是副本 1 下线被剔除出 ISR分区 ISR 收缩到只剩副本 3副本 1 被记入 ELR当副本 3 也离线、ISR 为空时控制器即可依据“ISR → ELR → 最后已知 Leader”的顺序优先从 ELR 中选出副本 1 接任 Leader而无需等待不洁选举。启用 ELR 的推荐路径与注意事项先做元数据升级确保集群 metadata version ≥IBP_4_0_IV14.0 IV1这是 ELRV_1 的硬性依赖确认min.insync.replicas现状启用前手动检查各 Broker 的 Broker 级配置与集群级配置理解启用动作会“删除 Broker 级 补建集群级”的迁移影响避免启用瞬间配置语义发生变化影响生产写入执行特性升级通过kafka-features.sh将eligible.leader.replicas.version升级到 14.1 及以后新建的集群默认已启用无需此步观察元数据与选举日志启用后在控制器日志中关注Setting new leader for ... using ELRELR 选举以及Removed ELRs from N partitions in all topics配置变更导致的 ELR 清理见 ReplicationControlManager.java等日志确认行为符合预期降级前检查 ISR 健康度降级到版本 0 是安全的但建议先确认分区 ISR 不小于 min ISR以免失去 ELR 后备后进入不洁选举窗口。小结Eligible Leader Replicas 在“严格 min ISR”模型之上为 KRaft 控制器提供了一份持久化的“安全 Leader 后备名单”把选主优先级扩展为ISR → ELR → 最后已知 Leader在保证数据安全边界ELR 成员由当前 ISR 演化而来、且不洁关闭副本会被剔除的同时显著减少分区因 ISR 收缩而进入不可服务状态的概率。它是 Kafka 4.x 复制可用性演进的关键能力也是所有运行 4.0 集群的团队值得评估并启用的特性——只要遵循本文所述的版本依赖、配置迁移与降级路径即可在生产环境平滑落地。【免费下载链接】KafkaApache Kafka - A distributed event streaming platform项目地址: https://gitcode.com/GitHub_Trending/kafka4/kafka创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进