
# Kvrocks到GeminiDB Redis的迁移
Kvrocks是一款开源的兼容Redis生态的NoSQL key-value数据库，底层基于RocksDB实现，并提供namespace功能支持数据分区。Kvrocks集群管理功能相对薄弱，自建集群时需要与外部组件配合，Kvrocks支持的redis命令还不够全面，例如缺少在消息流和统计场景经常使用的stream及hyperloglog数据结构。
GeminiDB Redis接口是一款兼容Redis生态的云原生NoSQL数据库，基于共享存储池的多副本强一致机制，保证数据的安全可靠。GeminiDB Redis接口具有高兼容、高性价比、高可靠、弹性伸缩、高可用、无损扩容等特点。不亚于RedisCluster的兼容度，使用户在应用时无需修改代码，可直接使用，100%兼容原生接口。GeminiDB Redis接口在适配Kvrocks业务的同时，还能克服管理能力弱、对Redis兼容度不高等缺点。
本章节主要介绍Kvrocks到GeminiDB Redis接口的迁移方案。
#### 迁移原理
使用开源工具kvrocks2redis进行Kvrocks到GeminiDB Redis的迁移，在此基础上，从GeminiDB Redis源码层面对Kvrocks的namespace功能进行适配。
迁移过程分为全量和增量两个阶段：迁移开始后，先进行全量迁移，此时对kvrocks打快照，并记录对应的数据版本（seq）。然后解析全量数据文件成redis命令写入GeminiDB Redis。全量迁移完成后进入持续的增量迁移过程，迁移工具循环给Kvrocks发送PSYNC命令，将获取到的增量数据不断转发给GeminiDB Redis，完成增量迁移 。
#### 使用须知
- kvrocks2redis需要从Kvrocks提取数据到本地文件，并从中解析出命令发送到目标端GeminiDB Redis ，该过程中可能影响源端性能，但理论上不会有数据受损风险。
- 迁移工具运行过程中，若出现问题，迁移工具会自动停止，方便问题定位。
- GeminiDB Redis接口从安全性角度出发，不提供清库语义命令，因此要在迁移开始前确保无数据。
 
#### 前提条件
- 部署kvrocks2redis到独立主机。
- 确保源端、目标端、迁移工具之间网络互通。
- 源端Kvrocks实例提前做好数据备份。
- 目标端GeminiDB Redis实例清空全部数据。
 
#### 操作步骤
如需进行Kvrocks到GeminiDB Redis的迁移，您可以在管理控制台右上角，选择"[工单 \> 新建工单](https://console.huaweicloud.com/ticket/#/ticketindex/createIndex)"，联系客服进行处理。
#### 迁移后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)
     
   
   
   
   
 
