使用 Kafka 进行零停机升级

2025年5月15日 | 阅读 9 分钟
Zero Downtime Upgrades with Kafka

在当前的分布式结构中,通过软件或机器增强将停机时间降至最低对于保持可靠性、个人信任和业务连续性至关重要。Apache Kafka 通常是实时数据管道的骨干,实现 Kafka 的零停机增强是一个非常有价值的用例,可确保平稳、不间断的运行。

此用例涉及在不中断服务、不丢失消息或不降低性能的情况下升级 Kafka 代理、客户或相关设备(例如 Kafka Connect 或 Streams)。

实现零停机升级的挑战

Kafka 环境中实现零停机增强涉及克服多项技术和操作挑战,以确保在整个升级系统期间不间断的服务。每项任务都源于 Kafka 的分布式性质、高可用性要求及其作为实际时间统计管道骨干的作用。

1. 集群协调

问题

  • Kafka 作为一个分布式设备运行,多个代理处理跨墙的统计数据。在执行增强功能时,每个代理都应暂时离线以应用更改,但整个集群必须保持运行。

挑战

  1. 保持集群法定人数
    Kafka 依赖 ZooKeeper(或更新版本中的 KRaft)进行集群协调。如果集群中的大多数代理在升级期间不可用,集群可能会失去法定人数,导致服务中断。
  2. 分区领导
    每个分区都有一个负责管理读写操作的领先代理。在不将管理重新分配给另一个代理的情况下升级领导代理可能会导致暂时不可用。
    缓解
    • 使用滚动升级,在重新分配分区管理的同时分别升级代理。
    • 监控法定人数的健康状况,并确保至少大多数代理继续运行。

2. 向后兼容性

问题

  • Kafka 的客户(生产者和消费者)在代理升级期间必须保持功能。如果协议或功能集在版本之间存在重大更改,则可能会出现兼容性问题。

挑战

  1. 客户端-代理兼容性
    如果旧客户端与新代理不兼容,它们可能会无法提供或消费消息。
  2. 模式演进
    在升级期间统计模式发生演变的情况下,生产者也可能以与旧购买者不兼容的新模式布局发送消息。
    缓解
    • Kafka 保证次要版本之间的向后兼容性;通过使用 Kafka 文档确认版本兼容性。
    • 使用 Schema Registry 验证模式兼容性并管理模式演变。

3. 数据一致性和状态保存

问题

  • Kafka 确保至少在一次传输和偏移量确定哪些消息已由消费者处理后,这些保证得以维持。如果状态未正确保存,升级可能会破坏这些保证。

挑战

  1. 偏移量跟踪
    消费者企业依赖偏移量从完美点恢复处理。在升级的某些阶段管理不当可能导致统计数据丢失或重复。
  2. 在途消息
    在代理停机期间,在途消息可能不会及时发送,导致消费者滞后或处理延迟。
    缓解
    • 使用安全关闭过程刷新挂起的写入并确保在代理重新启动之前提交偏移量。
    • 验证偏移量连续性提交-改进。

4. 高可用性

问题

  • Kafka 是实时结构的重要组成部分。改进期间的停机或性能下降可能会中断结构化应用程序。
  • 当预订离线时,Kafka 需要为其分区重新选择领导者,这会引入轻微的延迟。

复制滞后

  • 如果带有副本的分区预订离线,客户可能会遇到读取延迟,直到选出新的领导者。

缓解

  • 抢先重新分配分区领导者,以避免不必要的选举延迟。
  • 监控 ISR(同步副本)列表,确保副本在升级前后同步。

Kafka 的零停机升级内置功能

Kafka 中的零停机改进利用了其固有的架构优势和最佳实践。这些功能可确保系统在组件逐步升级时保持运行。

1. 滚动升级

什么是滚动升级?

滚动升级涉及分别升级男性或女性代理,而不是一次性全部升级。这保证了在整个升级过程中大部分集群保持运行,从而最大限度地减少对可用性的影响。

