更新时间:2025-08-21 GMT+08:00

Kafka数据迁移概述

Kafka迁移是指将生产与消费消息的客户端切换为连接新Kafka,部分还涉及将持久化的消息文件迁移到新Kafka。主要涉及到以下2类场景:

  • 业务上云且不希望业务有中断。

    在上云过程中,连续性要求高的业务,需要平滑迁移,不能有长时间的中断。

  • 在云上变更业务部署。

    单AZ部署的Kafka实例,不具备AZ之间的容灾能力。用户对可靠性要求提升后,需要迁移到多AZ部署的实例上。

迁移方案概述

表1 迁移方案概述

迁移方案

迁移工具

优点

缺点

先迁生产,再迁消费(不迁移数据)

-

  • 业界通用的迁移方案,操作步骤简单,无需安装其他插件。
  • 迁移过程由业务侧自主控制。
  • 可确保消息消费的顺序性。
  • 切换过程存在延时,消费端需要先消费完原Kafka消息,然后才能消费新Kafka消息。
  • 迁移完消费业务后,新Kafka可能存在消息积压。

同时消费,后迁生产(不迁移数据)

-

  • 操作步骤简单,无需安装其他插件。
  • 同时消费原Kafka和新Kafka消息,确保消息能及时消费,无消息积压。

在迁移生产的开始阶段,同时消费原Kafka与新Kafka,会导致部分消息之间的生产顺序无法保证,存在消息乱序的问题。

使用MirrorMaker先迁移数据,然后迁消费,最后迁生产

MirrorMaker

新Kafka同步原Kafka的全量历史数据和实时生产的增量数据。

消费端迁移到新Kafka后,会重复消费历史消息,消费端需支持消息幂等。

使用Smart Connect先迁移数据,然后迁消费,最后迁生产

Smart Connect

新Kafka同步原Kafka的全量历史数据和实时生产的增量数据。

消费端迁移到新Kafka后,会重复消费历史消息,消费端需支持消息幂等。

约束与限制

  • 使用Smart Connect迁移业务,会对源端Kafka进行消费,对目标端Kafka进行生产,会占用源端和目标端Kafka的带宽。
  • 出于性能考虑,Smart Connect实时同步源端和目标端的数据,但是消费进度是通过批处理同步的,可能会导致源端和目标端每个分区的消费进度存在0-100之间的差异。

迁移准备

  1. 配置网络环境。

    Kafka实例分内网地址以及公网地址两种网络连接方式。如果使用公网地址,则消息生成与消费客户端需要有公网访问权限,并配置如下安全组。

    表2 安全组规则

    方向

    协议

    端口

    源地址

    说明

    入方向

    TCP

    9094

    Kafka客户端所在的IP地址或地址组

    通过公网访问Kafka(明文接入)。

    入方向

    TCP

    9095

    Kafka客户端所在的IP地址或地址组

    通过公网访问Kafka(密文接入)。

  2. 创建目标Kafka实例。

    目标Kafka的规格不能低于原业务使用的Kafka规格。具体请参考购买Kafka实例

  3. 在目标Kafka实例中创建Topic。

    在目标Kafka实例上创建与原Kafka实例相同配置的Topic,包括Topic名称、副本数、分区数、消息老化时间,以及是否同步复制和落盘等。具体请参考创建Kafka Topic

迁移方案一:先迁生产,再迁消费(不迁移数据)

先将生产消息的业务迁移到新Kafka,原Kafka不会有新消息生产。待原Kafka的消息全部消费完后,再将消费消息业务迁移到新Kafka,开始消费新Kafka的消息。

本方案为业界通用的迁移方案,操作步骤简单,迁移过程由业务侧自主控制,整个过程中消息不会存在乱序问题,适用于对消息顺序有要求的场景。但是该方案中需要等待消费业务执行完毕,存在一个时间差的问题,部分数据可能存在较大的端到端时延。

  1. 将生产客户端的Kafka连接地址修改为新Kafka实例的连接地址。
  2. 重启生产业务,使得生产者将新的消息发送到新Kafka实例中。
  3. 观察各消费组在原Kafka的消费进度,直到原Kafka中数据都已经被消费完毕。
  4. 将消费客户端的Kafka连接地址修改为新Kafka实例的连接地址。
  5. 重启消费业务,使得消费者从新Kafka实例中消费消息。
  6. 观察消费者是否能正常从新Kafka实例中获取数据。
  7. 迁移结束。

迁移方案二:同时消费,后迁生产(不迁移数据)

