Redis持久化操作

Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。
Redis 主要提供了两种不同的持久化方式:

  1. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照,也被称为快照方式(snapshot)。

  2. AOF(Append-only file) 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。

简而言之,RDB方式保存的是“数据”,AOF方式保存的是“写命令”。

一. RDB方式

这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。


  • RDB使用方式

有两种方式执行RDB操作:
(1)在redis.conf中配置。可以配置redis在n秒内如果超过m个key被修改就自动做快照,在redis.conf文件中做配置,下面是快照保存配置的样例:

save 900 1  #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存

(2)用save和bgsave命令。前者是同步方式,后者是异步模式。

SAVE 命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。

BGSAVE 命令执行之后立即返回 OK ,打印出”Background saving started”,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。

一般来说,在生产环境很少执行 SAVE 操作,因为它会阻塞所有客户端,保存数据库的任务通常由 BGSAVE 命令异步地执行。


  • 如何保存rdb文件?

当 Redis 需要保存 dump.rdb 文件时, 服务器执行以下操作:
1. Redis 调用 fork() ,同时拥有父进程和子进程。
2. 子进程将数据集写入到一个临时 RDB 文件中。
3. 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。


  • RDB方式的优缺点

优点:
• RDB 是一个非常紧凑的文件,它保存了 Redis 在某个时间点上的数据集。每次保存RDP文件时都会替换原来的文件,所以一个redis实例一般只有一个RDP文件。你可以在最近的 24 小时内,每小时备份一次 RDB 文件,也可以在每个月的每一天备份一次 RDB 文件。
• RDB 可以最大化 Redis 的性能:父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作。
• RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
缺点:
• 因为RDB 文件需要保存整个数据集的状态, 所以它并不是一个轻松的操作。因此你可能会至少 5 分钟才保存一次 RDB 文件。 在这种情况下, 一旦发生故障停机, 你就可能会丢失好几分钟的数据。
• 在数据集比较庞大时, fork() 可能会非常耗时,造成服务器在某某毫秒内停止处理客户端; 如果数据集非常巨大,并且 CPU 时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒。

总结:RDB在大数据量时,恢复速度比AOF快,但是一旦宕机,很有可能会丢失数据。

二. AOF方式

Append-only file方式,快照功能并不是非常持久,如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。所以Redis 增加了一种完全持久的持久化方式: AOF 持久化。可以通过修改redis.conf配置文件来打开 AOF 功能:

appendonly yes

  • AOF工作方式

每当 Redis 执行一个改变数据集的命令时(比如 SET), 这个命令就会被追加到 AOF 文件的末尾。这样的话, 当 Redis 重新启时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的。
AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾
Redis还可以在后台对AOF文件进行重写(参见后台重写命令BGREWRITE),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。

AOF 重写和 RDB 创建快照一样,都巧妙地利用了写时复制机制。以下是 AOF 重写的执行步骤:

  1. Redis 执行 fork() ,现在同时拥有父进程和子进程。
  2. 子进程开始将新 AOF 文件的内容写入到临时文件。
  3. 对于所有新执行的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加到现有 AOF 文件的末尾:这样即使在重写的中途发生停机,现有的 AOF 文件也还是安全的。
  4. 当子进程完成重写工作时,它给父进程发送一个信号,父进程在接收到信号之后,将内存缓存中的所有数据追加到新AOF文件的末尾。
  5. 搞定!现在 Redis 原子地用新文件替换旧文件,之后所有命令都会直接追加到新 AOF 文件的末尾。

  • AOF方式的一个优化

因为AOF的运作方式是不断地将命令追加到文件的末尾, 所以随着写入命令的不断增加, AOF文件的体积也会变得越来越大。
举个例子, 如果你对一个计数器调用了 100 次 INCR , 那么仅仅是为了保存这个计数器的当前值, AOF 文件就需要使用 100 条记录(entry)。
然而在实际上, 只使用一条 SET 命令已经足以保存计数器的当前值了, 其余 99 条记录实际上都是多余的。
为了处理这种情况, Redis 支持一种有趣的特性: 可以在不打断服务客户端的情况下, 对 AOF 文件进行重建。执行 BGREWRITEAOF 命令, Redis 将生成一个新的 AOF 文件, 这个文件包含重建当前数据集所需的最少命令。


  • AOF多久同步一次新命令?

可以配置 Redis 多久才将数据 fsync 到磁盘一次。有三个选项:
• 每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全。
• 每秒 fsync 一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据。
• 从不 fsync :将数据交给操作系统来处理。更快,也更不安全的选择。
推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。


  • AOF文件出错,怎么办?

服务器可能在程序正在对 AOF 文件进行写入时停机,如果停机造成了AOF 文件出错,那么Redis 在重启时会拒绝载入这个AOF文件,从而确保数据的一致性不会被破坏。
当发生这种情况时,可以用以下方法来修复出错的AOF文件:
1. 为现有的 AOF 文件创建一个备份。
2. 使用 Redis 附带的 redis-check-aof 程序,对原来的 AOF 文件进行修复。


  • AOF的优缺点

优点:
使用 AOF持久化会让 Redis 变得非常耐久。AOF 的默认策略为每秒钟 fsync 一次,在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据。

Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重建。重建后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。

AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此AOF文件的内容非常容易被人读懂, 对文件进行分析也很轻松。

缺点:
对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。

总结:AOF持久化每秒 fsync一次,保证在宕机的情况下,丢失很少的数据。后台自动对AOF文件重建,以redis协议命令格式保存,便于分析。在大数据集下,恢复要比RDB慢。

三. RDB和AOF方式的选择

一般来说, 如果想达到足以媲美 PostgreSQL 的数据安全性,应该同时使用两种持久化功能。

如果你非常关心你的数据,但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化

有很多用户都只使用 AOF 持久化, 但我们并不推荐这种方式:因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份,并且RDB恢复数据集的速度也要比AOF恢复的速度要快

Redis 可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下,当Redis重启时,它会优先使用 AOF 文件来还原数据集, 因为AOF文件保存的数据集通常比RDB文件所保存的数据集更完整

四.RDB模式到AOF模式的切换

在 Redis 2.2 或以上版本,可以在不重启的情况下,从RDB切换到AOF:
1. 为最新的 dump.rdb 文件创建一个备份。
2. 将备份放到一个安全的地方。
3. 执行以下两条命令:
127.0.0.1:6379>CONFIG SET appendonly yes
127.0.0.1:6379>CONFIG SET save “”
4. 确保命令执行之后,数据库的键的数量没有改变。
5. 确保写命令会被正确地追加到 AOF 文件的末尾。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值