
# 使用RedisShake工具在线迁移自建Redis Cluster集群
RedisShake是一款开源的Redis迁移工具，支持Cluster集群的在线迁移与离线迁移（备份文件导入）。DCS Cluster集群与Redis Cluster集群设计一致，数据可平滑迁移。
本文以Linux系统环境为例，介绍如何使用RedisShake工具将自建Redis Cluster集群的数据在线迁移到DCS Cluster集群。
#### 约束与限制
- 使用RedisShake工具将自建的Redis Cluster在线迁移到DCS Cluster集群，需要源Redis与目标Redis网络连通，或者通过一台中转云服务器连通两端的Cluster集群实例。
- 开启了SSL的目标实例不支持数据迁移，需要关闭目标实例SSL后再进行迁移，开启或关闭SSL的操作请参考[配置Redis SSL数据加密传输](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-023129.html)。
 
#### 前提条件
- 如果您还没有目标Redis，请先创建目标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有的数据会保留。

- 已创建弹性云服务器ECS，创建弹性云服务器的方法，请参见[创建弹性云服务器](https://support.huaweicloud.com/usermanual-ecs/ecs_03_7002.html)。
  ECS请选择与DCS Cluster集群实例相同虚拟私有云、子网和安全组，并且需要绑定弹性公网IP。
  
- 自建的源Redis 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。本文以下载4.3.2版本为例，您可以根据实际需要下载其他[RedisShake版本](https://github.com/alibaba/RedisShake/releases)。
   ```
   wget https://github.com/tair-opensource/RedisShake/releases/download/v4.3.2/redis-shake-v4.3.2-linux-amd64.tar.gz
   ```
   
3. 执行命令解压RedisShake文件。
   ```
   mkdir redis-shake-v4.3.2
   tar -C redis-shake-v4.3.2 -xzvf redis-shake-v4.3.2-linux-amd64.tar.gz
   ```
   ![](https://support.huaweicloud.com/usermanual-dcs/zh-cn_image_0000001964418130.png "点击放大")
   
4. 执行命令进入解压后的文件目录。
   ```
   cd redis-shake-v4.3.2
   ```
   
5. 编辑RedisShake工具配置文件shake.toml，补充源端与目标端信息。
   ```
   vim shake.toml
   ```
   修改内容如下：
   ```
   [sync_reader]
   #源端实例是Redis Cluster集群时，配置为true
   cluster = true
   #源端Cluster集群任意一个节点的IP地址与端口
   address = {redis_ip}:{redis_port}
   #如果无密码，本项不填      
   password = {source_redis_password}
   [redis_writer]
   #目标端实例是Redis Cluster集群时，配置为true
   cluster = true
   #目标端Cluster集群任意一个节点的IP地址与端口
   address = {redis_ip}:{redis_port}
   #如果无密码，本项不填      
   password = {target_redis_password}
   ```
   修改后按下Esc键退出编辑模式，输入**:wq** **！**按回车键保存配置并退出编辑界面。
   
 
#### 在线迁移数据
使用如下命令同步源Redis集群和目标Redis集群数据：
```
./redis-shake shake.toml
```
执行日志中出现如下信息，代表全量数据同步完成，进入增量同步阶段：
```
syncing aof
```
执行日志出现如下信息时，代表增量同步无新增内容，可手动停止同步（Ctrl + C）：
```
write_ops=[0.00], src-*, syncing aof, diff=[0]
```
图1RedisShake在线迁移示意图   
![](https://support.huaweicloud.com/usermanual-dcs/zh-cn_image_0000002000818973.png "点击放大")
#### 迁移后验证
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配置文件中的配置。
 
