一、Redis 持久化的简介

  由前面介绍可知,Redis 的数据都存放在内存中,且只使用了一个CPU内核,如果没有配置持久化操作,那么 Redis 重启后,数据就会全部丢失,所以我们需要在 Redis 的配置文件中,开启持久化的功能,将数据保存在磁盘上,当 Redis 重启后,可以从磁盘中恢复数据。

  Redis 提供持久化的 两种方式:

  • RDB 持久化 (原理:将 Redis 在内存中的数据库记录定时dump到磁盘上);
  • AOF 持久化 (原理:将 Redis 的操作日志以追加的方式写入文件);

  特殊情况:

  • 不适用持久化方式:只希望数据在服务器运行的时候存在的情况;
  • 开启上述的两种持久化方式:在这种情况下,Redis 重启的时候,会有限载入 AOF 文件来回复原始的数据,因为在通常情况下 AOF 文件保存的数据集要比 RDB 文件保存的数据集要完整;

二、持久化的方式介绍:

  RDB 持久化:

    原理:在指定时间间隔将内存中的数据集快照写入磁盘,实际操作过程是 fork 一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储;

    优点:

    • 使用这种方式,那么你的整个 Redis 数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你打算每小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复;
    • 我们可以非常轻松的 Redis 数据库中单独的文件进行压缩,再转移到其他存储介质上;
    • 性能最大化:对于 Redis 的服务进程而言,在开始持久化时,它唯一需要做的只是 fork 出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进行执行 IO 操作;
    • 在数据集很大的情况下,RDB 的启动效率相对 AOF 要高;

    劣势:

    • 如果希望 Redis 在意外停止工作的情况下丢失的数据最少的话,那么 RDB 不是一个最好的选择,一旦 Redis 意外宕机,那么此前未写入磁盘的数据都将丢失;
    • 由 RDB 的原理可知,RDB 是通过 fork 子进程来协助完成数据持久化工作的,因此,当数据集比较大时,可能会导致整个服务器停止服务几百毫秒,甚至是一秒钟;

  AOF 的持久化:

    原理:以日志的方式记录服务器所处理的每一个写、删操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录;

    优点:

    • 数据持久性:可以带来比 RDB 更高的数据安全性;该方式提供了 三种 同步策略:每秒同步、每修改同步和不同步;实际上,每秒同步也是异步完成的,其效率非常高,所差的是,一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以视为同步持久化,即每次发生数据变化都会被立即记录到磁盘中,这种方式可以得出是效率最低的。不同步,就是不同步记录到磁盘中也就是不记录到磁盘中;
    • 该持久化方式,对日志文件的写入操作是 append 模式,因此在写入过程中即时出现宕机现象,也不会破坏日志文件中已经存在的内容。如果是在一次操作中只是写入了一半数据就出现系统崩溃问题,那么可以在 Redis 下次启动之前,通过 redis-check-aof 工具来帮助我们解决数据一致性的问题;
    • 如果担心日志文件过大,Redis 可以自动启用 rewrite 机制。即 Redis 以 append 模式不断的将修改数据写入到老的磁盘文件中,同时 Redis 还会创建一个新的文件用于记录此期间有哪些修改命令被执行,因此在进行 rewrite 切换时可以更好的保证数据安全性;
    • AOF 包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建;

    劣势:

    • 对于相同熟练国的数据集而言,AOF 文件通常要大于 RDB 文件,RDB 在恢复大数据集时的速度 比 AOF 的恢复速度要快;
    • 根据同步策略的不同,AOF 在运行效率上往往会慢于 RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和 RDB 一样高效;

三、持久化方式选择的标准

  根据情况,看系统是愿意牺牲一些性能,换取更高的缓存一致性 (AOF),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行 save 的时候,再做备份 (RDB),RDB 在此时就有些 eventually consistent 的意思了,不过在大多数生成环境下,都是两者结合使用的;

四、常用配置

  RDB 持久化配置:

    Redis 会将数据集的快照 dump 到 dumo.rdb 文件中,日外,我们也可以通过配置文件来修改 Redis 服务器 dump 快照的频率,在打开 6379.conf 文件只有,我们搜索 save,可以看到下面的配置信息:

  • save 900 1        # 在 900 秒(15分钟)之后,如果至少有 1 个 key 发生变化,则 dump 内存快照;
  • save 300 10      # 在 300 秒 (5分钟) 之后,如果至少有 10 个 key 发生变化,则 dump 内存快照;
  • save 60 10000  # 在 60 秒 (1分钟) 之后,如果至少有 10000 个 key 发生变化,则 dump 内存快照;

  AOF 持久化配置:

    在 Redis 的配置文件中存在三种同步方式,它们分别是;

  • appendfsync always    # 每次有数据修改发生是都会写入 AOF 文件;
  • appendfsync everysec #每秒钟同步一次,该策略为 AOF 的缺省策略;
  • appendfsync no           # 从不同步。搞笑但是数据不会被持久化;

五、Redis 启用持久化 AOF 之后 报错的情况:

  Can't open the append-only file: Input/output error

  这种情况的原因是:在 win 下没用管理员权限

 

posted on 2021-10-15 08:56  冷漠「」  阅读(46)  评论(0)    收藏  举报