它的工作原理

  1. 代理隔离
    一个代理离线进行升级,而集群则安全地处理客户请求和代理间复制。
  2. 分区领导权转移
    在关闭代理之前,其分区领导者会被重新分配给集群中的其他代理。这可以防止对购买者请求的干扰。
  3. 复制机制
    Kafka 的复制保证,即使一个代理离线,其他代理上的副本也可以充当备份以保持数据可用。

好处

通过只关闭部分代理来确保非连续提供商。

防止全面停机,尽管单个预订的改进失败。

2. 向后兼容性

确保版本之间的兼容性

  • Kafka 保持次要版本之间的向后兼容性,允许旧客户端与升级后的代理无缝交互。
  • 运行旧版本 Kafka 的生产者和消费者仍然可以与新代理通信,直到它们升级。

实际应用

  • 使用 Kafka 2.7 的制造商可以与升级到 3.X 的代理一起工作,只要遵守兼容性指南。
  • 此特性允许跨不同组件进行交错改进,从而避免系统范围的干扰。

3. 领导者选举和复制

分区领导和故障转移

  1. 领导者选举
    • Kafka 中的每个分区都有一个领先代理。在代理改进期间,Kafka 机器人会自动将分区管理重新分配给另一个代理。
    • 这最大限度地减少了服务中断,这也是新领导者继续服务请求的原因。
  2. 冗余复制
    • Kafka 的复制机制保证每个代理都有多个分区记录副本。即使代理因升级而暂时离线,其他副本仍然可以访问。

实际用途

  • 在升级代理之前,使用 Kafka-reassign-partitions.Sh 工具将其分区的领导权转移到任何其他代理,确保这些分区的墙壁没有停机时间。

4. Schema Registry

处理模式演变

  • 在升级与模式相关的组件时,Schema Registry 在维护制造商和客户之间的信息兼容性方面发挥着关键作用。
  • 它通过确保兼容性(向后或向前)来允许模式演变,因为添加了新字段或修改了现有字段。

好处

  • 生产者可以发送有关使用新模式的消息,而不会破坏旧购买者。
  • 在升级过程中的某个时间点,模式相关更新的平滑集成。

执行零停机升级的步骤

1. 升级前准备

规划升级

  • 查看 Kafka 的兼容性建议,确保支持改进路径。
  • 选择低流量维护窗口,以最大限度地减少对终端客户的影响。

备份数据

  • 使用 Kafka-unload-log.Sh 等工具或备份服务对重要主题和配置进行快照。
  • 确保在发生意外故障时提供备份偏移量和国家/地区商店。

2. 代理升级

第 1 步:升级 Kafka 二进制文件

  • 在代理上安装更新的 Kafka 二进制文件,而无需启动提供程序。
  • 确认新版本符合集群的兼容性要求。

第 2 步:重新分配分区

  • 临时重新分配代理中的墙壁以进行升级。

示例: 创建 JSON 文档以指定分区重新分配。

执行重新分配

第 3 步:启动代理

  • 启动新版本并验证其与集群的连接。

第 4 步:验证代理

  • 检查代理日志中的错误或警告。
  • 使用监控工具确保代理上的墙壁健康且同步。

第 5 步:对所有代理重复此操作

  • 按顺序重复集群中每个代理的改进过程。

3. 客户端升级

  • 分阶段升级生产者和客户端程序。
  • 在全面推出之前,使用功能标志或金丝雀部署来测试新购买者版本的一小部分数据。

4. 测试和监控

监控指标

  • 在整个改进过程中和之后,使用以下工具跟踪吞吐量、延迟和客户滞后等关键指标:
  • Kafka 的本地工具 (kafka-topics.Sh, kafka-consumer-groups.Sh)。
  • Prometheus 和 Grafana 等第三方工具。

执行功能测试

  • 运行集成检查以确保制造商和客户按预期使用升级后的集群。

验证数据一致性

  • 检查偏移量、ISR 列表和主题健康状况,以验证没有统计数据丢失或延迟。

示例:滚动代理升级

分步代码示例

假设您有一个 3 代理 Kafka 集群(broker-1、broker-2、broker-3)。

1. 识别分区领导者

kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-topic

