dump redis数据

记录了redis dump相关的知识点。

在做自动化测试的时候,一般的error可以通过log来复现,但是比较复杂的case,需要用到更多的定位信息。这时候需求是dump app中用到的redis数据,来分析结果。故研究了下redis dump相关知识。

需求分析

需求拆分下,其实是:

  • 如何dump redis当前数据
  • 如何通过dump文件,恢复数据的读取

更细化的一些场景是:

  • 能否指定dump文件存放位置?
  • dump文件权限需要用户什么权限?
  • 能否dump指定key或者指定的几个key?

针对上面的需求,看了下redis官方文档,其中几个关键点如下:

  • redis是有多个db的,dump的时候选对db
  • redis dump无法指定文件位置,使用默认($dir下);故多次dump相同实例会覆盖
  • redis stop会默认dump,故需要先stop再覆盖dump.rdb,否则是无法加载dump数据的
  • redis-cli有两种模式
    • command,如redis-cli incr mycounter
    • inactive,交互模式,只输入redis-cli可进入。这里比较坑的地方是使用fabric运行shell的时候,会进入交互模式的问题:戳这里

OK,关键点如上,下面会列举具体的步骤:

dump步骤

dump redis

涉及fabric相关的脚本的部分,并不在本文介绍中,可以参考:

# fab脚本中,dump redis的fun
def do_redis_dump():
    run('save | redis-cli')

这个写法很有意思,一开始测试时,脚本是redis-cli && save,但是这种方式会进入redis-cli的inactive模式,脚本会block在输入,故采用了上述方式。

def download_redis_dump_file(redis_file_dir):
    get('/var/lib/redis/dump.rdb',redis_file_dir)

这一步是download了对应的脚本

有了dump.rdb之后,dump就算完成了。下面需要的是启动一个redis并load已经dump好的文件,一般有如下两种情况:

reload redis

  • case 1:没运行redis实例/现有redis实例,但是数据不重要。故找到dump.rdb位置,替换文件,并systemctl restart redis即可
  • case 2:已经有现有的redis实例且不能restart/数据有用,需要启动额外的redis实例来加载该dump.rdb

case 1

针对case1,可能需要的是找到现有redis的dump file的位置,具体为:

127.0.0.1:6379> config get dir
1) "dir"
2) "/var/lib/redis"

由上可知,redis路径为/var/lib/redis,其dump file如下:

[root@test-214 system]# cd /var/lib/redis/
[root@test-214 redis]# ll
total 8
drwxr-xr-x. 2 root  root  4096 May 22 01:36 6380
-rw-r--r--. 1 redis redis   18 May 19 07:20 dump.rdb

reload的步骤为:

  • systemctl stop redis
  • cp new-dump-file old-dump-file
  • systemctl start redis

即可使用redis-cli查看dump file中的数据

case 2

case 2本质与case 1相同,只不过需要启动一个额外的redis实例,涉及到的修改有:

  • 需要cp一份redis.conf并修改其中内容
  • 使用新的redis.conf来启动服务

复制配置文件
cp /etc/redis.conf /etc/redis/redis_6380.conf
mkdir /var/lib/redis/6380/
vim /etc/redis/redis_6380.conf

修改配置文件中内容

  • pidfile /var/run/redis.pid
  • port 6379
  • logfile /var/log/redis.log
  • dir /var/lib/redis/

to

  • pidfile /var/run/redis_6380.pid
  • port 6380
  • logfile /var/log/redis/redis_6380.log
  • dir /var/lib/redis/6380

启动新的实例

nohup /usr/bin/redis-server /etc/redis/redis_6380.conf

后续操作参考case 1的步骤即可。

FAQ

一些资料