今天有个需求,从A服务器导出redis指定key的数据到B服务器。
度娘了下,四种方式:
一、 脚本导入
#!/bin/bash
#redis 源ip
src_ip=192.168.1.4
#redis 源port
src_port=6379
#redis 源password
src_pwd=123
#redis 目的ip
dest_ip=127.0.0.1
#redis 目的port
dest_port=6389
#redis 目的password
dest_pwd=123
#要迁移的key前缀(替换成自己要导入的key前缀)
key_prefix=abul
redis-cli -h $src_ip -p $src_port -a $src_pwd keys "${key_prefix}*" | while read key
do
#先删除key,再插入
redis-cli -h $dest_ip -p $dest_port -a $dest_pwd del $key
redis-cli -h $src_ip -p $src_port -a $src_pwd --raw dump $key | perl -pe 'chomp if eof' | redis-cli -h $dest_ip -p $dest_port -a $dest_pwd -x restore $key 0
echo "$i migrate key $key"
done
我使用的就是这种方式,因为需要导入的只是指定key,也比较简单,但也遇到一些小坑,后面会讲。
二、 aof 导入方式
将源 Redis 生成 AOF 数据文件
127.0.0.1:6379> config set appendonly yes
OK
生成的appendonly.aof
文件在dir目录,可通过config get dir
获得
127.0.0.1:6379> config get dir
1) "dir"
2) "/var/redis/6379"
导入目标redis实例
redis-cli -h 目标RedisIp -a password --pipe < appendonly.aof
三、 redis-dump工具
安装redis-dump工具
yum install ruby rubygems ruby-devel -y
# 替换镜像地址
gem sources --add http://gems.ruby-china.org/
# 确认镜像地址是否替换成功
gem sources -l
# 替换成功后再安装 redis-dump
gem install redis-dump -V
安装完成后,开始导出
# redis-dump 导出
redis-dump -u :password@源RedisIp:6379 > 源Redis数据文件.json
# redis-load 导入
cat 源Redis数据文件.json | redis-load -u :password@目标RedisIp:6379
四、 rdb 文件迁移
源实例关闭 aof 功能 config set appendonly no
固化数据到 RDB 文件 save
save 完成后,还是通过 config get dir 命令获得保存的 RDB 数据文件位置,并关闭redis。
然后复制源 redis 的 rdb 文件到目标 Redis 的 dir 数据目录,名字为你要迁移的 redis 的 rdb 文件名。
复制完成后,重启目标 Redis 实例,数据就迁移完成了。
遇到的小坑:
- 存在跨服务器导出或读取数据
Could not connect to Redis at 10.10.10.159:6379: Connection refused
首先目标服务器防火墙如果开启,需要开放6379端口;另外目标redis.conf配置的bind需要指定为0.0.0.0。 - 不同版本redis导入数据报错
ERR DUMP payload version or checksum are wrong
不同版本导致,处理办法:
1)开启源实例aof持久化功能config set appendonly yes
2)手动进行aof持久化bgrewriteaof
3)新建一个redis实例,与目标实例版本相同并启动
将源实例的redis的aof文件导入新建实例redis-cli -h 127.0.0.1 -p 6395 -a password --pipe < appendonly.aof
最后通过一的脚本导入。
Comments