Redis - 持久化

2021-04-09  本文已影响0人  kyo1992

简介

Redis是基于内存的数据库,同时提供持久化的能力,持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

方式

Redis提供两种持久化机制,RDB和AOF机制。
RDB(Redis DataBase):RDB保存某一个时间点之前的快照数据,是全量数据持久化。
AOF(Append-Only File):指所有的命令行写记录以redis命令请求协议格式完全持久化存储保存为aof文件,是增量数据持久化。
混合持久化(4.x):指进行AOF重写时子进程将当前时间点的数据保存为RDB文件格式,而后将父进程累积命令保存为AOF格式。

RDB

触发方式
  1. 在redis.conf配置,定时任务检查,满足条件就进行持久化写入到.rdb文件
save 900 1   # 在900秒内,执行过1条以上写操作命令则进行一次持久化,bgsave
save 300 10  # 在300秒内,执行过10条以上写操作命令则进行一次持久化,bgsave
save 60 10000  # 在60秒内,执行过10000条以上写操作命令则进行一次持久化,bgsave
  1. 手动执行bgsave/save,显式触发生成快照,save会阻塞主线程,不推荐使用。
持久化流程(fork + cow)
  1. 手动或者定时调用bgsave后,Redis 会调用 glibc 的函数 fork 产生一个子进程,主进程和子进程会共享内存里面的代码块和数据段,数据段是只读状态。
  2. 子进程不断读取父进程的数据,将数据写入rdb文件。
  3. 父进程继续处理客户端请求,如果有写操作,就会使用操作系统的 cow 机制来进行 数据段页面 的分离。数据段是由很多操作系统的页面组合而成,当父进程对其中一个页面的数据进行修改时,会将被共享的页面复 制一份分离出来,然后 对这个复制的页面进行修改。这时 子进程 相应的页面是 没有变化的,还是进程产生时那一瞬间的数据。
优缺点

优点

  1. 性能最大化,通过fork子进程进行持久化,主进程继续处理命令,保证redis高性能。
  2. rdb文件内容紧凑,比AOF文件内容小,重启redis恢复数据时,直接解析二进制文件生成对应数据存储在内存中,比AOF启动效率高。

缺点

  1. 数据安全性低,RDB是定期持久化,持久化之间redis发生故障,会发生数据丢失。 适合用于数据要求不严谨场景。
  2. 在持久化期间,如果有大量写操作,会产生大量cow操作,较多性能耗费在复制上。

AOF

触发方式

在redis.conf配置

appendonly yes
持久化流程
  1. 命令写入
  2. 将命令追加到AOF缓冲
  3. 根据同步策略,将AOF缓冲写入到AOF文件.
  4. 重复第一步.
持久化策略

Redis使用单线程响应命令,如果每次写AOF文件命令都追加到磁盘,会极大影响处理性能,所以Redis先写入aof缓冲区,根据用户配置的同步硬盘策略写入aof文件中,可以通过redis.conf配置中 appendfsync参数配置,值含义如下:

no:表示等操作系统进行数据缓存同步到磁盘(快速响应客户端,不对AOF做数据同步,同步文件由操作系统负责,通常同步周期最长为30s)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘
everysec:表示每秒同步一次(折中,默认值)

优缺点

优点:数据安全,aof持久化可以配置appendfsync属性。
缺点:数据集较大的时候,比rdb启动效率低,且文件体积会比rdb大。

AOF重写

在Redis长期运行后,AOF日志越来越大,一旦实例宕机重启,需要很长时间重放日志,导致长时期无法对外服务,所以需要对AOF日志重写压缩。

触发机制

手动触发:bgrewriteaof
自动触发:通过redis.conf中 auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage参数确定自动触发时机

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

auto-aof-rewrite-min-size:100
auto-aof-rewrite-percentage:64mb

代表当AOF文件的大小大于64MB,且当前AOF文件大小比基准大小增长了100%,会触发一次AOF重写。

触发原理

开辟一个子进程对内存进行遍历,转换成一系列Redis的操作指令,序列化到一个新的AOF日志文件中。 序列化完毕后再将操作期间发送的增量AOF日志追加到这个新的AOF日志文件中,追加完毕后就立即替代旧的AOF文件。

Redis4.0混合持久化

在4.0版本前,Redis实例重启会优先读取aof文件进行重放,但aof文件比较大,启动需要花费很长时间。
Redis4.0新增一个持久化选项 - 混合持久化。 将rdb文件的内容和增量的AOF日志文件存在一起。AOF日志不再是全量的日志,而是自持久化开始到持久化结束这段时间发生的增量AOF日志,通常这部分AOF日志很小。
在Redis重启时,可以先加载rdb内容,然后再重放增量AOF日志,就可以完全替代之前AOF全量文件重放,重启效率大幅提升。

触发方式

redis.conf设置

aof-use-rdb-preamble yes

Redis 的数据恢复优先级

如果只配置 AOF ,重启时加载 AOF 文件恢复数据;
如果同时配置了 RDB 和 AOF ,启动只加载 AOF 文件恢复数据;
如果只配置 RDB,启动将加载 dump 文件恢复数据。

上一篇 下一篇

猜你喜欢

热点阅读