外观
Redis 迁移工具
迁移工具分类
1. 官方工具
| 工具名称 | 功能描述 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| redis-cli | 基本数据导入导出 | 小规模数据迁移 | 简单易用,无需额外安装 | 性能较低,不支持大规模数据迁移 |
| redis-server --slaveof | 主从同步迁移 | 主从架构迁移 | 官方支持,可靠性高 | 仅支持主从架构,灵活性差 |
2. 第三方工具
| 工具名称 | 功能描述 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| Redis-Shake | 高性能数据迁移 | 大规模数据迁移、跨版本迁移 | 性能高,支持多种源和目标 | 配置复杂,需要学习成本 |
| Redis-Migrate-Tool | 多源数据迁移 | 复杂拓扑迁移 | 支持多源合并,灵活配置 | 维护较少,可能存在兼容性问题 |
| RedisDump | 数据导入导出 | 小规模数据迁移、跨云迁移 | 支持JSON格式,便于调试 | 性能较低,不支持大规模数据 |
| redis-port | 字节级数据迁移 | 高性能数据迁移 | 性能极高,支持断点续传 | 配置复杂,学习曲线陡 |
| DBForge Studio for Redis | GUI迁移工具 | 可视化迁移 | 操作简单,可视化界面 | 付费工具,性能一般 |
常用迁移工具详解
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-shake2.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: "" # 复制ID2.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 install3.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: true3.3 运行Redis-Migrate-Tool
bash
# 启动迁移
redis-migrate-tool -c redis-migrate-tool.conf
# 查看迁移状态
redis-cli -p 8888 info
# 停止迁移
redis-cli -p 8888 shutdown3.4 适用场景
- 复杂拓扑迁移(如多源合并)
- 混合架构迁移(如主从 → 集群)
- 大规模数据迁移
4. RedisDump
4.1 安装
bash
# 使用gem安装
gem install redis-dump
# 使用Docker运行
docker pull rediscommander/redis-dump4.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-amd645.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: 数据不一致的解决方法:
- 确保使用支持全量+增量同步的工具(如Redis-Shake)
- 在迁移完成后,验证源和目标的数据量和关键数据
- 对于最终一致性要求高的场景,考虑在业务低峰期进行迁移
- 使用Redis-Shake的checksum功能验证数据一致性
Q2: 大规模数据迁移如何提高性能?
A2: 提高迁移性能的方法:
- 增加迁移工具的并发数(如Redis-Shake的parallel参数)
- 优化源和目标Redis的配置,如增加maxclients、调整内存配置
- 确保源和目标之间的网络带宽充足
- 使用高性能迁移工具(如redis-port、Redis-Shake)
- 考虑分批次迁移,避免一次性迁移所有数据
Q3: 跨版本迁移需要注意什么?
A3: 跨版本迁移注意事项:
- 检查源和目标版本的兼容性,避免跨主要版本跳跃(如5.0 → 7.0)
- 测试目标版本对源版本数据结构的支持
- 关注废弃命令和配置项,确保应用不使用已废弃的功能
- 使用官方推荐的迁移工具,如Redis-Shake
- 在测试环境先进行迁移测试,确保无问题后再在生产环境执行
Q4: 如何处理迁移过程中的网络中断?
A4: 网络中断的处理方法:
- 使用支持断点续传的迁移工具(如redis-port、Redis-Shake)
- 对于Redis-Shake,设置合适的超时时间和重试机制
- 监控迁移进度,及时发现网络中断
- 对于大规模迁移,考虑在源和目标之间建立专线或使用VPN
Q5: 迁移后应用性能下降怎么办?
A5: 应用性能下降的解决方法:
- 检查目标Redis的配置,优化相关参数
- 监控目标Redis的内存使用,确保有足够的内存
- 检查应用的Redis客户端配置,优化连接池参数
- 考虑增加目标Redis的节点数量,分担负载
- 对于集群架构,检查槽分配是否均衡
Q6: 如何迁移Redis Cluster?
A6: Redis Cluster迁移方法:
- 使用Redis-Shake,配置target.type=cluster
- 使用redis-port,目标URL格式为redis-cluster://host1:port1,host2:port2
- 迁移前确保目标集群已经正确创建
- 迁移过程中监控集群状态,确保槽分配正常
- 迁移完成后验证集群的健康状态
Q7: 如何迁移带有密码的Redis实例?
A7: 带有密码的Redis实例迁移方法:
- 在迁移工具配置中添加密码参数
- 对于Redis-Shake,在配置文件中设置source.password和target.password
- 对于redis-cli,使用-a参数指定密码
- 确保密码正确,避免迁移过程中认证失败
- 迁移完成后,考虑更换目标实例的密码,提高安全性
Q8: 如何迁移特定前缀的键?
A8: 迁移特定前缀键的方法:
- 使用Redis-Shake的filter_key配置,如filter_key: ["prefix:*"]
- 使用RedisDump的-f参数,如redis-dump -f "prefix:*"
- 使用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 - 对于大规模数据,推荐使用Redis-Shake的过滤功能
结论
选择合适的Redis迁移工具对于确保迁移过程顺利进行至关重要。在选择工具时,需要考虑迁移规模、源和目标架构、性能要求、跨版本需求等因素。
对于大多数场景,Redis-Shake是一个不错的选择,它具有高性能、支持多种源和目标、支持全量+增量同步等优点。对于小规模数据迁移,redis-cli和RedisDump简单易用,适合快速迁移。对于极高性能要求的场景,redis-port是最佳选择。
无论选择哪种工具,都需要在迁移前进行充分的准备,包括评估迁移规模、准备目标环境、选择合适的迁移时间等。在迁移过程中,需要监控迁移进度,确保迁移顺利进行。迁移完成后,需要验证数据一致性,切换应用连接,并监控新实例的性能。
通过遵循最佳实践和注意常见问题,可以确保Redis迁移过程顺利完成,最大限度地减少对业务的影响。
