Skip to content

Redis 迁移工具

迁移工具分类

1. 官方工具

工具名称功能描述适用场景优点缺点
redis-cli基本数据导入导出小规模数据迁移简单易用,无需额外安装性能较低,不支持大规模数据迁移
redis-server --slaveof主从同步迁移主从架构迁移官方支持,可靠性高仅支持主从架构,灵活性差

2. 第三方工具

工具名称功能描述适用场景优点缺点
Redis-Shake高性能数据迁移大规模数据迁移、跨版本迁移性能高,支持多种源和目标配置复杂,需要学习成本
Redis-Migrate-Tool多源数据迁移复杂拓扑迁移支持多源合并,灵活配置维护较少,可能存在兼容性问题
RedisDump数据导入导出小规模数据迁移、跨云迁移支持JSON格式,便于调试性能较低,不支持大规模数据
redis-port字节级数据迁移高性能数据迁移性能极高,支持断点续传配置复杂,学习曲线陡
DBForge Studio for RedisGUI迁移工具可视化迁移操作简单,可视化界面付费工具,性能一般

常用迁移工具详解

1. redis-cli

1.1 基本使用

  • 导出数据

    bash
    # 导出所有键
    redis-cli --raw dump <key> > <key>.rdb
    
    # 导出所有键到文件
    redis-cli keys "*" | while read key; do redis-cli --raw dump $key > "$key.rdb"; done
    
    # 使用--pipe导出数据
    redis-cli --pipe > dump.rdb << EOF
    keys *
    EOF
  • 导入数据

    bash
    # 导入单个键
    redis-cli restore <key> 0 < <key>.rdb
    
    # 批量导入数据
    cat dump.rdb | redis-cli --pipe

1.2 适用场景

  • 小规模数据迁移(< 1GB)
  • 简单的键值对迁移
  • 开发和测试环境迁移
  • 紧急情况下的数据恢复

1.3 最佳实践

  • 对于大规模数据,不建议使用redis-cli
  • 使用--pipe模式提高导入导出速度
  • 导出前确保数据一致性
  • 导入前备份目标Redis数据

2. Redis-Shake

2.1 工具介绍

Redis-Shake是阿里巴巴开源的高性能Redis数据迁移工具,支持多种源和目标,包括:

  • 单实例Redis
  • Redis主从集群
  • Redis Sentinel
  • Redis Cluster
  • 云Redis服务(如阿里云Redis、AWS ElastiCache等)

2.2 安装

bash
# 下载最新版本
wget https://github.com/alibaba/RedisShake/releases/download/v3.0.0/redis-shake-linux-amd64.tar.gz

# 解压
mkdir -p redis-shake
mv redis-shake-linux-amd64.tar.gz redis-shake/
cd redis-shake
 tar -xzf redis-shake-linux-amd64.tar.gz

# 赋予执行权限
chmod +x redis-shake

2.3 配置文件

yaml
# redis-shake.yaml 示例
source:
  version: 6.0  # 源Redis版本
  address: "127.0.0.1:6379"  # 源Redis地址
  password: ""  # 源Redis密码
  auth_type: "auth"  # 认证类型
  connection_timeout: 30000  # 连接超时时间(毫秒)
  tls: false  # 是否启用TLS

target:
  version: 7.0  # 目标Redis版本
  type: "cluster"  # 目标类型:single, master-slave, cluster
  address: "127.0.0.1:7000,127.0.0.1:7001,127.0.0.1:7002"  # 目标Redis地址
  password: ""  # 目标Redis密码
  auth_type: "auth"  # 认证类型
  connection_timeout: 30000  # 连接超时时间(毫秒)
  tls: false  # 是否启用TLS

advanced:
  dir: "data"  # 数据目录
  parallel: 32  # 并发数
  jitter: 1000  # 抖动时间(毫秒)
  log_file: "redis-shake.log"  # 日志文件
  log_level: "info"  # 日志级别
  metric_port: 9320  # 监控端口
  pprof_port: 9330  # 性能分析端口
  read_buffer_size: 16777216  # 读取缓冲区大小(字节)
  write_buffer_size: 16777216  # 写入缓冲区大小(字节)

rdb:
  backup: true  # 是否备份RDB文件
  restore: true  # 是否恢复RDB文件
  filter_db: []  # 过滤数据库
  filter_key: []  # 过滤键

