
# 使用迁移任务在线迁移DCS Redis实例
在满足DCS源Redis和目标Redis的网络相通、源Redis放通SYNC和PSYNC命令这两个前提下，支持使用在线迁移的方式，将DCS源Redis中的数据全量或增量迁移到目标Redis中。
#### 操作视频
本视频演示如何在线迁移DCS Redis实例间的缓存数据。因产品功能演进，操作界面可能存在差异，相关视频仅供参考，具体以实际环境为准。
<video controls="controls" preload="none" id="object201949239311" class="idp-external-video" src="https://res-static.hc-cdn.cn/cloudbu-site/china/zh-cn/support/dcs-video/1688641909793752832.mp4" title="在线迁移Redis实例数据" poster="https://support.huaweicloud.com/usermanual-dcs/zh-cn_image_0000002342243340.jpg" height="335.0000" width="600.0000"></video>
#### 约束与限制
- 在线迁移不支持公网方式直接迁移。
- 将高版本Redis实例数据迁移到低版本Redis实例可能失败。
- 较早建立的实例如果密码中包含单引号（'）和冒号（:），则该实例不支持进行在线迁移，建议修改实例密码或使用其他迁移方式。
- 如果是单机/主备等多DB的源实例迁移到Proxy集群实例，Proxy集群默认仅有一个DB0，请先确保源实例DB0以外的DB是否有数据，如果有，请先参考[Proxy集群开启多DB的使用限制及操作方式](https://support.huaweicloud.com/dcs_faq/dcs-faq-210804001.html#section0)开启Proxy集群多DB。
- 如果是单机/主备等多DB的源端实例迁移到Cluster集群实例，Cluster集群不支持多DB，仅有一个DB0，请先确保源端实例DB0以外的DB是否有数据，如果有，请将数据转存到DB0，否则会出现迁移失败，将数据转存到DB0的操作请参考[使用Rump在线迁移](https://support.huaweicloud.com/usermanual-dcs/dcs-migration-090626001.html)。
- 进行在线迁移时，建议将源端实例的参数repl-timeout配置为300秒，client-output-buffer-slave-hard-limit和client-output-buffer-slave-soft-limit配置为实例最大内存的20%。
- 开启了SSL的目标实例不支持数据迁移，需要关闭目标实例SSL后再进行迁移，开启或关闭SSL的操作请参考[配置Redis SSL数据加密传输](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-023129.html)。
- **在线迁移，相当于临时给源端Redis增加一个从节点并且做一次全量同步到迁移机，建议在业务低峰期执行迁移，否则可能导致源端实例CPU瞬时冲高，时延增大。**
- 当源端为Proxy集群和读写分离实例时，仅支持"源Redis类型"选择"云服务Redis"。
 
#### 前提条件
- 在迁移之前，请先阅读[迁移方案说明](https://support.huaweicloud.com/usermanual-dcs/dcs-migration-090626002.html)，选择正确的迁移方案，了解当前DCS支持的在线迁移能力，选择适当的目标实例。
- 如果您还没有目标Redis，请先创建，创建操作，请参考[购买Redis实例](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713002.html)。
- 如果您已有目标Redis，则不需要重复创建，为了对比迁移前后数据及预留足够的内存空间，建议在数据迁移之前清空目标实例数据，清空操作请参考[清空Redis实例数据](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0312018.html)。
  如果没有清空实例数据，数据迁移后，目标Redis与源Redis实例重复的数据会被覆盖，源Redis没有、目标Redis有的数据会保留。
  
 
#### 创建在线迁移任务
![](https://support.huaweicloud.com/usermanual-dcs/public_sys-resources/caution_3.0-zh-cn.png)
仅当在线迁移任务与源Redis为相同账号下相同区域时，在线迁移时选择的源端Redis会自动放通源Redis的SYNC和PSYNC命令。因此需要在源Redis相同账号和区域下创建在线迁移任务。否则无法进行在线迁移。
1. 登录[分布式缓存服务管理控制台](https://console.huaweicloud.com/dcs)。
   
   **如果源Redis与目标Redis所属不同账号下，请使用源Redis所在的账号登录DCS。**
   
   
2. 在管理控制台左上角单击![](https://support.huaweicloud.com/usermanual-dcs/zh-cn_image_0000001549115173.png)，选择**源Redis**所在的区域。
3. 单击左侧菜单栏的"数据迁移"。页面显示迁移任务列表页面。
4. 单击右上角的"创建在线迁移任务"。
5. 设置迁移任务名称和描述。 
   任务名称请以字母开头，长度不小于4位且不超过64位。任务名称只能包含字母、数字、中划线、下划线。
   
   
6. 配置在线迁移任务虚拟机资源的虚拟私有云（VPC）、子网和安全组。 
   - 请选择与源Redis或目标Redis相同的VPC。
   
   - 创建的在线迁移任务会占用一个租户侧IP，即控制台上迁移任务对应的"迁移IP"。如果源端Redis或目标端Redis配置了白名单，需确保配置了迁移IP或关闭白名单限制。
   
   - 迁移任务所选安全组的"出方向规则"需放通源端Redis和目标端Redis的IP和端口（安全组默认情况下为全部放通，则无需单独放通），以便迁移任务的虚拟机资源能访问源Redis和目标Redis。
   
   
   
   
 
#### 检查网络
1. 检查源Redis、目标Redis、迁移任务资源所在VPC是否在同一个VPC内。 
   如果是，则执行[配置在线迁移任务]；如果不是，执行[2]。
   
   
2. 检查源Redis的VPC、目标Redis的VPC、迁移任务资源所在VPC的网络是否打通，确保迁移任务的虚拟机资源能访问源Redis和目标Redis。
   
   如果已打通，则执行[配置在线迁移任务]；如果没打通，则执行[3]。
   
   
3. 执行相应操作，打通网络。
   
   - 当源Redis和目标Redis都属于DCS同一Region，请参考[VPC对等连接说明](https://support.huaweicloud.com/usermanual-vpc/vpc_peering_0000.html)创建对等连接，打通网络。
   
   - 当源Redis和目标Redis属于DCS不同Region，请参考[云连接](https://support.huaweicloud.com/qs-cc/cc_02_0201.html)创建云连接，打通网络。
   
   
   
   
 
 #### 配置在线迁移任务
1. 单击 "继续配置"，配置在线迁移的源Redis、目标Redis等信息。 
   如果还没准备好配置资源，可以单击"立即创建"创建迁移任务，等配置资源准备好后在数据迁移页面单击需要配置的迁移任务右侧的"配置"，继续配置在线迁移任务。
   
   
2. 选择迁移方法。
   
   支持"全量迁移"和"全量迁移＋增量迁移"两种，"全量迁移"和"全量迁移＋增量迁移"的功能及限制如[表1]所示。
   如果实例迁移后需要[交换DCS实例IP]，迁移方法必须选择"全量迁移＋增量迁移"。
    表1在线迁移方法说明 
   | 迁移类型      | 描述                                                                                                                                                                                                                                                                                                     |
   |:---|:---|
   | 全量迁移      | 该模式为Redis的一次性迁移，适用于可中断业务的迁移场景。全量迁移过程中，**如果源Redis有数据更新，这部分更新数据不会被迁移到目标Redi** **s**。                                                                                                                                                                                                                     |
   | 全量迁移＋增量迁移 | 该模式为Redis的持续性迁移，适用于对业务中断敏感的迁移场景。增量迁移阶段通过解析日志等技术， 持续保持源Redis和目标端Redis的数据一致。 增量迁移，**迁移任务会在迁移开始后，一直保持迁移中状态，不会自动停止**。需要您在合适时间，在"操作"列单击"停止"，手动停止迁移。停止后，源端数据不会丢失，只是目标端不再写入数据。增量迁移在传输链路网络稳定情况下是秒级时延，具体的时延情况依赖于网络链路的传输质量。 |
      
   图1选择迁移方法   
   ![](https://support.huaweicloud.com/usermanual-dcs/zh-cn_image_0000001990893853.png "点击放大")
   
   
3. 仅当迁移方法选择"全量迁移+增量迁移"时，支持选择是否启用"带宽限制"。 
   如果启用带宽限制功能，当数据同步速度达到带宽限制时，将限制同步速度的继续增长。
   
   
4. 选择是否"自动重连"。如开启自动重连模式，迁移过程中在遇到网络等异常情况时，会无限自动重连。 
   自动重连模式在无法进行增量同步时，会触发全量同步，增加带宽占用，请谨慎选择。
   
   
5. 分别配置"源数据"和"目标数据"。 
   1. 配置"源Redis类型"和"源Redis实例"："源Redis类型"请选择"云服务Redis"，并在"源Redis实例"处选择需要迁移的源Redis。
      ![](https://support.huaweicloud.com/usermanual-dcs/public_sys-resources/caution_3.0-zh-cn.png)
      源Redis实例为DCS实例时，请不要选择"自建Redis"，否则无法启动迁移。
      
   
   2. 配置"目标Redis类型"和"目标Redis实例"：
      - 如果目标Redis与迁移任务处于相同VPC，或处于同一区域下已打通网络的不同VPC，"目标Redis类型"请选择"云服务Redis"，并在"目标Redis实例"处选择需要迁移的目标Redis。
      
      - 如果目标Redis与迁移任务处于不同区域，"目标Redis类型"请选择"自建Redis"，并在"目标Redis实例"处输入目标Redis的IP地址和端口。如果目标Redis为Cluster集群，需要输入集群所有主节点的IP端口，用英文逗号隔开。例如：192.168.1.1:6379,192.168.0.0:6379
       
   
   3. 分别配置"源Redis实例密码"和"目标Redis实例密码"：如果是密码访问模式实例，在输入连接实例的密码后，单击密码右侧的"测试连接"，检查实例密码是否正确、网络是否连通。如果是免密访问的实例，请直接单击"测试连接"。 此处暂不支持使用Redis实例[账号管理](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-221220.html)功能中创建的ACL账号及密码。
      
   
   4. 在"源DB（可选）"或"目标DB（可选）"中，您可以选择是否需要指定具体迁移的DB。例如源端输入5，目标端输入6时，表示迁移源Redis DB5中的数据到目标Redis的DB6。当源端不指定DB，目标端指定DB时，表示默认迁移源端的全部数据，到目标端指定的DB；当目标端不指定DB时，表示默认迁移到与源端对应的DB。
      ![](https://support.huaweicloud.com/usermanual-dcs/public_sys-resources/caution_3.0-zh-cn.png)
      当源端为多DB，目标端为单DB的DCS实例时（单DB的实例只有DB0），需要源端的所有数据都在DB0，或者指定仅迁移源端某一DB中的数据并将目标端DB指定为0，否则会迁移失败。DCS Redis的DB数请参见[Redis实例是否支持多DB方式？](https://support.huaweicloud.com/dcs_faq/dcs-faq-0427028.html)。
      
   
   
   
   
6. 单击"立即创建"。
7. 确认迁移信息，然后单击"提交"，开始执行迁移任务。 
   可返回迁移任务列表中，观察对应的迁移任务的状态，迁移成功后，任务状态显示"成功"。
   - 如果出现迁移失败，建议单击迁移任务名称，进入迁移任务详情页面，通过"迁移日志"排查迁移失败的原因。
   
   - 如果是全量迁移＋增量迁移，全量迁移后会一直处于增量迁移中的状态。
   
   - 如需手动停止迁移中的任务，勾选迁移任务左侧的方框，单击迁移任务上方的"停止"，即可停止迁移。
   
   - 勾选停止迁移或迁移失败的迁移任务，单击迁移任务上方的"重启"，可重新进行迁移。如果重启迁移任务后迁移失败，建议单击"配置"，重新配置在线迁移任务后重试。
   
   - 单次最多支持勾选50个在线迁移任务，批量停止、删除、或重启迁移任务。
   
   
   
   
 
#### 迁移后验证
迁移完成后，可以通过以下方式确认数据的完整性：
1. 连接源Redis和目标Redis，连接Redis的方式请参考[Redis-cli客户端连接Redis](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713004.html)。
2. 分别对源Redis和目标Redis执行**info keyspace** ，查看keys参数和expires参数的值。
   1. 如果是单机/主备/读写分离/proxy集群实例，执行以下命令：
      ```
      redis-cli -h [ip] -p [port] [-a {password}] info keyspace
      ```
      图2查看单机实例数据   
      ![](https://support.huaweicloud.com/usermanual-dcs/zh-cn_image_0000002530812198.png "点击放大") 
   
   2. 如果是集群实例也可以逐个分片master节点执行info keyspace，这里推荐使用redis-cli 6+版本执行以下命令获取所有redis节点keyspace：
      ```
      redis-cli [-a {password}] --cluster call {分片ip}:{分片port} info keyspace
      ```
      图3查看集群实例数据   
      ![](https://support.huaweicloud.com/usermanual-dcs/zh-cn_image_0000002561892235.png "点击放大") 
    
3. 对比源Redis和目标Redis的keys参数分别减去expires参数的差值（集群实例需要除以2）。如果差值一致，则表示数据完整，迁移正常。
如果是全量迁移，迁移过程中源Redis更新的数据不会迁移到目标实例。
 #### 交换DCS实例IP（可选）
当DCS源Redis与目标Redis满足以下条件时，支持交换源Redis与目标Redis的IP地址。交换实例IP后，客户端代码无需修改源端实例的访问地址，即可自动连接到目标Redis。
**满足交换实例IP的前提条件：**
- Redis 4.0及以上版本的基础版实例支持实例交换IP，**企业版实例不支持实例交换IP**。
- 如果是Redis 3.0实例，需要先[提交工单](https://console.huaweicloud.com/ticket/#/ticketindex/createIndex)联系客服放通Redis 3.0实例交换IP的功能限制，并且仅当Redis 3.0作为源端实例，目标端为Redis 4.0及以上版本的基础版实例时，支持交换实例IP。
- 开启公网访问后的源实例或目标实例，不支持交换IP。
- 源Redis与目标Redis必须是单机、主备、读写分离或Proxy集群实例，**Cluster集群实例不支持交换实例IP**。
- 实例[选择迁移方法]步骤时，必须选择的是"**全量迁移＋增量迁移**"，如果是"全量迁移"的方式，则不支持交换实例IP。
- 源Redis与目标Redis实例的端口需要一致。
![](https://support.huaweicloud.com/usermanual-dcs/public_sys-resources/caution_3.0-zh-cn.png)
1. 交换IP过程中，会自动停止在线迁移任务。
2. 交换实例IP地址时，会有一分钟内只读和秒级的闪断。如果源端实例为Redis 3.0，交换IP地址时，会有一分钟内只读和30秒左右的中断。
3. 请确保您的客户端应用具备重连机制和处理异常的能力，否则在交换IP后有可能需要重启客户端应用。
4. 源实例和目标实例不在同一子网时，交换IP地址后，会更新实例的子网信息。
5. 如果源端是主备实例，交换IP时不会交换备节点IP，请确保应用中没有直接引用备节点IP。
6. 如果应用中有直接引用域名，请选择交换域名，否则域名会挂在源实例中。
7. 请确保目标Redis和源Redis密码一致，否则交换IP后，客户端会出现密码验证错误。
8. 当源实例配置了白名单时，则在进行IP交换前，保证目标实例也配置同样的白名单。
9. Redis 3.0实例交换IP地址后，需要将源实例的安全组配置同步至目标实例的白名单配置中。
 
1. 在"数据迁移 \> 在线迁移"页面，当迁移任务状态显示为"增量迁移中"时，单击操作列的"更多 \> 交换IP"打开交换IP弹框。
2. 在交换IP弹框中，在交换域名区域，选择是否交换域名。 
   - 如果客户端使用域名连接Redis，必须选择交换域名，否则客户端应用需要修改使用的域名。
   
   - 如果没有选择交换域名，则只交换实例的IP地址。
   
   
   
   
3. 单击"确定"，交换IP任务提交成功，当迁移任务的状态显示为"IP交换成功"，表示交换IP任务完成。 
   IP交换成功后，如果需要切换为原IP，单击操作列的"更多 \> 回滚IP"，当任务状态显示为"IP回滚成功"表示IP交换回滚完成。
   
   
 
#### 相关文档
- 数据迁移相关的API文档，请参见[数据迁移](https://support.huaweicloud.com/api-dcs/DataMigrationManagement.html)。
- 数据迁移相关的常见问题：
  - [DCS实例是否兼容低版本Redis迁移到高版本](https://support.huaweicloud.com/dcs_faq/dcs-migration-0715005.html)
  
  - [迁移或导入备份数据时，相同的Key会被覆盖吗？](https://support.huaweicloud.com/dcs_faq/dcs-faq-11185.html)
  
  - [迁移故障处理](https://support.huaweicloud.com/dcs_faq/dcs-migration-022052301.html)
  
  - [数据迁移失败问题排查](https://support.huaweicloud.com/dcs_faq/dcs-migration-0715004.html)
  
  - [Cluster集群实例使用内置key且跨slot的Lua脚本时迁移失败](https://support.huaweicloud.com/dcs_faq/dcs_07_0001.html)
  
  - [一个数据迁移能迁移到多个目标实例么？](https://support.huaweicloud.com/dcs_faq/dcs-faq-220317.html)
  
  - [怎么放通SYNC和PSYNC命令？](https://support.huaweicloud.com/dcs_faq/dcs-faq-210721001.html)
   
 
