Redis 从入门到入土④:持久化

Redis 是内存型数据库,为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上。

1. RDB 持久化

概述:
将 ** 某个时间点 ** 的所有数据都存放到硬盘上
可以将 快照 复制到其它服务器从而创建具有相同数据的服务器副本
缺点:

  • 如果数据量很大,保存快照的 时间会很长
  • 如果系统发生故障,将会 ** 丢失 ** 最后一次创建快照之后的数据
  • 不支持拉链,只有一个 dump.rdb

优点: 回复速度相对快
场景: 关机维护
三种触发机制:

  • save 命令:
    • 同步
    • 直接生成 rdb 二进制文件
    • 若有老的备份,新的备份会替换老的备份
  • bgsave 命令:
    • 异步
    • 通过 fork () 创建一个子进程去创建 rdb 文件
    • fork ():浅拷贝 + copy on write:可以做到快速拷贝,且父子互不影响
      • 快速拷贝
      • 写时复制触发次数不多(不可能父子进程把所有数据都改一遍)
  • 配置:
    • save seconds changes(save 900 1)
    • 本质为执行 bgsave
    • 一般都会把配置关闭
    • 推荐配置如下
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # 备份命名为 dump-${port}.rdb
      dbfilename "dump-${port}.rdb"
      # 备份存储位置
      dir /bigdiskpath
      # bgsave 错误时停止写入
      stop-writes-on-bgsave-error yes
      # 压缩格式
      rdbcompression yes
      # 校验和
      rdbchecksum yes

2. AOF 持久化

概述: 将写命令添加到 AOF 文件(Append Only File)的末尾
过程: 每次执行写命令时会把命令加入缓冲区,缓冲区根据策略进行持久化
缺点: 体量无限变大

2.1. 同步选项

使用 AOF 持久化需要设置同步选项,从而确保写命令 ** 什么时候 ** 会同步到磁盘文件上
这是因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘

选项 同步频率
always 每个写命令都同步
everysec 每秒同步一次
no 让操作系统来决定何时同步
  • always: 会严重减低服务器的性能
  • everysec: 比较合适,可以保证系统崩溃时只会丢失一秒左右的数据,并且 Redis 每秒执行一次同步对服务器性能几乎没有任何影响
  • no: 并不能给服务器性能带来多大的提升,而且也会增加系统崩溃时数据丢失的数量

2.2. AOF 重写(4.0 以前)

随着服务器写请求的增多,AOF 文件会越来越大
Redis 提供了一种将 AOF 重写的特性,能够去除 AOF 文件中的冗余写命令
原理: 删除抵消的命令,合并重复的命令
两种方式:

  • bgrewriteaof 命令:
    • 异步
    • 通过 fork () 创建一个子进程来在内存中执行 AOF 重写
  • 配置:
    • 推荐配置如下
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      # 启动 AOF
      appendonly yes
      # 备份名
      appendfilename "appendonly-${port}.aof"
      # 持久化策略为每秒进行
      appendfsync everysec
      # 备份存储位置
      dir /bigdiskpath
      # AOF 重写时不会执行 AOF
      no-appendfsync-on-rewrite yes
      # AOF 文件重写所需的最小大小
      auto-aof-rewrite-min-size 64mb
      # AOF 文件增长率
      auto-aof-rewrite-percentage 100

2.3. AOF 重写(4.0 以后)

RDB 和 AOF 混合

  • 将老的数据 RDB 到 AOF 文件中
  • 将增量的数据以指令的方式 append 到 AOF 中