
# 通过Redis-Shake迁移工具将自建Redis迁移到GeminiDB Redis
自建Redis到GeminiDB Redis的迁移可以使用Redis-Shake迁移工具。本章节主要介绍使用Redis-Shake迁移工具进行自建Redis到GeminiDB Redis的迁移方案。
#### 迁移原理
使用Redis-Shake迁移工具进行源端Redis到目标端GeminiDB Redis的迁移。迁移过程支持全量+增量迁移，支持单机/主从/Cluster集群/RDB文件等多种Redis数据源。
- 全量迁移原理：工具模拟源端Redis的从节点，通过全量同步获取RDB文件，解析后将数据以命令形式发送给目标端GeminiDB Redis。此外，也可将RDB文件作为数据源，方便地导入某时刻的数据快照。
- 增量迁移原理：全量迁移完成后，工具继续将增量数据以命令形式发送给目标端GeminiDB Redis，直到手动停止工具。
 
#### 使用须知
- 如遇到源端Redis同步脱节，此时需要停止迁移工具，清空目标端数据并重新迁移。为避免此场景，建议在写入流量低峰时段迁移，并可适当调大源端client-output-buffer-limit参数，以增大增量同步的环形缓冲区大小。
- 迁移工具理论上不会对源端数据造成影响，但可能会暂时影响性能。
- 多DB迁移场景，需注意源端与目标端的DB映射关系，避免造成非预期的数据覆盖。
- 暂时不支持stream类型数据的迁移。
- 保证迁移工具Redis-Shake、源端Redis和目标端GeminiDB Redis网络互通。
- 如需进行自建Redis到GeminiDB Redis的迁移支持，您可以在管理控制台右上角，选择"[工单 \> 新建工单](https://console.huaweicloud.com/ticket/#/ticketindex/createIndex)"，联系客服进行处理。
 
