标签:
本文是 Redis 持久化文档 的中文翻译。
这篇文章提供了 Redis 持久化的技术性描述,推荐所有 Redis 用户阅读。
要更广泛地了解 Redis 持久化,以及这种持久化所保证的耐久性(durability),请参考文章 Redis persistence demystified (中文)。
Redis 提供了多种不同级别的持久化方式:
了解 RDB 持久化和 AOF 持久化之间的异同是非常重要的,以下几个小节将详细地介绍这这两种持久化功能,并对它们的相同和不同之处进行说明。
一般来说,如果想达到足以媲美 PostgreSQL 的数据安全性,你应该同时使用两种持久化功能。
如果你非常关心你的数据,但仍然可以承受数分钟以内的数据丢失,那么你可以只使用 RDB 持久化。
有很多用户都只使用 AOF 持久化,但我们并不推荐这种方式:因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份,并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快,除此之外,使用 RDB 还可以避免之前提到的 AOF 程序的 bug 。
因为以上提到的种种原因,未来我们可能会将 AOF 和 RDB 整合成单个持久化模型。(这是一个长期计划。)
接下来的几个小节将介绍 RDB 和 AOF 的更多细节。
在默认情况下,Redis 将数据库快照保存在名字为 dump.rdb 的二进制文件中。
你可以对 Redis 进行设置,让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时,自动保存一次数据集。
你也可以通过调用 SAVE 或者 BGSAVE ,手动让 Redis 进行数据集保存操作。
比如说,以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时,自动保存一次数据集:
save 60 1000
这种持久化方式被称为快照(snapshot)。
当 Redis 需要保存 dump.rdb 文件时,服务器执行以下操作:
这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益。
快照功能并不是非常耐久(durable):如果 Redis 因为某些原因而造成故障停机,那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。
尽管对于某些程序来说,数据的耐久性并不是最重要的考虑因素,但是对于那些追求完全耐久能力(full durability)的程序来说,快照功能就不太适用了。
从 1.1 版本开始,Redis 增加了一种完全耐久的持久化方式:AOF 持久化。
你可以通过修改配置文件来打开 AOF 功能:
appendonly yes
从现在开始,每当 Redis 执行一个改变数据集的命令时(比如 SET),这个命令就会被追加到 AOF 文件的末尾。
这样的话,当 Redis 重新启时,程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的。
因为 AOF 的运作方式是不断地将命令追加到文件的末尾,所以随着写入命令的不断增加,AOF 文件的体积也会变得越来越大。
举个例子,如果你对一个计数器调用了 100 次 INCR ,那么仅仅是为了保存这个计数器的当前值,AOF 文件就需要使用 100 条记录(entry)。
然而在实际上,只使用一条 SET 命令已经足以保存计数器的当前值了,其余 99 条记录实际上都是多余的。
为了处理这种情况,Redis 支持一种有趣的特性:可以在不打断服务客户端的情况下,对 AOF 文件进行重建(rebuild)。
执行 BGREWRITEAOF 命令,Redis 将生成一个新的 AOF 文件,这个文件包含重建当前数据集所需的最少命令。
Redis 2.2 需要自己手动执行 BGREWRITEAOF 命令;Redis 2.4 则可以自动触发 AOF 重写,具体信息请查看 2.4 的示例配置文件。
你可以配置 Redis 多久才将数据 fsync 到磁盘一次。
有三个选项:
推荐(并且也是默认)的措施为每秒 fsync 一次,这种 fsync 策略可以兼顾速度和安全性。
总是 fsync 的策略在实际使用中非常慢,即使在 Redis 2.0 对相关的程序进行了改进之后仍是如此 ——频繁调用 fsync 注定了这种策略不可能快得起来。
服务器可能在程序正在对 AOF 文件进行写入时停机,如果停机造成了 AOF 文件出错(corrupt),那么 Redis 在重启时会拒绝载入这个 AOF 文件,从而确保数据的一致性不会被破坏。
当发生这种情况时,可以用以下方法来修复出错的 AOF 文件:
$ redis-check-aof --fix
AOF 重写和 RDB 创建快照一样,都巧妙地利用了写时复制机制。
以下是 AOF 重写的执行步骤:
在 Redis 2.2 或以上版本,可以在不重启的情况下,从 RDB 切换到 AOF :
redis-cli> CONFIG SET appendonly yes redis-cli> CONFIG SET save ""
步骤 3 执行的第一条命令开启了 AOF 功能:Redis 会阻塞直到初始 AOF 文件创建完成为止,之后 Redis 会继续处理命令请求,并开始将写入命令追加到 AOF 文件末尾。
步骤 3 执行的第二条命令用于关闭 RDB 功能。这一步是可选的,如果你愿意的话,也可以同时使用 RDB 和 AOF 这两种持久化功能。
别忘了在 redis.conf 中打开 AOF 功能!否则的话,服务器重启之后,之前通过 CONFIG SET 设置的配置就会被遗忘,程序会按原来的配置来启动服务器。
译注:原文这里还有介绍 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 文件都是绝对安全的。
以下是我们的建议:
Redis 的容灾备份基本上就是对数据进行备份,并将这些备份传送到多个不同的外部数据中心。
容灾备份可以在 Redis 运行并产生快照的主数据中心发生严重的问题时,仍然让数据处于安全状态。
因为很多 Redis 用户都是创业者,他们没有大把大把的钱可以浪费,所以下面介绍的都是一些实用又便宜的容债备份方法:
需要注意的是,这类容灾系统如果没有小心地进行处理的话,是很容易失效的。
最低限度下,你应该在文件传送完毕之后,检查所传送备份文件的体积和原始快照文件的体积是否相同。如果你使用的是 VPS ,那么还可以通过比对文件的 SHA1 校验和来确认文件是否传送完整。
另外,你还需要一个独立的警报系统,让它在负责传送备份文件的传送器(transfer)失灵时通知你。
转自:http://blog.csdn.net/is_zhoufeng/article/details/10210353
标签:
原文地址:http://www.cnblogs.com/zhhtao/p/4443870.html