什么是持久化?

所谓持久化,其实就是一种机制,它能够 将内存中的数据库状态保存到磁盘 中,从而防止服务器宕机导致内存数据丢失。Redis 的 数据都是存在内存中 的,一旦出现宕机等情况,所有数据将会丢失,而持久化机制则是为了应对这一突发故障而提出的机制。

持久化的过程

要进行持久化,都是由客户端发起请求,然后再到服务器真实地写入磁盘中,一般需要经过如下步骤:

  1. 客户端向数据库 发送写命令请求,此时数据存在于客户端的内存中;
  2. 数据库 接收 来自客户端的 写命令请求,此时数据存在于服务器的内存中;
  3. 数据库 调用系统 API 将数据写入磁盘,此时数据从服务器内存准备写入磁盘,位于 内核缓冲区
  4. 操作系统将 写缓冲区 传输到 磁盘控制器,此时 数据由内核缓冲区进入磁盘缓存
  5. 操作系统的磁盘控制器将数据 写入实际物理媒介中,此时数据写入磁盘;

持久化的两种方式

  • RDB:在指定时间间隔内对数据进行快照存储,是 Redis 默认的持久化方式;
  • AOF:记录每次服务器进行的写操作,当服务器重启时重新执行这些命令以恢复原始数据;

RDB

论 Redis 持久化~ - 图1

工作原理

  1. Redis 调用 fork(),产生一个子进程;
  2. 子进程将数据写到一个临时的 RDB 文件;
  3. 当子进程完成新的 RDB 文件写入后,替换掉旧的 RDB文件;

优缺点

  1. 优点
    • RDB 是一个单文件,十分简洁,保存了某一时间点的 Redis 数据,适合做备份;
    • RDB 适合用于容灾,单文件传输十分方便;
    • RDB 性能较好,要进行持久化时,主进程 fork 一个子进程,然后将持久化的工作交给子进程,而主进程无需进行相关的 I/O 操作;
    • 相比于 AOF,数据量大时,其启动速度更快;
  2. 缺点
    • RDB 容易造成数据丢失,数据安全性较低;
    • RDB 利用 fork() 产生子进程进行数据的持久化,一旦数据过大就会消耗一定时间,造成 Redis 停止服务几毫秒甚至更久;

配置

  1. # RDB 文件名,默认 dump.rdb
  2. dbfilename dump.rdb
  3. # 文件存放目录,默认为当前工作目录
  4. dir ./
  5. # 保存点,假设为每 60s,数据发生 1000 次以上变动
  6. save 60 1000
  7. # 持久化出错,主进程是否停止希尔
  8. stop-writes-on-bgsave-error yes
  9. # 数据是否压缩
  10. rdbcompression yes
  11. # 数据是否校验
  12. rdbchecksum yes

手动触发方式

  1. save

会阻塞当前 Redis 服务器,直到持久化完成,对于线上要禁止使用;

  1. bgsave

fork 一个子进程,由子进程负责持久化进程,因此阻塞只会发生在 fork 子进程的过程中;

AOF

论 Redis 持久化~ - 图2

工作原理

  1. 命令的实时写入,通过增量追加到文件的流程为:命令写入 -> 追加到 AOF 缓存 -> 同步到 AOF 磁盘;
  2. 对 AOF 文件的重写,是为了减少 AOF 文件的大小,可以手动(bgrewriteaof)或自动触发;

优缺点

  1. 优点
    • 比 RDB 更可靠,能制定不同的同步策略:不进行同步,每秒同步一次和每次查询进行同步,默认为每秒同步一次;
    • AOF 是一个纯追加的文件,面对突发情况也不回出现日志定位或损坏问题;
    • 当 AOF 过大时,Redis 会自动重写。重写是在一个新文件上进行,同时 Redis 会继续往旧文件中追加数据,新文件上会写入能重建当前数据集的最小操作命令的集合。当新文件重写完之后,Redis 就将新旧文件进行替换,然后将数据写入新文件;
    • AOF 将操作命令以简易的格式保存在文件中,容易导出用于恢复数据;
  2. 缺点
    • 数据量相同时,AOF 文件的大小一般都会比 RDB 文件大;
    • 在某些同步策略下,AOF 的速度比 RDB 慢,通常同步设置为每秒一次就能获得较高性能;
    • 有可能出现 AOF 重建的数据和原数据不一致的问题;

配置

  1. # 是否开启aof
  2. appendonly yes
  3. # 文件存放目录,与 RDB 公用,默认为当前工作目录
  4. dir ./
  5. # 文件名称,默认为 appendonly.aof
  6. appendfilename "appendonly.aof"
  7. # 同步方式
  8. # appendfsync always
  9. appendfsync everysec
  10. # appendfsync no
  11. # aof重写期间是否同步
  12. no-appendfsync-on-rewrite no
  13. # 重写触发配置
  14. auto-aof-rewrite-percentage 100
  15. auto-aof-rewrite-min-size 64mb
  16. # 加载aof时如果有错如何处理
  17. aof-load-truncated yes
  18. # 文件重写策略
  19. aof-rewrite-incremental-fsync yes

总结

以上就是 Redis 持久化的相关内容了,首先讲了什么是持久化,然后讲了持久化的过程,最后则是 Redis 中持久化的两种方式:RDB + AOF。

创作不易,如果你觉得本文对你有所帮助,那就帮忙点个赞再走吧!