
# 使用Redis-cli离线迁移自建Redis（RDB文件）
Redis-cli是Redis自带的一个命令行工具，安装Redis后即可直接使用Redis-cli工具。Redis-cli提供了RDB文件导出功能，如果Redis服务不支持获取AOF文件，可以尝试通过Redis-cli获取RDB文件。然后再通过其他工具（如RedisShake）导入到DCS的缓存实例中。如果是需要通过OBS桶将源端备份数据迁移到DCS缓存实例，请参见[使用备份文件离线迁移自建Redis](https://support.huaweicloud.com/usermanual-dcs/dcs-migration-190703002.html#dcs-migration-190703002)。
#### 约束与限制
- 建议选择业务量较少的时间段进行迁移。
- 源端为Redis原生集群的数据时，需要针对集群的每个节点分别导出数据，然后逐一导入数据。
- 开启了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)。
- **自建的源Redis实例必须放通SYNC命令**，否则无法使用Redis-cli导出RDB文件。
 
#### 导出RDB文件
1. 导出前准备。 对于主备或集群实例，数据写入RDB文件有一定的时延，时延策略配置在redis.conf文件中。建议先了解待迁移Redis实例的RDB策略配置，然后暂停业务系统并向Redis实例写入满足数量条件的测试数据，确保RDB文件为最新生成。
   例如，redis.conf中对RDB的默认策略配置如下：
   ```
   save 900 1 //900秒内有数据变更则写入RDB文件
   save 300 10  //300秒内有10条以上数据变更则写入RDB文件
   save 60 10000 //60秒内有10000条以上数据变更则写入RDB文件
   ```
   因此，可以参考以上数据写入RDB的策略，在停止业务系统后，向Redis实例写入一定数量的测试数据，触发策略并写入RDB文件，确保业务数据均已同步到RDB文件中。
   测试数据可以在导入后删除。
   ![](https://support.huaweicloud.com/usermanual-dcs/public_sys-resources/note_3.0-zh-cn.png)
   - 如果有某个数据库没有被业务系统使用，可以将测试数据写入该数据库，待导入DCS后，使用flushdb命令清空该数据库。
   
   - 单机实例如果不做持久化配置，则RDB文件需要临时生成，导出耗时较主备实例相比稍多一些。
     
2. 登录弹性云服务器。
3. 安装Redis-cli客户端。该操作以客户端安装在Linux系统上为例进行说明。
   1. 执行如下命令下载Redis。您也可以安装其他Redis版本。具体操作，请参见[Redis官网](https://redis.io/download?spm=a2c4g.11186623.2.15.4e732074zS4LSS#installation)。
      ```
      wget http://download.redis.io/releases/redis-5.0.8.tar.gz
      ```
      
   
   2. 执行如下命令，解压Redis客户端源码包。
      ```
      tar -xzf redis-5.0.8.tar.gz
      ```
      
   
   3. 进入Redis目录并编译Redis客户端源码。
      ```
      cd redis-5.0.8
      cd src
      make
      ```
      
    
4. 使用如下命令导出RDB文件：
   ```
   redis-cli -h {source_redis_address} -p {port} -a {password} --rdb {output.rdb}
   ```
   {source_redis_address}为源Redis的连接地址，{port}为源Redis的端口，{password}为源Redis的连接密码，{output.rdb}为RDB文件名。
   执行命令后回显"Transfer finished with success."，表示文件导出成功。
   
 
#### 上传RDB文件至华为云ECS
为节省传输时间，建议先压缩RDB文件，再将压缩文件（如以SFTP方式）上传到华为云ECS。
ECS需保证有足够的磁盘空间，供数据文件解压缩，同时要与缓存实例网络互通，通常要求相同VPC和相同子网，且安全组规则不限制访问端口。安全组设置请参考[如何选择和配置安全组](https://support.huaweicloud.com/dcs_faq/dcs-faq-0713002.html)。
#### 导入数据
可借助RedisShake工具完成数据导入。
VPC内导入RDB文件，平均100w数据（每条数据20字节），大概4\~10秒完成。
#### 迁移后验证
数据迁移前如果目标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参数的差值。如果差值一致，则表示数据完整，迁移正常。
如果导入不成功，请检查操作步骤，如果是导入命令不正确，建议使用flushall或者flushdb命令清理目标实例中的缓存数据，修改导入命令后重新导入。
