今天有个需求,从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
bash
我使用的就是这种方式,因为需要导入的只是指定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
properties
安装完成后,开始导出
- # redis-dump 导出
- redis-dump -u :password@源RedisIp:6379 > 源Redis数据文件.json
- # redis-load 导入
- cat 源Redis数据文件.json | redis-load -u :password@目标RedisIp:6379
pgsql
四、 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