Redis持久化机制
一、RDB
达到特定规则后,Redis会利用操作系统 fork 一个子进程(fork功能由操作系统提供,子进程享有和主进程一致的内存空间)去生成当前的数据快照。
快照以二进制内容的方式存储到一个临时文件,数据写入完毕之后再替换掉旧的数据快照文件。
1、触发时机
(1)手动式触发
执行 SAVE命令 :
阻塞主进程,让主进程去执行 快照备份(生产环境慎用)。
执行 BGSAVE 命令来执行:
利用 fork机制去触发快照备份。
(2)自动式触发
① 通过redis配置文件(redis服务对应的 xxx.conf 文件)控制备份时机(以BGSAVE命令方式进行RDB快照备份)。
#命令格式 # save <seconds> <changes> # 在 seconds 秒内至少发生 changes 次数的写操作 save 900 1 # 以上配置的含义:900秒之内至少发生1次写操作 # 若有多个配置项,满足一个就会触发RDB
② 服务器 执行shutdown命令关机时,如果没有开启AOF持久化功能,那么redis 会自动触发一次BGSAVE
③ 从节点触发 sync 请求(新的从节点接入或者从节点重启)
2、子进程备份机制
利用操作系统 EXEC 功能去修改子进程(子进程共享父进程的物理空间)执行函数,然后利用 COW(Copy On Write ,同样由操作系统提供)机制在主进程频繁更新数据的情况下将旧的快照(生成快照时的数据,不算新修改的)写入文件。
二、AOF
以追加命令行的方式将新命令追加到到 AOF文件中。AOF是文件操作,对于数据操作频繁的服务节点,这么做将造成磁盘IO的负荷加重。所以redis 先将令先写入到内存 AOF-DATA-BUFFER 中,当buffer数据达到阀值时(也有其他时机)触发实际写入。
1、AOF-DATA-BUFFER数据写入磁盘时机
配置文件控制什么时候将数据真正写入磁盘。
# 指定aof操作中文件同步策略 appendfsync <type> # type 有三个合法值:always everysec no 默认为 everysec # always 每次操作 # everysec 每秒 # no 不主动写入,等待操作系统自己决定写入
2、AOF-Rewrite
AOF日志会在持续运行中持续增大,需要定期进行AOF重写,已达到减小文件大小的作用。
(1)手动执行
BGREWRITEAOF 命令或者通过配置文件去配置自动执行Rewrite
(2)自动执行
(3)执行流程
Redis会利用操作系统 fork 一个Rewrite子进程(fork功能由操作系统提供,子进程享有和主进程一致的内存空间)和 COW机制去生成新的 AOF文件(具体细节待研究)。
三、混合持久化
需要手动开启,非redis默认采用的机制。
redis 开启混合持久之后(同时需要启用AOF持久化机制),AOF-ReWrite 操作中会立即执行一次RDB 备份,同时记录在RDB备份期间新的数据的操作命令,最后将RDB结果内容和AOF-DATA-BUFFER中的数据命令一起写到AOF文件中。
在 redis 重启的时候,先加载 RDB 的内容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,重启效率因此大幅得到提升。