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)自动执行

auto-aof-rewrite-min-size
表示运行AOF重写时文件最小体积,默认为64MB。
auto-aof-rewrite-percentage:
代表当前AOF文件空间(aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的值

(3)执行流程

Redis会利用操作系统 fork 一个Rewrite子进程(fork功能由操作系统提供,子进程享有和主进程一致的内存空间)和 COW机制去生成新的 AOF文件(具体细节待研究)。 

三、混合持久化

需要手动开启,非redis默认采用的机制。

redis 开启混合持久之后(同时需要启用AOF持久化机制),AOF-ReWrite 操作中会立即执行一次RDB 备份,同时记录在RDB备份期间新的数据的操作命令,最后将RDB结果内容和AOF-DATA-BUFFER中的数据命令一起写到AOF文件中。

在 redis 重启的时候,先加载 RDB 的内容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,重启效率因此大幅得到提升。

 

posted @ 2021-11-24 17:44  FCmmmmmm  阅读(38)  评论(0编辑  收藏  举报