跳转至

Redis持久化

以redis7.0.11举例


RDB

RDB也就是快照(SNAPSHOTTING)方式, 恢复时直接将RDB数据加载到内存中

在redis.conf中的相关配置参数为:

  • save
  • stop-writes-on-bgsave-error
  • rdbcompression
  • rdbchecksum
  • sanitize-dump-payload
  • dbfilename
  • rdb-del-sync-files
  • dir

其中最主要的是save参数

save

格式: save [ ...]

配置保存数据到磁盘的策略

示例1: save 36000 1, 表示在3600秒内有一次修改操作就保存快照到磁盘

示例2: save 3600 1 300 100 60 10000, 表示在3600秒内有一次修改操作或300秒内有100次修改操作或60妙内有10000操作就保存快照到磁盘

示例3: save "", 表示禁用快照

关于手动触发持久化:

在redis-cli中可使用save或bgsave命令, 区别在于

save是同步的, 使用当前进程进行持久化, 会阻塞当前进程, 即在持久化完成之前redis无法处理增删改查命令

bgsave则是异步的, 即fork一个子进程进程持久化处理, 不会阻塞当前进程, 但会额外消耗内存

同时, bgsave利用了系统提供的写时复制(Copy-on-Write, COP)技术, 持久化开始时将当前数据写入RDB文件, 写入文件期间如果有新数据写入, 新数据也会写入RDB文件

stop-writes-on-bgsave-error

格式: stop-writes-on-bgsave-error yes|no

默认值是yes, 表示:

1、如果启用了RDB快照并且最新的后台保存(bgsave)失败, 则redis将停止接受写入, 是用户意识到数据没有正确的保存到磁盘上

2、如果后台保存过程再次开始工作,则Redis将自动允许再次写入

设置为no, 表示无论快照是否保存成功, redis都允许继续写入

rdbcompression

格式: rdbcompression yes|no

默认值是yes, 表示使用LZF压缩RDB数据, 提高持久化速度并减少磁盘占用, 但会增加CPU使用量

rdbchecksum

格式: rdbchecksum yes|no

默认值是yes, 表示持久化数据时使用CRC64计算数据的校验和, 数据恢复时读取持久化文件中的校验和并与实际数据进行比对, 以确保数据的准确性和完整性, 但会多消耗约10%的性能, 同时也会降低持久化速度

sanitize-dump-payload

格式: sanitize-dump-payload yes|no|clients

配置Redis使用RDB持久化时是否进行脱敏处理, 通常是将敏感信息替换为特定的占位符或进行加密处理, 以防止数据泄露

默认值是no且默认被注释掉(禁用)

设置为no时, Redis在进行RDB持久化时不会对数据进行脱敏处理, 持久化文件中的数据将保持原样

设置为yes时, Redis在进行RDB持久化时会对数据进行脱敏处理

设置为clients时,Redis会对RDB持久化中的数据进行脱敏处理,但只有来自外部客户端的请求数据会被脱敏,而内部的Redis命令和数据将保持原样。这样可以保护来自外部客户端的敏感信息,同时保持内部数据的可读性和完整性。

dbfilename

格式: rdbchecksum "string"

"string"表示生成的RDB文件名称, 默认值是dump.rdb

rdb-del-sync-files

格式: rdb-del-sync-files yes|no

默认值是no

在未启用持久性的实例中删除复制使用的RDB文件

简单说就是主从同步数据时使用RDB文件, 同步完成后是否删除RDB文件

该选项仅在同时禁用AOF和RDB持久化的实例中有效, 否则将完全被忽略

dir

格式: dir "path"

"path"表示存放RDB文件的目录, 默认值是/var/lib/redis

AOF

aof即append-only file, 即将每条redis命令追加到appendfilename配置的文件中

并根据appendfsync方式同步到磁盘中, 恢复时读取AOF文件中的命令并逐条执行

在redis.conf中的相关配置参数为:

  • appendonly
  • appendfilename
  • appenddirname
  • appendfsync
  • no-appendfsync-on-rewrite
  • auto-aof-rewrite-percentage
  • auto-aof-rewrite-min-size
  • aof-load-truncated
  • aof-use-rdb-preamble yes
  • aof-timestamp-enabled
appendonly

格式: appendonly yes|no

默认值是no, yes表示启用aof持久化

