目录
一、Redis 持久化
1、Redis 持久化的功能
Redis是内存数据库,数据都是存储在内存中,为了避免服务器断电等原因导致Redis进程异常退出后数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置
2、Redis 两种方式进行持久化
-
RDB(Redis DataBase)持久化:通过将内存中的数据保存到磁盘上的文件中来实现持久化。周期性地将数据集的内容写入磁盘,可以配置定期保存快照的时间间隔和保存条件。生成的文件是经过压缩的二进制文件,能够在需要时进行恢复。
-
AOF(Append Only File)持久化:记录了服务器接收的每一条写入命令,以文件追加的方式保存在磁盘上。服务器重启时,通过重新执行AOF文件中的命令来还原数据集的状态。相对于RDB,AOF提供了更好的数据完整性保证,但增加了磁盘的写入负担。
3、RDB持久化
RDB持久化是指在指定的时间间隔内将内存中当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),用二进制压缩存储,保存的文件后缀是rdb;当Redis重新启动时,可以读取快照文件恢复数据。
3.1 触发条件
RDB持久化的触发分为手动触发和自动触发两种
- 手动触发
save命令和bgsave命令都可以生成RDB文件
save命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在Redis服务器阻塞期间,服务器不能处理任何命令请求
而bgsave命令会创建一个子进程,由子进程来负责创建RDB文件,父进程(即Redis主进程)则继续处理请求
bgsave命令执行过程中,只有fork子进程时会阻塞服务器,而对于save命令,整个过程都会阻塞服务器,因此save已基本被废弃,线上环境要杜绝save的使用
- 自动触发
在自动触发RDB持久化时,Redis也会选择bgsave而不是save来进行持久化
save m n
#自动触发最常见的情况是在配置文件中通过save m n,指定当m秒内发生n次变化时,会触发bgsave
开启自动触发RDB持久化:
[root@localhost ~]#vim /etc/redis/6379.conf
219行以下三个save条件满足任意一个时,都会引起bgsave的调用
save 900 1 #当时间到900秒时,如果redis数据发生了至少1次变化,则执行bgsave
save 300 10 #当时间到300秒时,如果redis数据发生了至少10次变化,则执行bgsave
save 60 10000 #当时间到60秒时,如果redis数据发生了至少10000次变化,则执行bgsave
254行指定RDB文件名
dbfilename dump.rdb
264行指定RDB文件和AOF文件所在目录
dir /var/lib/redis/6379
242行是否开启RDB文件压缩
rdbcompression yes
[root@localhost ~]#/etc/init.d/redis_6379 restart
#若修改了配置文件,需重启服务
其他自动触发机制:
除了save m n 以外,还有一些其他情况会触发bgsave:
- 在主从复制场景下,如果从节点执行全量复制操作,则主节点会执行bgsave命令,并将rdb文件发送给从节点
- 执行shutdown命令时,自动执行rdb持久化
3.2、执行流程
(1)Redis父进程首先判断:当前是否在执行save,或bgsave/bgrewriteaof的子进程,如果在执行则bgsave命令直接返回。 bgsave/bgrewriteaof的子进程不能同时执行,主要是基于性能方面的考虑:两个并发的子进程同时执行大量的磁盘写操作,可能引起严重的性能问题。
(2)父进程执行fork操作创建子进程,这个过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令
(3)父进程fork后,bgsave命令返回”Background saving started”信息并不再阻塞父进程,并可以响应其他命令
(4)子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换
(5)子进程发送信号给父进程表示完成,父进程更新统计信息
3.3、启动时加载
RDB文件的载入工作是在服务器启动时自动执行的,并没有专门的命令。但是由于AOF的优先级更高,因此当AOF开启时,Redis会优先载入 AOF文件来恢复数据;只有当AOF关闭时,才会在Redis服务器启动时检测RDB文件,并自动载入。服务器载入RDB文件期间处于阻塞状态,直到载入完成为止
Redis载入RDB文件时,会对RDB文件进行校验,如果文件损坏,则日志中会打印错误,Redis启动失败
4、AOF 持久化
RDB持久化是将进程数据写入文件,而AOF持久化,则是将Redis执行的每次写、删除命令记录到单独的日志文件中,查询操作不会记录; 当Redis重启时再次执行AOF文件中的命令来恢复数据
与RDB相比,AOF的实时性更好,因此已成为主流的持久化方案
4.1、开启AOF
Redis服务器默认开启RDB,关闭AOF