2. 重新分配分区领导者(将分区从 broker-1 移动到其他代理):创建一个 JSON 文件 (reassign.json)

执行重新分配

3. 升级 broker-1

  • 停止 broker-1 上的 Kafka 服务。
  • 安装新的 Kafka 版本。
  • 启动 Kafka 服务。
  • 使用日志和监控工具验证代理健康状况。

4. 对其他代理重复此操作。

实际用例:Kafka 零停机升级

一个全球电子商务平台依赖 Kafka 处理实际活动,包括个人活动、订单跟踪和库存更新。Kafka 升级期间的任何停机时间都可能扰乱运营、延迟订单处理并影响消费者体验。以下是该平台如何在不停机的情况下增强 Kafka 的功能。

Kafka 集群运行在 2.8 版上,拥有一个五节点代理设置,每 2 秒处理 10,000 条消息。团队决定升级到 Kafka 3.0,以提高可扩展性和 Kraft 等功能。

准备

  • 在低流量时段规划了升级。
  • 验证了版本兼容性,以确保现有客户端可以与 Kafka 3.0 代理一起工作。
  • 备份了客户偏移量和配置等关键统计数据。

代理升级

每次预订都按顺序更改和升级

  1. 停止 Broker-1 并挂载 Kafka 3.0 二进制文件。
  2. 在 Broker-1 离线之前,将其分区领导权转移给其他代理。
  3. 重新启动 Broker-1,确认其重新集成,并监控健康指标。
  4. 对其他代理重复此过程,直到整个集群升级完毕。

Kafka 的滚动改进功能确保了持续运行。当代理离线时,其他代理上的复制分区处理请求。分区领导权重新分配最大限度地减少了中断。

客户端升级

生产者和消费者定期升级。功能标志控制新的消费者部署,确保兼容性和稳定性。旧客户和更新代理之间的兼容性允许升级时间表的灵活性。

Kafka 零停机升级的应用

Kafka 中的零停机增强在需要不间断数据处理和可用性的行业和应用程序中至关重要。这些升级允许结构在不中断正在进行的服务的情况下发展,使其非常适合高可用性和实时环境。

1. 电子商务平台

在线市场依赖 Kafka 进行消费者活动、库存更新和订单跟踪的实时处理。在改进过程中,零停机保证了订单下达或库存同步等基本服务不会中断。这可以防止销售损失,确保消费者满意度,并保持运营效率。

2. 金融系统

银行和交易平台使用 Kafka 处理交易、检测欺诈和流式传输市场信息。改进过程中的任何停机都可能导致经济损失、交易延迟或不符合监管要求。零停机改进使 Kafka 结构能够无缝维护,同时确保持续的数据可用性和准确的处理。

3. 电信

电信公司使用 Kafka 进行实时计费、消费者使用分析和网络监控。这些环境中的 Kafka 改进必须避免中断,以保持服务连续性和准确计费。零停机改进有助于确保没有数据丢失,并且关键分析管道保持运行。

4. 流媒体平台

媒体流媒体平台利用 Kafka 处理用户活动日志、推荐内容和跟踪播放质量等实时分析。在改进过程中,不间断的 Kafka 运行对于避免缓冲问题、推荐延迟或用户参与统计数据丢失至关重要。

5. 物联网和智能设备

Kafka 充当 物联网 生态系统的骨干,处理来自智能恒温器、可穿戴健康视频显示器和相关车辆等设备的实际时间统计数据。零停机升级可确保遥测统计数据的非连续流动,防止监控中断或关键事件响应延迟。

结论

在本次讨论中,我们探讨了 Kafka 零停机升级的概念,重点介绍了在不中断实时记录处理的情况下确保 Kafka 集群无缝升级所涉及的方法、功能和挑战。滚动升级、向后兼容性、领导者选举和复制等关键机制被强调为保持操作连续性不可或缺的。我们还研究了跨电子商务、金融、医疗保健和电信等行业的实际全球应用程序,展示了 Kafka 的零停机能力对于需要不间断数据流和高可用性的结构至关重要。这些实践确保了关键服务在升级到更新版本时仍然可用,从而保持了系统完整性和用户满意度。