appendfilename

同dbfilename, 设置aof文件名称, 默认值是appendonly.aof

从7.0版本开始使用一组文件进行持久化, 有两种可用的文件类型:

  • 基本文件,它们是表示创建文件时数据集的完整状态的快照, 基本文件可以是RDB(二进制序列化)或AOF(文本命令)的形式。

  • 增量文件,其中包含应用于上一个文件之后的数据集的其他命令

简单来说会生成3个文件:

  • appendonly.aof.1.base.rdb, 实际上就是rdb文件

  • appendonly.aof.1.incr.aof, 实际上就是aof文件

  • appendonly.aof.manifest, 上述两个文件的说明

appenddirname

格式: appenddirname "string"

"string"表示存放aof文件的目录, 此目录事相对目录, 保存在dir配置的目录下

appendfsync

格式: appendfsync always|everysec|no

配置aof文件刷写磁盘的方式

默认值是everysec, 表示每秒刷写一次, 如果发生故障, 最多丢失1秒的数据

其他两个可选配置是always和no, always表示每次对redis的增删改命令都会写入aof并刷写到磁盘

此种方式最安全, 不会丢失数据但效率最慢

如果是no则表示交由系统处理, 速度最快但是最不安全

no-appendfsync-on-rewrite

格式: no-appendfsync-on-rewrite yes|no

默认值是no

这里涉及到aof文件重写机制, 例如在redis-cli中多次使用set对同一个key设置value或者incr对某个key的value自增

对于aof文件来说, 里面的命令是冗余的, 只要拿到最后一个值即可, 而重写机制能减少aof文件对磁盘的占用

当appendfsync配置为always或everysec时, 主进程会调用系统的fsync(), 会消耗大量的I/O, 可能导致阻塞太长时间

缓解办法是使用bgsave或bgrewriteaof, 这样就不会使用主进程调用fsync()而导致阻塞, 但依旧会消耗大量I/O

如果将此配置的值配置为yes, 那么当时会暂停对aof文件的同步(即刷写磁盘), 减少I/O, 但可能会导致数据丢失

因此如果磁盘I/O问题不是瓶颈, 建议保持默认配置, 即 no

auto-aof-rewrite-percentage

格式: auto-aof-rewrite-percentage percentage

percentage 是数字, 表示百分比, 默认值是100

当AOF日志大小增长到指定的百分比时, Redis能够自动重写隐式调用BGREWRITEAOF的日志文件

若设置为0则表示禁用aof重写

注意, 需要配合auto-aof-rewrite-min-size参数一起使用

auto-aof-rewrite-min-size

格式: auto-aof-rewrite-min-size size

size 是数字+单位, 表示文件大小, , 默认值是64mb

当aof文件大小到达指定值时进行重写, 后续再次重写则会根据auto-aof-rewrite-percentage配置的值计算, 满足条件后会再次重写

aof-load-truncated

格式: aof-load-truncated yes|no

默认值是yes

当重启redis后会自动加载aof文件, 如果发现aof文件末尾被截断(可以理解为aof文件内容格式不正确或损坏), 控制是否仍然加载正确的部分, 否则报错(配置为no时)

注意, 如果aof文件从中间出错, 不是末尾, 即使配置为yes, redis重启时加载aof也会报错

aof-use-rdb-preamble

格式: aof-use-rdb-preamble yes|no

默认值yes, 表示混合持久化, 即同时使用RDB和AOF

具体就是将当前内存中的数据写入RDB文件(前面提到的appendonly.aof.1.base.rdb)

再次期间redis接收的操作将写入AOF文件(前面提到的appendonly.aof.1.incr.aof)

即加快的速度也保证了数据的安全

注意: 开启混合持久化, 不需要开启RDB持久化, 即无需配置save参数

aof-timestamp-enabled

格式: aof-timestamp-enabled yes|no

默认值是no, 如果改成yes, 则Redis支持在AOF中记录时间戳注释, 但可能出现不兼容情况

RDB和AOF的对比

RDB的优势是磁盘空间占用小, 数据备份与恢复的速度快, 但可能会丢失大量数据

AOF的优势是数据量丢失较小, 但占用磁盘空间大, 恢复速度较慢

同时, AOF的启动优先级比RDB高

所以建议使用混合持久化