目录
- 绪论
- RDB
- RDB备份方式
- 自动备份
- 手动备份
- 实现过程
- 触发时机
- 恢复数据
- RDB持久化配置
- 优缺点
- 实践演示
绪论
redis持久化机制主要是将内存中的数据持久化到磁盘文件中,一种是RDB(快照)文件方式,另一种是AOF(追加)文件。
小编基于centos7环境搭建Redis,如果未安装redis环境,请参考小编另一篇文章:轻松在阿里云上搭建redis。
本篇主要以RDB方式为主线,开始步入正文吧。
RDB
RDB是在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
RDB持久化方式:默认使用;
将Redis存在内存中的数据以快照的方式写入二进制文件中,并保存在本地磁盘中。
默认的文件名是dump.rdb
RDB备份方式
自动备份
a.修改配置项 save m n 即表示m秒内执行n次命令进行备份,自动触发bgsave命令; b.当Redis从服务器项中主服务器发送复制请求时,主服务器则会使用bgsave命令生成RDB文件,然后传输给从服务器; c.当执行debug reload命令时,也会使用save命令生成RDB文件; d.使用shutdown命令关闭服务,如果没有启用aof方式实现持久化则会采用bgsave方式;禁用自动备份,删除save后面的参数即可;
手动备份
主要采用save和bgsave命令;
save命令同步阻塞,save采用主进程进行快照备份,会阻塞其他请求;
bgsave是非阻塞;bgsave采用fork子进程进行快照;
实现过程
RDB快照实现过程:
a.父进程执行fork函数复制父进程创建其副本(子进程),fork子进程期间,父进程会阻塞;
b.父进程fork结束之后,bgsave会返回提示信息,此后父进程不再被阻塞,可以响应其他请求;
c.子进程开始创建临时RDB文件,将父进程的内存数据开始写入磁盘临时快照文件中,执行结束后会替换旧的RDB文件,至此完成一次RDB快照操作;
注意:Redis进行快照期间,不会修改RDB文件,直至替换完成;所以任意时刻RDB文件都是完整的;
触发时机
综合上面的备份方式,相信大家能够想到一些触发RDB机制的时机,例如:
1.在指定的时间间隔内,执行指定次数的写操作;
2.执行save(阻塞, 只管保存快照,其他的等待) 或者是bgsave (异步)命令;
3.执行flushall 命令,清空数据库所有数据;
4.执行shutdown 命令,保证服务器正常关闭且不丢失任何数据;
恢复数据
将dump.rdb 文件拷贝到redis的安装目录的bin目录下,重启redis服务即可。在实际开发中,一般会考虑到物理机硬盘损坏情况,选择备份dump.rdb 。
RDB持久化配置
上面的理论知识介绍结束了,下面小编便带着小伙伴实际动手操作配置一下;
- 自动备份:
修改redis.conf中配置:
扩展一个查找关键字快捷键:进入vi打开文件后,命令模式下输入
/ 关键字
按n查找下一个,按Shift+n查找上一个。
比如此处/ save;
1)触发保存
我们先研读官网,解释一下save 参数的意义
#
# Save the DB on disk:
# save 秒 修改
# save <seconds> <changes>
# 一定时间内,数据库修改记录数超过指定个数,则会触发快照保存
# Will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
# ...
# 注意:您可以通过注释掉所有“save”行来完全禁用保存。
# Note: you can disable saving completely by commenting out all "save" lines.
# 可以通过添加带有单个空字符串参数的save指令来删除所有先前配置的存储点,如以下示例所示
# save ""
save 900 1 #900秒内至少一个key发生改变
save 300 10 #300秒至少10个key发生改变
为测试持久化效果,将持久化频率提高一点,设置如下:
save 10 1
2) 文件名称:
# The filename where to dump the DB
dbfilename dump.rdb
3) 文件存放目录:
# Note that you must specify a directoryhere, not a file name.
dir ./
4)默认开启数据压缩
rdbcompression yes
说明:配置存储至本地数据库时是否压缩数据,默认为yes。Redis采用LZF压缩方式,但占用了一点CPU的时间。若关闭该选项,但会导致数据库文件变的巨大。建议开启。
5)设置日志文件路径:
Specify the log file name. Also the empty string can be used to force
# Redis to log on the standard output. Note that if you use standard
# output for logging but daemonize, logs will be sent to /dev/null
logfile ""
将路径写""引号内,小编将日志路径设置为/var/log/redis/redis.log
官网解释:指定日志文件名。也可以使用空字符串强制Redis登录标准输出。请注意,如果使用标准
日志输出,但daemonize,日志将发送到/dev/null。
通俗地讲:如果不设置redis.conf 里的logfile。 就会导致redis无法写日志, 进而导致,无法把redis数据写入到磁盘文件里。小编未设置日志路径时,一直无法确认是否持久化成功。
设置步骤:
1.vi redis.conf
2.搜索关键词logfile,将日志文件路径填到后面的引号"“内,如”/var/log/redis/redis.log"
3.手动建立日志文件所在的文件夹,手建立/var/log/redis/
4.保存配置文件,并以此配置文件重启redis
如果第三步中不新建文件夹,重新启动便会报错,如下图:
新建日志文件后重新启动redis服务,便可以查看日志文件,如图:
优缺点
优点:
1.适合大规模的数据恢复,RDB快照文件采用二进制压缩方式,重启加载数据时快于AOF方式;
2.文件实现数据快照,全量备份,便于数据的传输;
缺点:
1 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。
2 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍哦),最后再将临时文件替换之前的备份文件。
实践演示
- 自动备份
# 自动触发保存 10秒内至少一个key发生改变
[root@izbp14najjyuhkvm4qbic7z redis]# redis
127.0.0.1:6379> hget user1 username
"redis1"
127.0.0.1:6379> hset user2 username redis2
(integer) 1
127.0.0.1:6379> hget user2 username
"redis2"
127.0.0.1:6379> exit
打开日志文件,验证自动备份是否生效
- 手动备份
[root@izbp14najjyuhkvm4qbic7z redis]# redis
127.0.0.1:6379> set key1 ceshiBgSave
OK
127.0.0.1:6379> get key1
"ceshiBgSave"
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379> exit