sync:
  source_id: ""  # 源ID
  target_id: ""  # 目标ID
  aof: false  # 是否同步AOF
  rdb: true  # 是否同步RDB
  full_sync: true  # 是否全量同步
  incr_sync: true  # 是否增量同步
  replay: false  # 是否重放
  discard: false  # 是否丢弃
  rewrite: false  # 是否重写
  psync: true  # 是否使用PSYNC
  replica_offset: -1  # 复制偏移量
  replica_replid: ""  # 复制ID

2.4 运行Redis-Shake

  • 全量+增量迁移

    bash
    ./redis-shake -type=sync -conf=redis-shake.yaml
  • 仅全量迁移

    bash
    ./redis-shake -type=restore -conf=redis-shake.yaml
  • 仅增量迁移

    bash
    ./redis-shake -type=psync -conf=redis-shake.yaml

2.5 适用场景

  • 大规模数据迁移(> 10GB)
  • 跨版本迁移(如Redis 5.0 → 7.0)
  • 跨架构迁移(如单实例 → 集群)
  • 跨云迁移(如AWS → 阿里云)

3. Redis-Migrate-Tool

3.1 安装

bash
# 安装依赖
sudo apt-get install -y gcc make libssl-dev libglib2.0-dev libmysqlclient-dev

# 克隆源码
git clone https://github.com/vipshop/redis-migrate-tool.git
cd redis-migrate-tool

# 编译安装
./autogen.sh
./configure
make
make install

3.2 配置文件

ini
# redis-migrate-tool.conf 示例
[source]
type: single
servers:
- 127.0.0.1:6379

[target]
type: cluster
servers:
- 127.0.0.1:7000

[common]
listen: 0.0.0.0:8888
threads: 32
step: 1
mbuf_size: 512
source_safe: true
target_safe: true

3.3 运行Redis-Migrate-Tool

bash
# 启动迁移
redis-migrate-tool -c redis-migrate-tool.conf

# 查看迁移状态
redis-cli -p 8888 info

# 停止迁移
redis-cli -p 8888 shutdown

3.4 适用场景

  • 复杂拓扑迁移(如多源合并)
  • 混合架构迁移(如主从 → 集群)
  • 大规模数据迁移

4. RedisDump

4.1 安装

bash
# 使用gem安装
gem install redis-dump

# 使用Docker运行
docker pull rediscommander/redis-dump

4.2 基本使用

  • 导出数据

    bash
    # 导出所有数据到JSON文件
    redis-dump -h <source-host> -p <source-port> -a <password> > dump.json
    
    # 导出特定数据库
    redis-dump -h <source-host> -p <source-port> -d <db> -a <password> > dump.json
    
    # 导出特定模式的键
    redis-dump -h <source-host> -p <source-port> -f "pattern:*" -a <password> > dump.json
  • 导入数据

    bash
    # 从JSON文件导入数据
    < dump.json redis-load -h <target-host> -p <target-port> -a <password>
    
    # 导入到特定数据库
    < dump.json redis-load -h <target-host> -p <target-port> -d <db> -a <password>

4.3 适用场景

  • 小规模数据迁移(< 5GB)
  • 跨云迁移
  • 开发和测试环境迁移
  • 需要JSON格式数据的场景

5. redis-port

5.1 安装

bash
# 下载二进制文件
wget https://github.com/CodisLabs/redis-port/releases/download/v1.0/redis-port-linux-amd64.tar.gz

# 解压
tar xzf redis-port-linux-amd64.tar.gz
cd redis-port-linux-amd64

5.2 基本使用

  • 全量迁移

    bash
    ./redis-port restore --input "redis://<source-host>:<source-port>" --output "redis://<target-host>:<target-port>"
  • 增量迁移

    bash
    ./redis-port sync --input "redis://<source-host>:<source-port>" --output "redis://<target-host>:<target-port>"
  • 集群迁移

    bash
    ./redis-port restore --input "redis://<source-host>:<source-port>" --output "redis-cluster://<target-host1>:<target-port1>,<target-host2>:<target-port2>"

5.3 适用场景

  • 极高性能要求的迁移场景
  • 大规模数据迁移(> 50GB)
  • 需要断点续传的场景

迁移场景与工具选择

1. 单实例 → 单实例