#### 开源Redis单机/主从版在线移到GeminiDB Redis
开源Redis单机/主从版除了可以采用上述文件导入方式外，还可以在线迁移到GeminiDB Redis。
1. 部署迁移工具。 
   1. 获取开源工具[Redis-Shake](https://github.com/alibaba/RedisShake/releases/download/release-v2.1.0-20210819/release-v2.1.0-20210819.tar.gz)。
      ![](https://support.huaweicloud.com/redisug-nosql/public_sys-resources/note_3.0-zh-cn.png)
      Redis-Shake工具可下载release版本，解压缩后即可使用。
      
   
   2. 修改配置文件"Redis-Shake.conf"，修改时需要注意以下配置项。 **log.level = info** # 默认日志级别，info级别可以打印出相应的迁移进度，可以用来判断迁移是否结束。
      **source.address = \<host\>:\<port\> #**源端地址，开源redis所在主机及端口。
      **source.password_raw = \*\*\*\*\* #**源端口令。
      **source.type = standalone #**根据源端类型选择。
      **target.address = \<host\>:6379 #**目标端地址。
      **target.password_raw = \*\*\*\*\* #**目标端口令。
      **target.version = 5.0 #**目标端redis版本。
      **target.type = standalone**# 目标端类型。
      **target.db = -1** # 将所有数据迁移到目标端GeminiDB Redis的指定数据库上，若设置为-1，则迁移后的数据库和源实例的DB保持相同的映射关系。
      
   
   3. 按需选配是否覆盖目标端数据。 **key_exists = none**
      ![](https://support.huaweicloud.com/redisug-nosql/public_sys-resources/note_3.0-zh-cn.png)
      当源端和目的端有重复key时需要选配是否覆盖目标端数据，可配置的值为：
      - rewrite：源端覆盖目的端。
      
      - none：一旦发生进程直接退出。
      
      - ignore：保留目的端key，忽略源端的同步key。该值在rump模式下不会生效。
      
      
      由于本次迁移源端是RDB文件，因此预期无重复数据，建议选择none。如迁移过程异常退出，您可以在管理控制台右上角，选择"[工单 \> 新建工单](https://console.huaweicloud.com/ticket/#/ticketindex/createIndex)"，联系客服进行处理。
      
   
   
   
   
2. 进行数据迁移。 
   启动迁移命令：
   **./redis-shake.linux -conf=redis-shake.conf -type=sync**
   - 执行日志中出现如下信息，代表全量数据同步完成，进入增量同步阶段。
     ```
     sync rdb done
     ```
     
   
   - 执行日志出现如下信息时，代表增量同步无新增内容，可以停止程序以中断增量同步。
     ```
     sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
     ```
     
   
   
   
   
3. 数据校验。 
   使[开源Redis单机/主从版在线移到GeminiDB Redis]用工具[RedisFullCheck](https://github.com/alibaba/RedisFullCheck/releases/download/release-v1.4.8-20200212/redis-full-check-1.4.8.tar.gz)进行校验，下载并解压缩后即可使用。
   **./redis-full-check -s SOURCE_IP:SOURCE_PORT -p SOURCE_PWD -t TARGET_IP:6379 -a TARGET_PWD**
   校验完毕出现如下信息表示迁移成功，源端与目的端数据相同。
   ```
   all finish successfully, totally 0 key(s) and 0 field(s) conflict
   ```
   
   
 
#### 开源Redis集群版迁移到GeminiDB Redis
对于开源Redis集群版，需要注意配置文件中以下两项：
**source.address = \<host1\>:\<port1\>,\<host2\>:\<port2\>,\<host2\>:\<port2\>** # 源端各节点所在主机及端口
**source.type =** **cluster** # 源端为cluster集群
其他步骤与[开源Redis单机/主从版在线移到GeminiDB Redis]相同。
#### 开源Codis集群版迁移到GeminiDB Redis
对于Codis集群版，需要获取各个分片所在的主机以及端口，注意配置文件以下两项：
**source.address = \<host1\>:\<port1\>,\<host2\>:\<port2\>,\<host2\>:\<port2\>** # 源端各节点所在主机及端口
**source.type =** **cluster** # 源端为cluster集群
其他步骤与[开源Redis单机/主从版在线移到GeminiDB Redis]相同。
#### 开源Redis全量扫描迁移到GeminiDB Redis
如果以上场景都没法实现，可以采用Redis-Shake的全量扫描(rump)来逐个扫描来进行迁移。
1. 部署迁移工具。 
   1. 获取开源工具[Redis-Shake](https://github.com/alibaba/RedisShake/releases/download/release-v2.1.0-20210819/release-v2.1.0-20210819.tar.gz)。
      ![](https://support.huaweicloud.com/redisug-nosql/public_sys-resources/note_3.0-zh-cn.png)
      Redis-Shake工具可下载release版本，解压缩后即可使用。
      
   
   2. 修改配置文件"Redis-Shake.conf"，修改时需要注意以下配置项。 **log.level = info** # 默认日志级别，info级别可以打印出相应的迁移进度，可以用来判断迁移是否结束。
      **source.address = \<host\>:\<port\> #**源端地址，开源redis所在主机及端口。
      **source.password_raw = \*\*\*\*\* #**源端口令。
      **source.type = standalone #**根据源端类型选择。
      **target.address = \<host\>:6379 #**目标端地址。
      **target.password_raw = \*\*\*\*\* #**目标端口令。
      **target.version = 5.0 #**目标端redis版本。
      **target.type = standalone**# 目标端类型。
      **target.db = -1** # 将所有数据迁移到目标端GeminiDB Redis的指定数据库上，若设置为-1，则迁移后的数据库和源实例的DB保持相同的映射关系。
      
   
   3. 按需选配是否覆盖目标端数据。 **key_exists = none**
      ![](https://support.huaweicloud.com/redisug-nosql/public_sys-resources/note_3.0-zh-cn.png)
      当源端和目的端有重复key时需要选配是否覆盖目标端数据，可配置的值为：
      - rewrite：源端覆盖目的端。
      
      - none：一旦发生进程直接退出。
      
      - ignore：保留目的端key，忽略源端的同步key。该值在rump模式下不会生效。
      
      
      由于本次迁移源端是RDB文件，因此预期无重复数据，建议选择none。如迁移过程异常退出，您可以在管理控制台右上角，选择"[工单 \> 新建工单](https://console.huaweicloud.com/ticket/#/ticketindex/createIndex)"，联系客服进行处理。
      
   
   
   
   
2. 进行数据迁移。 
   启动迁移命令：
   **./redis-shake.linux -conf=redis-shake.conf -type=rump**
   - 执行日志中出现如下信息，代表全量数据同步完成。
     ```
     dbRumper[0] executor[0] finish
     ```
     
   
   
   
   
3. 数据校验。 
   使用工具[RedisFullCheck](https://github.com/alibaba/RedisFullCheck/releases/download/release-v1.4.8-20200212/redis-full-check-1.4.8.tar.gz)进行校验，下载并解压缩后即可使用。
   **./redis-full-check -s SOURCE_IP:SOURCE_PORT -p SOURCE_PWD -t TARGET_IP:6379 -a TARGET_PWD**
   校验完毕出现如下信息表示迁移成功，源端与目的端数据相同。
   ```
   all finish successfully, totally 0 key(s) and 0 field(s) conflict
   ```
   
   
注：使用redis-shake v2迁移过程中，常见问题及解决方法请参考[redis‐shake 2.x 常见问题](https://github.com/tair-opensource/RedisShake/wiki/redis‐shake-2.x-常见问题)。
#### 迁移后Redis数据一致性校验
迁移完成后，您可以对Redis数据做一致性校验。
![](https://support.huaweicloud.com/redisug-nosql/public_sys-resources/note_3.0-zh-cn.png)
- Redis迁移已完成或者已经进入增量状态。
- 需要ECS实例部署Redis-Full-Check开源工具，并确保与源端、目标端网络互通。
- 如果迁移任务处于增量状态，由于迁移源端和目标端间存在网络时延，无法确保校验时数据一致，如有条件，建议停止对源端的写入后再做校验。
- 业务使用Redis时往往存在给key设置过期时间，迁移时key过期行为会影响数据一致性，如果检验结果不一致，可能是由于key过期时间不一致导致。

- 云厂商DTS在迁移过程中会往目标端Redis写入临时探活key，校验时可能发现非业务数据，属于正常现象。
 
**操作步骤**：
1. 登录ECS实例，确保能连上源端和目标端Redis。
2. 部署[redis-full-check](https://github.com/alibaba/RedisFullCheck/releases?spm=a2c4g.11186623.0.0.7f6e5e58EyObOU)工具。
3. 执行以下命令进行数据校验。 
   /redis-full-check -s {源端IP}:{源端端口} -p {源端密码} -t {目标端IP}:{目标端端口} -a {目标端密码} -m 1
   表1参数说明 
   | 参数 | 参数                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | 参数示例             |
   |:---|:---|:---|
   | -s | 源端Redis连接地址和端口。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | -s 10.0.0.1:6379 |
   | -p | 源端Redis密码。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | -                |
   | -t | 目标端Redis连接地址和端口。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | -t 10.0.0.2:6379 |
   | -a | 目标端Redis密码。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | -                |
   | -m | 校验模式： 1. 全量校验所有键值对。  2. 仅校验值的长度。  3. 仅校验key完整性。  4. 全量校验所有键值，但只校验大key的长度。   默认为模式2。 | -m 1             |
   | -q | 最大qps限制，默认15000。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | -q 5000          |
   | -d | 校验结果保存的文件名称，默认result.db。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | -d result.db     |
      
   
   
4. 查看校验结果文件。 
   校验默认执行三轮，输出三个校验结果文件，一般只需要看最后一个校验结果文件。
   - 执行sqlite3 result.db.3。
   
   - 执行select \* from key。
   
   - 查看是否存在异常的key。 ![](https://support.huaweicloud.com/redisug-nosql/zh-cn_image_0000002154295977.png)
     
   
   
   
   
 
