Redis的RDB持久化和AOF持久化

RDB持久化和AOF持久化

一、 RDB持久化

Redis是内存型数据库,数据库状态保存在内存中,服务器进程退出数据库状态会消失。Redis提供了RDB持久化功能将数据库状态,也就是数据库的键值对保存到磁盘中。RDB持久化可以通过SAVE和BGSAVE 命令手动执行,也可以通过配置文件定期执行。
RDB持久化功能生成的RDB文件是一个经 过压缩的二进制文件,Redis服务器通过载入RDB文件进行数据库状态的还原。

  1. RDB文件的创建与载入:SAVE和BGSAVE命令生成RDB文件,
    a) SAVE命令会阻塞Redis服务器进程直到RDB文件创建完毕,在阻塞期间服务器不能处理客户端命令请求。
    b) BGSAVE命令会fork一个子进程,子进程在后台生成RDB文件,主进程进行处理客户端命令请求。但是拒绝执行SAVE,BGSAVE和BGREWRITEAOF命令。
    c) 文件载入:Redis服务器启动时检测到RDB文件存在,自动载入RDB文件。但是由于AOF文件的更新频率比RDB文件高,所以若开启了AOF持久化功能则使用AOF文件还原数据库状态,若未开启则使用RDB文件。服务器在载入RDB文件时一直会处于阻塞状态,直到载入工作完成。
  2. 自动间隔性保存:通过在配置文件里设置save选项,让服务器每隔一段时间自 动执行一次BGSAVE命令, 如:save 900 1 指在900秒内对数据库至少修改一次就会执行BGSAVE命令。
    a) 如何实现自动间隔性保存:(savaparams+dirty+lastsave+serverCron)1.服务器开启时载入配置文件信息,将多个save选项存入redisServer结构的saveparams数组中,该数组是记录保存条件的数组。2,服务器状态redisServer维护着计数器记录从上次持久化RDB文件完成开始数据库状态被修改多少次,还维护了lastsave属性,记录上次成功持久化RDB文件的时间。3.通过serverCron函数检查俩个条件是否满足,只要修改次数大于设置的数并且距离上次保存时间大于设置的时间 都执行BGSAVE命令,持久化数据库状态。

二、 AOF持久化

RDB持久化通过保存数据库中键值对来记录数据库状态,AOF持久化通过保存redis服务器执行的写命令保存数据库状态。所有写命令以命令请求协议格式保存,即纯文本格式。Redis服务器启动时可以通过载入执行AOF文件还原数据库状态。

一、 AOF持久化实现:分为命令追加,文件写入和文件同步。

a) 命令追加:AOF持久化功能打开后,服务器执行一条写命令就会将写命令存放到redisServer结构里的aof_buf缓冲区末尾,该属性是sds。
b) 命令写入:redis服务器是事件驱动程序,一个事件循环中第一步是文件事件处理命令请求和命令回复,接着是时间事件,一般调用serverCron函数维护服务端状态,在事件循环结束前调用flushappendonlyfile,将aof_buf缓冲区中的写命令写入和同步到AOF文件中。
c) 文件同步:操作系统里面,内存读写速度远高于磁盘读写速度,调用write函数往磁盘文件写数据时会将写入的文件暂时保存在一个内存缓冲区中,等缓冲区满了或是时间到了再一并刷入到磁盘文件中。前面将命令写入到AOF文件的函数flushappendonlyfile,由于在配置文件中的配置会有不同的行为。如果配置always表示写入AOF文件时立即同步文件。Everysecond表示每隔一秒文件同步一次。No表示写入AOF文件时不同步,什么时候同步让操作系统决定。
AOF文件载入与数据还原:服务器创建一个伪客户端(redis命令只能在客户端上下文中实现),从AOF文件中分析读取一条写命令,使用伪客户端执行写命令,然后循环读取写命令直到文件执行完毕。
二、 AOF重写(子进程后台重写+AOF重写缓冲区):
写命令不断增加,AOF文件体积膨胀,导致服务器硬盘空间压力增大,且数据还原时间增大。通过遍历数据库的键空间,忽略过期键,用一条写命令记录这些键的存储状态来代替多条命令,这是AOF重写的实现原理。
1. AOF后台重写(子进程):调用aof_rewrite函数可以生成一个新的AOF文件,但是aof_rewrite函数会有大量的写入操作,redis单线程模型,调用该函数的线程被长时间阻塞无法处理客户端的命令请求。所以redis将AOF重写放入子进程执行。Redis服务器fork一个子进程,子进程执行AOF重写,主进程继续处理客户端命令请求。
2. 创建子进程后,服务器会使用一个aof重写缓冲区,客户端来的写命令不仅被加入到AOF缓冲区中,也会被加入重写缓冲区中。子进程完成AOF重写后,主进程会将AOF重写缓冲区中的写命令写入新的AOF文件。用新文件代替旧文件实现了AOF后台重写。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页