
# 使用RedisShake离线迁移其他云厂商Redis
RedisShake是一款开源的Redis迁移工具，支持Cluster集群的在线迁移与离线迁移（备份文件导入）。当部署在其他云厂商Redis服务上的Cluster集群数据，无法在线迁移时，可以选择离线迁移。
与在线迁移相比，离线迁移适用于源实例与目标实例的网络无法连通的场景，或者源端实例部署在其他云厂商Redis服务中，无法实现在线迁移。
本文以Linux系统环境为例，介绍如何使用RedisShake工具进行Cluster集群数据离线迁移。
#### 约束与限制
开启了SSL的目标实例不支持数据迁移，需要关闭目标实例SSL后再进行迁移，开启或关闭SSL的操作请参考[配置Redis SSL数据加密传输](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-023129.html)。
#### 前提条件
- 已创建[Redis实例](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713002.html)，注意创建的Cluster集群内存规格不能小于源端Cluster集群。
- 已创建用于运行RedisShake的[弹性云服务器(ECS)](https://support.huaweicloud.com/usermanual-ecs/ecs_03_7002.html)弹性云服务器(ECS)，创建的ECS需要选择与Redis实例相同的VPC、子网和安全组。
 
#### 迁移步骤
1. 使用[Redis-cli连接](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713004.html)目标端Redis实例，获取目标端Cluster集群的Master节点IP地址与端口。
   ```
   redis-cli -h {target_redis_address} -p {target_redis_port} -a {target_redis_password} cluster nodes
   ```
   - {target_redis_address}：目标Redis实例的连接地址。
   
   - {target_redis_port}：目标Redis实例的连接端口号。
   
   - {target_redis_password}：目标Redis实例的连接密码。
   
   
   在命令返回的结果中，获取所有master节点的IP端口，如下如所示：
   ![](https://support.huaweicloud.com/usermanual-dcs/zh-cn_image_0293282053.png "点击放大")
   
2. 在准备好的华为云ECS上安装迁移工具RedisShake。
   1. 登录华为云ECS。
   
   2. 在华为云ECS中执行以下命令下载RedisShake，本文以下载2.0.3版本为例进行说明。您可以根据实际需要下载其他[RedisShake版本](https://github.com/alibaba/RedisShake/releases)。
      ```
      wget https://github.com/tair-opensource/RedisShake/releases/download/release-v2.0.3-20200724/redis-shake-v2.0.3.tar.gz
      ```
      
   
   3. 执行命令解压RedisShake文件。
      ```
      tar -xvf redis-shake-v2.0.3.tar.gz
      ```
      如果源端集群部署在数据中心内网，还需在内网服务器上安装RedisShake，并参考下述步骤进行数据导出，然后将数据文件上传到云服务器。
      
    
3. 从源端Redis控制台导出RDB文件，如果无法导出RDB文件，请联系源端客服获取。
4. 导入RDB文件。
   1. 将导出的RDB文件（含多个）上传到云服务器上。云服务器与目标端DCS Cluster集群实例的网络连通。
   
   2. 编辑RedisShake工具配置文件redis-shake.conf。
      ```
      vim redis-shake.conf
      ```
      补充目标端所有master节点的连接信息：
      ```
      target.type = cluster
      #如果无密码，本项不填
      target.password_raw = {target_redis_password}
      #目标Cluster集群所有master节点的IP地址与端口，以分号分隔
      target.address = {master1_ip}:{master1_port};{master2_ip}:{master2_port}…{masterN_ip}:{masterN_port}
      #需要导入的rdb文件列表，用分号分隔
      rdb.input = {local_dump.0};{local_dump.1};{local_dump.2};{local_dump.3}
      ```
      编辑完成后，按下Esc键退出编辑模式，输入**:wq** **！**按回车键保存配置并退出编辑界面。
      
   
   3. 使用如下命令导入RDB文件到目标Cluster集群：
      ```
      ./redis-shake -type restore -conf redis-shake.conf
      ```
      执行日志中出现如下信息时导入备份文件完成：
      ```
      Enabled http stats, set status (incr), and wait forever.
      ```
      
    
5. 迁移后验证。 数据迁移前如果目标Redis中数据为空，迁移完成后，可以通过以下方式确认数据的完整性：
   1. 连接源Redis和目标Redis。连接Redis的方法请参考[Redis-cli客户端连接Redis](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713004.html)。
   
   2. 输入info keyspace，查看keys参数和expires参数的值。 ![](https://support.huaweicloud.com/usermanual-dcs/zh-cn_image_0293255709.png)
      
   
   3. 对比源Redis和目标Redis的keys参数分别减去expires参数的差值。如果差值一致，则表示数据完整，迁移正常。
    
 
