Redis 通过 RDB 方式进行数据备份与还原
Intro
有的时候我们需要对 Redis 的数据进行迁移,今天介绍一下通过 RDB(快照)文件进行 Redis 数据的备份和还原
Redis 持久化
Redis 的数据持久化有两种机制,一种是 RDB(Redis Database),一种是 AOF(Append Only File)
Redis 提供了不同级别的持久化方式:
RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.
AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.
如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.
你也可以同时开启两种持久化方式, 在这种情况下, 当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.
废话不多说直接看下面的示例吧,通过 docker 运行一个 redis 实例,并设置一些数据,然后导出 RDB 文件,再运行一个 redis 实例通过 RDB 文件还原数据
备份
通过 docker run -d --name redis-test-1 redis:alpine
命令来创建一个 redis 实例,接着 SET 一个 key 保存到我们的 redis,使用命令 SET hello world
写入测试数据,你也可以写入别的自己想写的数据,接着可以使用 keys *
来验证数据是否写入成功
测试数据写入成功后使用 SAVE
命令来创建 RDB 文件,命令执行成功后我们可以在 /data
目录下看到会有一个 dump.rdb
文件,这就是我们想要的 RDB 文件,通过 docker cp
命令可以把这个文件拷贝到 host 目录下
还原
通过上面 RDB 文件我们可以在 redis 启动的时候还原 RDB 文件中的数据,只需要在 Redis 启动前把 RDB 文件放在 redis 的 data 目录下就可以了。
执行 docker run --rm --name redis-test-2 -v ${pwd}/data:/data redis:alpine
这个命令我是在 powershell 上执行的,如果执行在 Linux 上执行需要把
${pwd}
换成$(pwd)
来表示当前目录
可以看到上面的日志里有 Loading RDB ...
就是在加载 RDB 文件中的数据
我们再来验证一下 RDB 文件里的数据是否真的加载到了新的 redis 实例中,先来验证一下 data
目录是否正常挂载了,执行 docker exec -it redis-test-2 sh
来进入到 redis 实例容器中,ls
查看 data 目录中的文件看是否有我们期望的 RDB 文件,接着进入 redis-cli
来验证数据是否存在
使用 keys *
来列出来所有的 key 信息,可以看到有我们在上一个 redis 里写入的测试数据了,再来使用 GET hello
来验证数据是否正确,至此我们的数据就还原到新的 redis 实例中了~~
More
当 Redis 需要保存 dump.rdb
文件时, 服务器执行以下操作:
Redis 调用forks. 同时拥有父进程和子进程。
子进程将数据集写入到一个临时 RDB 文件中。
当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。
这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益。
如果 redis 被访问的比较频繁,可以使用 BGSAVE
代替 SAVE
来异步创建 RDB 备份
如果 redis 不是使用 docker 来使用的,/data
目录可以在 redis-cli 中使用 CONFIG GET dir
来获取保存 rdb 文件的目录,默认保存的 RDB 文件名称是 dump.rdb
,如果有修改过,可以通过 CONFIG GET dbfilename
来获取当前使用的文件名
References
https://redis.io/topics/persistence
http://redis.cn/topics/persistence.html