
# 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实例](https://support.huaweicloud.com/usermanual-kafka/kafka-ug-180604013.html)。
   
3. 在目标Kafka实例中创建Topic。 在目标Kafka实例上创建与原Kafka实例相同配置的Topic，包括Topic名称、副本数、分区数、消息老化时间，以及是否同步复制和落盘等。具体请参考[创建Kafka Topic](https://support.huaweicloud.com/usermanual-kafka/kafka-ug-180604018.html)。
   
 
#### 迁移方案一：先迁生产，再迁消费（不迁移数据）
先将生产消息的业务迁移到新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跨集群同步数据](https://support.huaweicloud.com/usermanual-kafka/Kafka-bp-0002.html)。
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间的数据复制](https://support.huaweicloud.com/usermanual-kafka/kafka-ug-0034.html)。
2. 在Kafka控制台的"实例管理 \> 消息查询"页面，查看两个Kafka的最新消息是否一致，确认两个Kafka的同步进度是否一致。具体步骤请参见[查看Kafka消息](https://support.huaweicloud.com/usermanual-kafka/kafka-ug-190904001.html)。
   
   - 是，执行[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](https://github.com/miguecoll/kafka-mirror-maker)，模拟成原Kafka的消费客户端，以及新Kafka实例的生产客户端，将Kafka所有消息数据迁移到新的Kafka实例，具体步骤请参考[配置Kafka间的数据复制](https://support.huaweicloud.com/usermanual-kafka/kafka-ug-0034.html)或者[使用MirrorMaker跨集群同步数据](https://support.huaweicloud.com/usermanual-kafka/Kafka-bp-0002.html)。
