Redis 持久化机制


1. Redis 持久性

Redis 提供了不同的持久性选项范围:
RDB:持久性按指定的时间间隔执行数据集的时间点快照。
AOF:持久性会记录服务器接收的每个写入操作,这些操作将在服务器启动时再次播放,以重建原始数据集。使用与Redis协议本身相同的格式记录命令,并且仅采用追加方式。当日志太大时,Redis可以在后台重写日志。
如果您希望,只要您的数据在服务器运行时就一直存在,则可以完全禁用持久性。
可以在同一实例中同时合并AOF和RDB。请注意,在这种情况下,当Redis重新启动时,AOF文件将用于重建原始数据集,因为它可以保证是最完整的。

2. RDB

  • RDB 优势

    RDB是Redis数据的非常紧凑的单文件时间点表示。RDB文件非常适合备份。例如,您可能希望在最近的24小时内每小时存档一次RDB文件,并在30天之内每天保存一次RDB快照。这使您可以在发生灾难时轻松还原数据集的不同版本。
    RDB对于灾难恢复非常有用,它是一个紧凑的文件,可以传输到远程数据中心或Amazon S3(可能已加密)上。
    RDB最大限度地提高了Redis的性能,因为Redis父进程为了持久化而需要做的唯一工作就是分叉一个孩子,其余所有工作都要做。父实例将永远不会执行磁盘I / O或类似操作。
    与AOF相比,RDB允许大型数据集更快地重启。

  • RDB 劣势

    如果您需要最大程度地减少数据丢失的可能性(如果Redis停止工作,例如在断电之后),则RDB不好。您可以在生成RDB的位置配置不同的保存点(例如,在至少五分钟之后,对数据集进行100次写入,但是您可以有多个保存点)。但是,通常会每隔五分钟或更长时间创建一次RDB快照,因此,如果Redis出于任何原因在没有正确关闭的情况下停止工作,则应该准备丢失最新的数据分钟。
    RDB需要经常使用fork()才能使用子进程将其持久化在磁盘上。如果数据集很大,Fork()可能很耗时,并且如果数据集很大且CPU性能不佳,则可能导致Redis停止为客户端服务几毫秒甚至一秒钟。AOF还需要fork(),但您可以调整要重写日志的频率,而无需权衡持久性。

  • 配置 redis.conf

    找到 SNAPSHOTTING


# 备份策略  save  
# 表示发生次更改后,在秒后进行备份
save 900 1
save 300 10
save 60 10000

# 表示在写操作发现错误时,停止备份。默认开启
stop-writes-on-bgsave-error yes

# 压缩rdb文件,默认开启
rdbcompression yes

# 对压缩后的rdb文件进行校验,默认开启
rdbchecksum yes

# rdb文件名
dbfilename dump.rdb

3. AOF

  • AOF 优势

    使用AOF Redis更加持久:您可以使用不同的fsync策略:完全没有fsync,每秒fsync,每个查询fsync。使用默认策略fsync时,每秒的写入性能仍然很好(fsync是使用后台线程执行的,并且在没有进行fsync的情况下,主线程将尽力执行写入操作。)但是您只能损失一秒钟的写入时间。
    AOF日志是仅追加的日志,因此,如果断电,则不会出现寻道或损坏问题。即使由于某种原因(磁盘已满或其他原因)以半写命令结束日志,redis-check-aof工具也可以轻松修复它。
    Redis太大时,Redis能够在后台自动重写AOF。重写是完全安全的,因为Redis继续追加到旧文件时,会生成一个全新的文件,其中包含创建当前数据集所需的最少操作集,一旦准备好第二个文件,Redis会切换这两个文件并开始追加到新的那一个。
    AOF以易于理解和解析的格式包含所有操作的日志。您甚至可以轻松导出AOF文件。例如,即使您使用FLUSHALL命令刷新了所有内容以查找错误,但是如果在此期间未执行任何日志重写,您仍然可以保存数据集,只是停止服务器,删除最新命令并再次重新启动Redis。

  • AOF 劣势

    对于同一数据集,AOF文件通常大于等效的RDB文件。
    根据确切的fsync策略,AOF可能比RDB慢。通常,在将fsync设置为每秒的情况下,性能仍然很高,并且在禁用fsync的情况下,即使在高负载下,它也应与RDB一样快。即使在巨大的写负载的情况下,RDB仍然能够提供有关最大延迟的更多保证。
    过去,我们在特定命令中遇到过罕见的错误(例如,其中有一个涉及阻止命令,例如BRPOPLPUSH),导致产生的AOF在重载时无法重现完全相同的数据集。这些错误很少见,我们在测试套件中进行了测试,自动创建了随机的复杂数据集,然后重新加载它们以检查一切是否正常。但是,对于RDB持久性来说,这类错误几乎是不可能的。为了更清楚地说明这一点:Redis AOF通过增量更新现有状态来工作,就像MySQL或MongoDB一样,而RDB快照一次又一次地创建所有内容,从概念上讲更健壮。但是-1)应当注意,每次Redis重写AOF时,都会从数据集中包含的实际数据开始重新创建AOF,与始终附加AOF文件(或重写为读取旧AOF而不是读取内存中的数据)相比,提高了对错误的抵抗力。2)我们从未收到过来自用户的关于真实环境中检测到的AOF损坏的报告。

  • 配置 redis.conf

    找到 APPEND ONLY MODE

# 开启 AOF
appendonly yes

# 持久化文件名
appendfilename "applendonly.aof"

# 同步策略
# appendfsync always    # 每次写操作时执行一次
appendfsync everysec    # 每秒执行一次
# appendfsync no        # 关闭

# 重写时是否进行同步
no-appendfsync-on-rewrite no    # 默认关闭

# 重写触发机制,同时满足下面两个条件时触发
auto-aof-rewrite-percentage 100     # 超过上次文件大小的百分比
auto-aof-rewrite-min-size 64mb      # 最小文件大小

总结

RDB 和 AOF 可以同时使用,RDB 作为冷备份,AOF 作为热备份
Redis 在恢复时,会先恢复 AOF 的数据,再检查恢复 RDB 的数据


文章作者: 小动物不困
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小动物不困 !
评论
 上一篇
Elasticsearch 安装与配置 Elasticsearch 安装与配置
1. 安装 Elasticsearch 下载Elasticsearch官网下载 上传后解压 tar -zxvf elasticsearch-7.4.2-linux-x86_64.tar.gz 移动解压后的文件夹 mv elasti
2020-09-27
下一篇 
Redis 安装与配置 Redis 安装与配置
1. 安装 Redis Redis 支持在 Linux、Windows、Mac 安装本文以 Linux 系统为例 下载安装包Redis官网 上传安装包至服务器 # 解压 tar -zxvf redis-5.0.5.tar.gz
2020-09-15
  目录