Kafka Consumer 如何从 classic 协议在线迁移到 group.protocol=consumer Kafka Consumer 如何从 classic 协议在线迁移到 group.protocolconsumer【免费下载链接】KafkaApache Kafka - A distributed event streaming platform项目地址: https://gitcode.com/GitHub_Trending/kafka4/kafka如果你的消费组目前运行在 Kafka 4.0 集群上还想避免停机切换协议这篇文章解决的就是这个问题在不停下消费组的前提下把KafkaConsumer从classicrebalance 协议切换到group.protocolconsumer指定的新一代 Consumer 协议KIP-848。迁移完成后消费组会由服务端自动从Classic类型转换为Consumer类型消费不中断。相关文档Consumer Rebalance Protocol、Consumer and Share Consumer Configs、Basic Kafka Operations。前提条件在线迁移依赖服务端与客户端两侧都具备能力核对以下三点Broker 为 Apache Kafka 4.0 及以上。4.0 起新 Consumer 协议在服务端自动启用由group.versionfeature flag 控制升级到 4.0 完成upgrade finalized后该协议即生效无需额外开启。参见 upgrade guide。客户端使用 Apache Kafka 4.0 及以上。4.0 起 Consumer 完全支持新协议但默认不启用必须显式设置group.protocolconsumer。当前消费组使用的 classic 分配策略不内嵌自定义元数据custom metadata。这是在线迁移的硬性限制只有当 classic 组使用不内嵌自定义元数据的 assignor 时滚动升级才能把组从Classic转换为Consumer。如果你的组使用了内嵌自定义元数据的分配策略只能走离线迁移先停掉所有消费者再整体拉起见文末说明。执行在线迁移滚动发布消费者在线迁移的操作路径就是**滚动发布rolling out**消费者逐步把实例换成带新配置启动的版本。文档给出的关键机制是当第一个使用新 Consumer rebalance 协议的消费者加入组时该组会从Classic转换为Consumer之后 Classic 协议的成员会与新协议成员互操作interoperated共同工作。也就是说不需要一次性把所有实例切完先替换一两个实例组类型即完成转换其余 classic 实例继续在线消费直到滚动发布全部完成。以配置文件方式启动消费者为例在原有配置中增加一行group.protocolconsumergroup.id替换为你要迁移的现有消费组 IDbootstrap.servers替换为你的集群地址group.idmy-group bootstrap.serverslocalhost:9092 group.protocolconsumer启用新协议后以下客户端配置和 API不再可用发布前应从配置和代码中移除或停用heartbeat.interval.mssession.timeout.mspartition.assignment.strategyenforceRebalance(String)与enforceRebalance()心跳与会话超时改由服务端配置控制group.consumer.heartbeat.interval.msgroup.consumer.session.timeout.ms分配策略也移到服务端由group.consumer.assignors指定可用 assignor 列表默认提供uniform和range两种uniform是默认值列表中第一个客户端可通过group.remote.assignor指定其他已注册的 assignor。原客户端分配策略与服务端 assignor 的对应关系如下客户端 assignor服务端 assignorRangeAssignorrangeCooperativeStickyAssignoruniformStickyAssignoruniformRoundRobinAssignoruniform如果原来依赖自定义客户端分配策略注意这属于当前不支持的范围见“限制与边界”。验证迁移结果迁移完成与否文档给出的判断标准是组类型发生了转换——第一个consumer协议成员加入后组即从Classic转为Consumer。可以结合以下两种手段观察查看消费组状态使用 basic-kafka-operations.md 中给出的描述命令bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group my-group注意一个权限差异如果消费组使用的是 consumer 协议admin client 需要对组内成员订阅的所有 topic拥有DESCRIBE权限classic 协议没有这个要求。如果你的环境里此前没有给 admin client 授权全量 topic 的 DESCRIBE 权限迁移后这条命令可能报权限错误需要先补齐 ACL。观察服务端组计数指标。监控文档中定义了按协议区分的组数量指标见 monitoring.mdkafka.server:typegroup-coordinator-metrics,namegroup-count,protocol{consumer|classic|streams}迁移过程中protocolconsumer计数应包含你的组、protocolclassic对应减少。文档未给出该指标的具体示例数值以你集群的实际监控输出为准。如果滚动发布过程中某个实例启动失败或长期停留在 classic检查其配置是否仍带着上面列出的不可用配置项如partition.assignment.strategy以及是否使用了内嵌自定义元数据的分配策略——后者会阻断在线转换。回滚与降级路径文档同时说明了反向操作用相反的过程滚动把消费者换回group.protocolclassic或不设置该配置当最后一个使用新 Consumer 协议的消费者离开组时组会从Consumer转换回Classic。因此在线迁移是可逆的这可以作为发布出问题时的回滚手段。需要注意两个不可逆点一旦新协议被消费组使用集群只能降级到 3.4.1 或更高版本见 upgrade guide 中 4.0 升级说明。协议演进路线文档预期时间线4.0 GA5.0 中KafkaConsumer将默认使用Consumer协议但仍兼容Classic6.0 中KafkaConsumer仅支持Consumer协议broker 端继续兼容Classic。限制与边界客户端自定义 assignor 不受支持自定义分配策略不在新协议范围内文档建议通过 KAFKA-18327 反馈若你有此类依赖本方案的在线迁移不适用。Rack-aware 分配策略尚未完全支持工作正在进行中见 KAFKA-19387。依赖 rack 感知分配的组应谨慎评估后再迁移。离线替代路径如果无法在线转换例如 classic 组使用了内嵌自定义元数据的 assignor可以在所有消费者停机后以group.protocolconsumer重新拉起——空组会自动在Classic与Consumer之间转换。代价是消费组必须整体停机。启用新协议后正则订阅可用subscribe(SubscriptionPattern)方法表达式采用 RE2J 格式并在服务端求值新协议还新增了覆盖改进线程模型的指标具体名称见文档中引用的 KIP 848 相关 wiki 页面文档未在本仓库内展开。完成迁移并确认组类型为Consumer后后续版本升级时客户端无需再关心group.protocol的默认值变化——5.0 起它将成为KafkaConsumer的默认协议。【免费下载链接】KafkaApache Kafka - A distributed event streaming platform项目地址: https://gitcode.com/GitHub_Trending/kafka4/kafka创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考