Redis 持久化

2021/01/14 posted in  基础

Redis 来说,实现数据的持久化,避免从后端数据库中进行恢复,是至关重要的。目前,Redis 的持久化主要有两大机制,即 AOF(Append Only File)日志和 RDB 快照;AOF 避免数据在宕机的情况下不丢失,RDB 保证在宕机后能够快速的恢复数据

AOF

AOF实现

AOF中记录的是Redis收到的每一条命令,这些命令一文本形式保存。Redis在向 AOF 里面记录日志时不会验证命令的合法性,这样如果先保存再执行可能在恢复的时候出现错误,所以Redis 是先执行命令,把数据写入内存,然后才记录日志;同时这样也不会阻塞当前执行的命令

AOF风险

  • 如果执行完一个命令,还没来得及记日志就宕机,导致数据命令丢失(用作数据库)
  • 可能阻塞下一个操作命令


写回策略

AOF风险都与AOF写会磁盘的时机有关,如果能够控制一个写命令执行后AOF日志写会磁盘的时机,风险就可避免,在Redis 中就是 AOF 配置项 appendfsync 的三个可选值

  • Always,同步写回:每个写命令执行完,立马同步地将日志写回磁盘;
  • Everysec,每秒写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘;
  • No,操作系统控制的写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘。

三种策略

AOF重写

AOF重写原因

AOF文件过大的性能问题:文件系统自身的限制,无法保存过大的文件;如果文件过大后期追加会导致效率低下;如果故障恢复则会非常缓慢,针对此可是使用AOF重写来控制。

AOF重写原理

通过将旧文件中的多个命令,重写为新文件中根据键值对的最新状态,为它生成的一条对应的新命令写入

AOF非阻塞重写

RDB

保证可靠性,并能在宕机后迅速恢复的持久化方法,RDB 记录的是某一时刻的数据,不是操作,恢复时可以直接读取文件内容到内存中,完成快速恢复

RDB文件生成方式

  • save : 在主线程中执行,会导致阻塞
  • bgsave : 创建一个子线程,专门用于写入 RDB 文件,避免了主线程的阻塞 ,默认的执行方式



RDB 写时复制

保证快照完整以及主线程同时对数据进行修改,避免对正常业务的影响

频繁执行全量备份影响

  • 频繁的执行回给磁盘带来很大的压力
  • 通过 fork 创建子进程过程会阻塞主进程,而且主进程内存越大,阻塞越久




混合使用 AOF & RDB

快照不用频繁的执行,避免了频繁的 fork 操作;AOF 只记录两次快照期间的操作,不会导致文件过大的问题,避免了重写开销。