
# 使用RedisShake工具离线迁移自建Redis Cluster集群
RedisShake是一款开源的Redis迁移工具，支持Cluster集群的在线迁移与离线迁移（备份文件导入）。DCS Cluster集群与Redis Cluster集群设计一致，数据可平滑迁移。与在线迁移相比，离线迁移适用于源实例与目标实例的网络无法连通，或者源端实例部署在其他云厂商Redis服务中，无法实现在线迁移的场景。
本文以Linux系统环境为例，介绍如何使用RedisShake工具将自建的Redis Cluster离线迁移到DCS Cluster集群。
#### 约束与限制
开启了SSL的目标实例不支持数据迁移，需要关闭目标实例SSL后再进行迁移，开启或关闭SSL的操作请参考[配置Redis SSL数据加密传输](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-023129.html)。
#### 前提条件
- 已创建DCS Cluster集群Redis，创建Redis的方法，请参见[购买Redis实例](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713002.html)。
  创建的目标Redis内存规格不能小于源Redis。
  
- 已创建弹性云服务器ECS，创建弹性云服务器的方法，请参见[购买弹性云服务器](https://support.huaweicloud.com/usermanual-ecs/ecs_03_7002.html)。ECS请选择与DCS Cluster集群实例相同虚拟私有云、子网和安全组。
 
#### 获取源Redis和目标Redis节点信息
1. 分别连接源端和目标端Redis。连接Redis的方法请参考[Redis-cli客户端连接Redis](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713004.html)。
2. 在线迁移Cluster集群时需要将Cluster集群各个节点数据分别迁移。执行如下命令分别查询源端和目标Cluster集群的所有节点的IP地址与端口：
   ```
   redis-cli -h {redis_address} -p {redis_port} -a {redis_password} cluster nodes
   ```
   {redis_address}为Redis的连接地址，{redis_port}为Redis的端口，{redis_password}为Redis的连接密码。
   在命令返回的结果中，获取所有master节点的IP端口。
   ![](https://support.huaweicloud.com/usermanual-dcs/zh-cn_image_0000002001365365.png "点击放大")
   
 
#### 安装RedisShake
1. 登录弹性云服务器ECS。
2. 在ECS中执行以下命令下载RedisShake。本文以下载2.1.2版本为例，您可以根据实际需要下载其他[RedisShake版本](https://github.com/alibaba/RedisShake/releases)。
   ```
   wget https://github.com/tair-opensource/RedisShake/releases/download/release-v2.1.2-20220329/release-v2.1.2-20220329.tar.gz
   ```
   
3. 执行命令解压RedisShake文件。
   ```
   tar -xvf release-v2.1.2-20220329.tar.gz
   ```
   ![](https://support.huaweicloud.com/usermanual-dcs/zh-cn_image_0000001964888588.png "点击放大")
   如果源Cluster部署在数据中心内网，则需在内网服务器上安装RedisShake，并参考[导出备份文件]导出源Cluster备份文件，然后将备份文件上传到弹性云服务器。
   
 
 #### 导出备份文件
1. 执行命令进入解压后的RedisShake文件目录。
   ```
   cd bin
   ```
   ![](https://support.huaweicloud.com/usermanual-dcs/zh-cn_image_0000002289570913.png "点击放大")
   
2. 编辑RedisShake工具配置文件redis-shake.conf，补充源端所有master节点的连接信息。
   ```
   vim redis-shake.conf
   ```
   修改内容如下：
   ```
   source.type = cluster
   #如果无密码，本项不填
   source.password_raw = {source_redis_password}
   #源Cluster集群所有master节点的IP地址与端口，以分号分隔
   source.address = {master1_ip}:{master1_port};{master2_ip}:{master2_port}…{masterN_ip}:{masterN_port}
   ```
   修改后按下Esc键退出编辑模式，输入**:wq** **！**按回车键保存配置并退出编辑界面。
   
3. 执行以下命令导出源Redis集群的RDB格式备份文件。
   ```
   ./redis-shake -type dump -conf redis-shake.conf
   ```
   执行日志中出现如下信息时导出备份文件完成：
   ```
   execute runner[*run.CmdDump] finished!
   ```
   
 
#### 导入备份文件
1. 将导出的RDB备份文件（含多个）上传到与云服务器上。云服务器与目标端DCS Cluster集群实例的网络连通。
2. 编辑RedisShake工具配置文件redis-shake.conf。补充目标端所有master节点的连接信息。
   ```
   vim redis-shake.conf
   ```
   修改内容如下：
   ```
   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.
   ```
   
 
#### 迁移后验证
1. 数据同步结束后，连接DCS Cluster集群，连接Redis的方法请参考[Redis-cli客户端连接Redis](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713004.html)。
2. 通过info命令查看Keyspace中的Key数量，确认数据是否完整导入。 如果数据不完整，可使用flushall或者flushdb命令清理目标实例中的缓存数据后重新迁移。
   
3. 迁移验证完成后，建议及时清理RedisShake配置文件中的配置。
 
