Redis 提供了多种不一样级别的持久化方式:html
了解 RDB 持久化和 AOF 持久化之间的异同是很是重要的, 如下几个小节将详细地介绍这这两种持久化功能, 并对它们的相同和不一样之处进行说明。redis
fork
出一个子进程,而后这个子进程就会处理接下来的全部保存工做,父进程无须执行任何磁盘 I/O 操做。fork()
出一个子进程,并由子进程来进行实际的持久化工做。 在数据集比较庞大时, fork()
可能会很是耗时,形成服务器在某某毫秒内中止处理客户端; 若是数据集很是巨大,而且 CPU 时间很是紧张的话,那么这种中止时间甚至可能会长达整整一秒。 虽然 AOF 重写也须要进行 fork()
,但不管 AOF 重写的执行间隔有多长,数据的耐久性都不会有任何损失。fsync
策略,好比无 fsync
,每秒钟一次 fsync
,或者每次执行写入命令时 fsync
。 AOF 的默认策略为每秒钟 fsync
一次,在这种配置下,Redis 仍然能够保持良好的性能,而且就算发生故障停机,也最多只会丢失一秒钟的数据( fsync
会在后台线程执行,因此主线程能够继续努力地处理命令请求)。seek
, 即便日志由于某些缘由而包含了未写入完整的命令(好比写入时磁盘已满,写入中途停机,等等), redis-check-aof
工具也能够轻易地修复这种问题。fsync
策略,AOF 的速度可能会慢于 RDB 。 在通常状况下, 每秒 fsync
的性能依然很是高, 而关闭 fsync
可让 AOF 的速度和 RDB 同样快, 即便在高负荷之下也是如此。 不过在处理巨大的写入载入时,RDB 能够提供更有保证的最大延迟时间(latency)。通常来讲, 若是想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。数据库
若是你很是关心你的数据, 但仍然能够承受数分钟之内的数据丢失, 那么你能够只使用 RDB 持久化。缓存
有不少用户都只使用 AOF 持久化, 但咱们并不推荐这种方式: 由于定时生成 RDB 快照(snapshot)很是便于进行数据库备份, 而且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快, 除此以外, 使用 RDB 还能够避免以前提到的 AOF 程序的 bug 。安全
Note服务器
由于以上提到的种种缘由, 将来咱们可能会将 AOF 和 RDB 整合成单个持久化模型。 (这是一个长期计划。)app
接下来的几个小节将介绍 RDB 和 AOF 的更多细节。工具
在默认状况下, Redis 将数据库快照保存在名字为 dump.rdb
的二进制文件中。性能
你能够对 Redis 进行设置, 让它在“ N
秒内数据集至少有 M
个改动”这一条件被知足时, 自动保存一次数据集。测试
你也能够经过调用 SAVE 或者 BGSAVE , 手动让 Redis 进行数据集保存操做。
好比说, 如下设置会让 Redis 在知足“ 60
秒内有至少有 1000
个键被改动”这一条件时, 自动保存一次数据集:
save 60 1000
这种持久化方式被称为快照(snapshot)。
当 Redis 须要保存 dump.rdb
文件时, 服务器执行如下操做:
fork()
,同时拥有父进程和子进程。这种工做方式使得 Redis 能够从写时复制(copy-on-write)机制中获益。
快照功能并非很是耐久(durable): 若是 Redis 由于某些缘由而形成故障停机, 那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。
尽管对于某些程序来讲, 数据的耐久性并非最重要的考虑因素, 可是对于那些追求彻底耐久能力(full durability)的程序来讲, 快照功能就不太适用了。
从 1.1 版本开始, Redis 增长了一种彻底耐久的持久化方式: AOF 持久化。
你能够经过修改配置文件来打开 AOF 功能:
appendonly yes
从如今开始, 每当 Redis 执行一个改变数据集的命令时(好比 SET key value [EX seconds] [PX milliseconds] [NX|XX]), 这个命令就会被追加到 AOF 文件的末尾。
这样的话, 当 Redis 从新启时, 程序就能够经过从新执行 AOF 文件中的命令来达到重建数据集的目的。
由于 AOF 的运做方式是不断地将命令追加到文件的末尾, 因此随着写入命令的不断增长, AOF 文件的体积也会变得愈来愈大。
举个例子, 若是你对一个计数器调用了 100 次 INCR key , 那么仅仅是为了保存这个计数器的当前值, AOF 文件就须要使用 100 条记录(entry)。
然而在实际上, 只使用一条 SET key value [EX seconds] [PX milliseconds] [NX|XX] 命令已经足以保存计数器的当前值了, 其他 99 条记录实际上都是多余的。
为了处理这种状况, Redis 支持一种有趣的特性: 能够在不打断服务客户端的状况下, 对 AOF 文件进行重建(rebuild)。
执行 BGREWRITEAOF 命令, Redis 将生成一个新的 AOF 文件, 这个文件包含重建当前数据集所需的最少命令。
Redis 2.2 须要本身手动执行 BGREWRITEAOF 命令; Redis 2.4 则能够自动触发 AOF 重写, 具体信息请查看 2.4 的示例配置文件。
你能够配置 Redis 多久才将数据 fsync
到磁盘一次。
有三个选项:
fsync
:很是慢,也很是安全。fsync
一次:足够快(和使用 RDB 持久化差很少),而且在故障时只会丢失 1 秒钟的数据。fsync
:将数据交给操做系统来处理。更快,也更不安全的选择。推荐(而且也是默认)的措施为每秒 fsync
一次, 这种 fsync
策略能够兼顾速度和安全性。
老是 fsync
的策略在实际使用中很是慢, 即便在 Redis 2.0 对相关的程序进行了改进以后还是如此 —— 频繁调用 fsync
注定了这种策略不可能快得起来。
服务器可能在程序正在对 AOF 文件进行写入时停机, 若是停机形成了 AOF 文件出错(corrupt), 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。
当发生这种状况时, 能够用如下方法来修复出错的 AOF 文件:
redis-check-aof
程序,对原来的 AOF 文件进行修复。$ redis-check-aof --fix
diff -u
对比修复后的 AOF 文件和原始 AOF 文件的备份,查看两个文件之间的不一样之处。AOF 重写和 RDB 建立快照同样,都巧妙地利用了写时复制机制。
如下是 AOF 重写的执行步骤:
fork()
,如今同时拥有父进程和子进程。在 Redis 2.2 或以上版本,能够在不重启的状况下,从 RDB 切换到 AOF :
dump.rdb
文件建立一个备份。redis-cli> CONFIG SET appendonly yes redis-cli> CONFIG SET save ""
步骤 3 执行的第一条命令开启了 AOF 功能: Redis 会阻塞直到初始 AOF 文件建立完成为止, 以后 Redis 会继续处理命令请求, 并开始将写入命令追加到 AOF 文件末尾。
步骤 3 执行的第二条命令用于关闭 RDB 功能。 这一步是可选的, 若是你愿意的话, 也能够同时使用 RDB 和 AOF 这两种持久化功能。
Note
别忘了在 redis.conf
中打开 AOF 功能! 不然的话, 服务器重启以后, 以前经过 CONFIG SET
设置的配置就会被遗忘, 程序会按原来的配置来启动服务器。
Note
译注: 原文这里还有介绍 2.0 版本的切换方式, 考虑到 2.0 已经很老旧了, 这里省略了对那部分文档的翻译, 有须要的请参考原文。
在版本号大于等于 2.4 的 Redis 中, BGSAVE 执行的过程当中, 不能够执行 BGREWRITEAOF 。 反过来讲, 在 BGREWRITEAOF 执行的过程当中, 也不能够执行 BGSAVE 。
这能够防止两个 Redis 后台进程同时对磁盘进行大量的 I/O 操做。
若是 BGSAVE 正在执行, 而且用户显示地调用 BGREWRITEAOF 命令, 那么服务器将向用户回复一个 OK
状态, 并告知用户, BGREWRITEAOF 已经被预约执行: 一旦 BGSAVE 执行完毕,BGREWRITEAOF 就会正式开始。
当 Redis 启动时, 若是 RDB 持久化和 AOF 持久化都被打开了, 那么程序会优先使用 AOF 文件来恢复数据集, 由于 AOF 文件所保存的数据一般是最完整的。
在阅读这个小节前, 先将下面这句话铭记于心: 必定要备份你的数据库!
磁盘故障, 节点失效, 诸如此类的问题均可能让你的数据消失不见, 不进行备份是很是危险的。
Redis 对于数据备份是很是友好的, 由于你能够在服务器运行的时候对 RDB 文件进行复制: RDB 文件一旦被建立, 就不会进行任何修改。 当服务器要建立一个新的 RDB 文件时, 它先将文件的内容保存在一个临时文件里面, 当临时文件写入完毕时, 程序才使用 rename(2)
原子地用临时文件替换原来的 RDB 文件。
这也就是说, 不管什么时候, 复制 RDB 文件都是绝对安全的。
如下是咱们的建议:
find
命令来删除过时的快照: 好比说, 你能够保留最近 48 小时内的每小时快照, 还能够保留最近一两个月的每日快照。Redis 的容灾备份基本上就是对数据进行备份, 并将这些备份传送到多个不一样的外部数据中心。
容灾备份能够在 Redis 运行并产生快照的主数据中心发生严重的问题时, 仍然让数据处于安全状态。
由于不少 Redis 用户都是创业者, 他们没有大把大把的钱能够浪费, 因此下面介绍的都是一些实用又便宜的容灾备份方法:
gpg -c
命令来完成(对称加密模式)。 记得把你的密码放到几个不一样的、安全的地方去(好比你能够把密码复制给你组织里最重要的人物)。 同时使用多个储存服务来保存数据文件,能够提高数据的安全性。须要注意的是, 这类容灾系统若是没有当心地进行处理的话, 是很容易失效的。
最低限度下, 你应该在文件传送完毕以后, 检查所传送备份文件的体积和原始快照文件的体积是否相同。 若是你使用的是 VPS , 那么还能够经过比对文件的 SHA1 校验和来确认文件是否传送完整。