工具推荐指数理由
redis-cli⭐⭐⭐简单易用,适合小规模数据
Redis-Shake⭐⭐⭐⭐⭐高性能,支持全量+增量
RedisDump⭐⭐⭐适合小规模数据,支持JSON格式
redis-port⭐⭐⭐⭐高性能,支持断点续传

2. 单实例 → 集群

工具推荐指数理由
Redis-Shake⭐⭐⭐⭐⭐官方推荐,支持跨架构迁移
Redis-Migrate-Tool⭐⭐⭐⭐支持集群目标,配置灵活
redis-port⭐⭐⭐⭐高性能,支持集群目标

3. 主从 → 集群

工具推荐指数理由
Redis-Shake⭐⭐⭐⭐⭐支持主从源和集群目标
Redis-Migrate-Tool⭐⭐⭐⭐支持复杂拓扑迁移

4. 集群 → 集群

工具推荐指数理由
Redis-Shake⭐⭐⭐⭐⭐高性能,支持集群间迁移
redis-port⭐⭐⭐⭐极高性能,适合大规模集群

5. 跨版本迁移

工具推荐指数理由
Redis-Shake⭐⭐⭐⭐⭐官方支持跨版本,兼容性好
Redis-Migrate-Tool⭐⭐⭐支持跨版本,但兼容性一般

6. 跨云迁移

工具推荐指数理由
Redis-Shake⭐⭐⭐⭐⭐支持跨网络,性能高
RedisDump⭐⭐⭐支持JSON格式,便于传输
DBForge Studio for Redis⭐⭐可视化操作,适合跨云

迁移最佳实践

1. 迁移前准备

  • 评估迁移规模

    bash
    # 评估数据量
    redis-cli dbsize
    redis-cli info memory | grep used_memory_human
    
    # 评估键数量
    redis-cli keys "*" | wc -l
    
    # 评估平均键大小
    redis-cli --bigkeys
  • 选择合适的迁移工具

    • 小规模数据(< 5GB):redis-cli、RedisDump
    • 中规模数据(5GB - 50GB):Redis-Shake、Redis-Migrate-Tool
    • 大规模数据(> 50GB):Redis-Shake、redis-port
  • 准备目标环境

    bash
    # 确保目标Redis版本兼容
    redis-cli -h <target-host> -p <target-port> info server | grep redis_version
    
    # 确保目标Redis有足够的内存
    redis-cli -h <target-host> -p <target-port> config get maxmemory
    
    # 确保目标Redis连接正常
    redis-cli -h <target-host> -p <target-port> ping

2. 迁移过程

  • 选择合适的迁移时间

    • 业务低峰期
    • 有足够的时间进行迁移和验证
    • 相关团队人员可参与
  • 监控迁移进度

    bash
    # 监控Redis-Shake迁移进度
    curl http://localhost:9320/metrics
    
    # 监控Redis-Migrate-Tool进度
    redis-cli -p 8888 info
  • 验证迁移数据

    bash
    # 比较源和目标的数据量
    source_size=$(redis-cli -h <source-host> dbsize)
    target_size=$(redis-cli -h <target-host> dbsize)
    echo "Source size: $source_size, Target size: $target_size"
    
    # 抽样比较数据
    redis-cli -h <source-host> get <key> > source_value.txt
    redis-cli -h <target-host> get <key> > target_value.txt
    diff source_value.txt target_value.txt

3. 迁移后处理

  • 切换应用连接

    bash
    # 更新应用配置,将Redis连接指向新实例
    # 例如,修改配置文件中的redis.host和redis.port
    
    # 重启应用或刷新配置
    systemctl restart <application>
  • 监控新实例性能

    bash
    # 监控内存使用
    redis-cli -h <target-host> info memory | grep used_memory
    
    # 监控命令执行速度
    redis-cli -h <target-host> info stats | grep instantaneous_ops_per_sec
    
    # 监控连接数
    redis-cli -h <target-host> info clients | grep connected_clients
  • 清理旧实例

    bash
    # 停止旧实例
    systemctl stop redis-old
    
    # 备份旧数据
    cp /var/lib/redis-old/dump.rdb /backup/redis-old/dump-$(date +%Y%m%d).rdb
    
    # 删除旧实例(可选)
    systemctl disable redis-old
    apt-get remove redis-server

常见问题(FAQ)

Q1: 迁移过程中数据不一致怎么办?