消费业务启用多个消费客户端,分别向原Kafka和新Kafka消费消息,然后将生产业务切到新Kafka实例,这样能确保所有消息都被及时消费。

本方案中消费业务会在一段时间内同时消费原Kafka和新Kafka消息。由于在迁移生产业务之前,已经有消费业务运行在新Kafka实例上,因此不会存在端到端时延的问题。但在迁移生产的开始阶段,同时消费原Kafka与新Kafka,会导致部分消息之间的生产顺序无法保证,存在消息乱序的问题。此场景适用于对端到端时延有要求,却对消息顺序不敏感的业务

  1. 启动新的消费客户端,配置Kafka连接地址为新Kafka实例的连接地址,消费新Kafka实例中的数据。

    原有消费客户端需继续运行,消费业务同时消费原Kafka与新Kafka实例的消息。

  2. 修改生产客户端,Kafka连接地址改为新Kafka实例的连接地址。
  3. 重启生产客户端,将生产业务迁移到新Kafka实例中。
  4. 生产业务迁移后,观察连接新Kafka实例的消费业务是否正常。
  5. 等待原Kafka中数据消费完毕,关闭原有消费业务客户端。
  6. 迁移结束。

迁移方案三:使用MirrorMaker先迁移数据,然后迁消费,最后迁生产

首先通过MirrorMaker同步两个Kafka的消息,其次将消费端迁移到新Kafka,最后将生产端迁移到新Kafka。

本方案依赖于MirrorMaker,MirrorMaker实时同步原Kafka和新Kafka的数据。待数据同步完成,先将消费端迁移到新Kafka,然后将生产端迁移到新Kafka。此场景适用于生产端不可停止,端到端有时延要求,但是可以兼容少量重复消费的业务。

  1. 使用MirrorMaker同步两个Kafka的消息。具体步骤请参见使用MirrorMaker跨集群同步数据
  2. 将消费客户端的Kafka连接地址修改为新Kafka实例的连接地址。
  3. 重启消费业务,使得消费者从新Kafka实例中消费消息。
  4. 观察消费者是否能正常从新Kafka实例中获取数据。
  5. 修改生产客户端,Kafka连接地址改为新Kafka实例的连接地址。
  6. 重启生产客户端,将生产业务迁移到新Kafka实例中。
  7. 生产业务迁移后,观察连接新Kafka实例的消费业务是否正常。
  8. 迁移结束。

迁移方案四:使用Smart Connect先迁移数据,然后迁消费,最后迁生产

首先通过Smart Connect同步两个Kafka的消息,其次将消费端迁移到新Kafka,最后将生产端迁移到新Kafka。

本方案依赖于Smart Connect,Smart Connect实时同步源端和目标端的数据,但是消费进度是通过批处理同步的,可能会导致源端和目标端每个分区的消费进度存在0-100之间的差异,存在少量重复消费问题。此场景适用于生产端不可停止,端到端有时延要求,但是可以兼容少量重复消费的业务。

  1. 创建Kafka数据复制的Smart Connect任务,用于同步两个Kafka的消息。具体步骤请参见配置Kafka间的数据复制
  2. 在Kafka控制台的“实例管理 > 消息查询”页面,查看两个Kafka的最新消息是否一致,确认两个Kafka的同步进度是否一致。具体步骤请参见查看Kafka消息

    • 是,执行3
    • 否,在监控页面查看两个Kafka的“Kafka每分钟同步数据量”是否正常,如果正常,先等待两个Kafka的同步进度一致,然后执行3

  3. 将消费客户端的Kafka连接地址修改为新Kafka实例的连接地址。
  4. 重启消费业务,使得消费者从新Kafka实例中消费消息。
  5. 观察消费者是否能正常从新Kafka实例中获取数据。
  6. 修改生产客户端,Kafka连接地址改为新Kafka实例的连接地址。
  7. 重启生产客户端,将生产业务迁移到新Kafka实例中。
  8. 生产业务迁移后,观察连接新Kafka实例的消费业务是否正常。
  9. 迁移结束。

常见问题:如何将持久化数据也一起迁移

如果需要将原Kafka的已消费数据也迁移到Kafka实例,可以使用Smart Connect工具或者开源工具MirrorMaker,模拟成原Kafka的消费客户端,以及新Kafka实例的生产客户端,将Kafka所有消息数据迁移到新的Kafka实例,具体步骤请参考配置Kafka间的数据复制或者使用MirrorMaker跨集群同步数据