A1: 数据不一致的解决方法:

  1. 确保使用支持全量+增量同步的工具(如Redis-Shake)
  2. 在迁移完成后,验证源和目标的数据量和关键数据
  3. 对于最终一致性要求高的场景,考虑在业务低峰期进行迁移
  4. 使用Redis-Shake的checksum功能验证数据一致性

Q2: 大规模数据迁移如何提高性能?

A2: 提高迁移性能的方法:

  1. 增加迁移工具的并发数(如Redis-Shake的parallel参数)
  2. 优化源和目标Redis的配置,如增加maxclients、调整内存配置
  3. 确保源和目标之间的网络带宽充足
  4. 使用高性能迁移工具(如redis-port、Redis-Shake)
  5. 考虑分批次迁移,避免一次性迁移所有数据

Q3: 跨版本迁移需要注意什么?

A3: 跨版本迁移注意事项:

  1. 检查源和目标版本的兼容性,避免跨主要版本跳跃(如5.0 → 7.0)
  2. 测试目标版本对源版本数据结构的支持
  3. 关注废弃命令和配置项,确保应用不使用已废弃的功能
  4. 使用官方推荐的迁移工具,如Redis-Shake
  5. 在测试环境先进行迁移测试,确保无问题后再在生产环境执行

Q4: 如何处理迁移过程中的网络中断?

A4: 网络中断的处理方法:

  1. 使用支持断点续传的迁移工具(如redis-port、Redis-Shake)
  2. 对于Redis-Shake,设置合适的超时时间和重试机制
  3. 监控迁移进度,及时发现网络中断
  4. 对于大规模迁移,考虑在源和目标之间建立专线或使用VPN

Q5: 迁移后应用性能下降怎么办?

A5: 应用性能下降的解决方法:

  1. 检查目标Redis的配置,优化相关参数
  2. 监控目标Redis的内存使用,确保有足够的内存
  3. 检查应用的Redis客户端配置,优化连接池参数
  4. 考虑增加目标Redis的节点数量,分担负载
  5. 对于集群架构,检查槽分配是否均衡

Q6: 如何迁移Redis Cluster?

A6: Redis Cluster迁移方法:

  1. 使用Redis-Shake,配置target.type=cluster
  2. 使用redis-port,目标URL格式为redis-cluster://host1:port1,host2:port2
  3. 迁移前确保目标集群已经正确创建
  4. 迁移过程中监控集群状态,确保槽分配正常
  5. 迁移完成后验证集群的健康状态

Q7: 如何迁移带有密码的Redis实例?

A7: 带有密码的Redis实例迁移方法:

  1. 在迁移工具配置中添加密码参数
  2. 对于Redis-Shake,在配置文件中设置source.password和target.password
  3. 对于redis-cli,使用-a参数指定密码
  4. 确保密码正确,避免迁移过程中认证失败
  5. 迁移完成后,考虑更换目标实例的密码,提高安全性

Q8: 如何迁移特定前缀的键?

A8: 迁移特定前缀键的方法:

  1. 使用Redis-Shake的filter_key配置,如filter_key: ["prefix:*"]
  2. 使用RedisDump的-f参数,如redis-dump -f "prefix:*"
  3. 使用redis-cli结合shell脚本,如:
    bash
    redis-cli keys "prefix:*" | while read key; do
      redis-cli --raw dump $key | redis-cli -h <target-host> restore $key 0
    done
  4. 对于大规模数据,推荐使用Redis-Shake的过滤功能

结论

选择合适的Redis迁移工具对于确保迁移过程顺利进行至关重要。在选择工具时,需要考虑迁移规模、源和目标架构、性能要求、跨版本需求等因素。

对于大多数场景,Redis-Shake是一个不错的选择,它具有高性能、支持多种源和目标、支持全量+增量同步等优点。对于小规模数据迁移,redis-cli和RedisDump简单易用,适合快速迁移。对于极高性能要求的场景,redis-port是最佳选择。

无论选择哪种工具,都需要在迁移前进行充分的准备,包括评估迁移规模、准备目标环境、选择合适的迁移时间等。在迁移过程中,需要监控迁移进度,确保迁移顺利进行。迁移完成后,需要验证数据一致性,切换应用连接,并监控新实例的性能。

通过遵循最佳实践和注意常见问题,可以确保Redis迁移过程顺利完成,最大限度地减少对业务的影响。