










Redis 提供了一系列不同的持久性选项:
要理解的最重要的事情是 RDB 和 AOF 持久性之间的不同权衡。让我们从 RDB 开始:
一般的迹象是,如果您想要与 PostgreSQL 可以提供的数据安全程度相当的数据安全性,则应该同时使用这两种持久性方法。
如果您非常关心您的数据,但在发生灾难时仍然可以忍受几分钟的数据丢失,您可以简单地单独使用 RDB。
有很多用户单独使用 AOF,但我们不鼓励它,因为不时拥有 RDB 快照对于进行数据库备份、更快地重新启动以及在 AOF 引擎中出现错误时是一个好主意。
注意:由于所有这些原因,我们很可能在未来将 AOF 和 RDB 统一为一个持久化模型(长期计划)。
以下部分将说明有关这两种持久性模型的更多细节。
默认情况下,Redis 将数据集的快照保存在磁盘上的一个名为dump.rdb. 如果数据集中至少有 M 次更改,您可以将 Redis 配置为每 N 秒保存一次数据集,或者您可以手动调用SAVE或BGSAVE命令。
例如,如果至少有 1000 个键更改,此配置将使 Redis 每 60 秒自动将数据集转储到磁盘:
save 60 1000
这种策略被称为快照。
每当 Redis 需要将数据集转储到磁盘时,就会发生以下情况:
Redis分叉。我们现在有一个子进程和一个父进程。
孩子开始将数据集写入临时 RDB 文件。
当孩子写完新的 RDB 文件时,它会替换旧的。
这种方法允许 Redis 从写时复制语义中受益。
快照不是很持久。如果您运行Redis的计算机停止运行,您的电源线发生故障,或者您不小心kill -9您的实例,Redis上写入的最新数据将丢失。虽然这对于某些应用程序来说可能不是什么大问题,但存在完全持久性的用例,在这些情况下,Redis 不是一个可行的选择。
该只追加文件是Redis的选择,完全耐用的策略。它在 1.1 版中可用。
您可以在配置文件中打开 AOF:
appendonly yes
从现在开始,每次 Redis 收到更改数据集的命令(例如SET)时,它都会将其附加到 AOF 中。当您重新启动 Redis 时,它将重新播放 AOF 以重建状态。
您可以猜到,随着写入操作的执行,AOF 变得越来越大。例如,如果您将一个计数器递增 100 次,您最终将在数据集中得到一个包含最终值的键,但在 AOF 中有 100 个条目。重建当前状态不需要这些条目中的 99 个。
所以Redis支持了一个有趣的特性:它能够在不中断对客户端的服务的情况下在后台重建AOF。每当您发出BGREWRITEAOF 时, Redis 都会写入在内存中重建当前数据集所需的最短命令序列。如果您在 Redis 2.2 中使用 AOF,则需要不时运行BGREWRITEAOF。Redis 2.4 能够自动触发日志重写(更多信息请参见 2.4 示例配置文件)。
您可以配置 Redis 将 fsync数据存储在磁盘上的次数。共有三个选项:
appendfsync always:fsync每次将新命令附加到 AOF 时。非常非常缓慢,非常安全。请注意,在执行来自多个客户端或管道的一批命令之后,这些命令会附加到 AOF,因此这意味着单个写入和单个 fsync(在发送回复之前)。appendfsync everysec:fsync每一秒。足够快(在 2.4 中可能和快照一样快),如果发生灾难,您可能会丢失 1 秒的数据。appendfsync no:永远不要fsync,只需将您的数据交到操作系统的手中。更快、更不安全的方法。通常 Linux 会使用这种配置每 30 秒刷新一次数据,但这取决于内核的精确调整。建议(和默认)策略是fsync每秒。它既非常快又非常安全。该always策略在实践中很慢,但它支持组提交,因此如果有多个并行写入,Redis 会尝试执行单个fsync操作。
有可能是服务器在写入AOF文件时崩溃,或者写入时存储AOF文件的卷已满。发生这种情况时,AOF 仍包含表示数据集给定时间点版本的一致数据(使用默认 AOF fsync 策略,该版本可能长达一秒),但 AOF 中的最后一个命令可能会被截断。Redis 的最新主要版本无论如何都可以加载 AOF,只需丢弃文件中最后一个格式不正确的命令。在这种情况下,服务器将发出如下日志:
* Reading RDB preamble from AOF file...
* Reading the remaining AOF tail...
# !!! Warning: short read while loading the AOF file !!!
# !!! Truncating the AOF at offset 439 !!!
# AOF loaded anyway because aof-load-truncated is enabled
如果需要,您可以更改默认配置以强制 Redis 在这种情况下停止,但默认配置是继续,无论文件中的最后一个命令格式不正确,以保证重启后的可用性。
旧版本的 Redis 可能无法恢复,可能需要执行以下步骤:
使用redis-check-aofRedis附带的工具修复原始文件:
$ redis-check-aof --fix
可选地用于diff -u检查两个文件之间的区别。
使用固定文件重新启动服务器。
如果 AOF 文件不仅被截断,而且被中间的无效字节序列损坏,事情就会变得更加复杂。Redis 会在启动时抱怨并中止:
* Reading the remaining AOF tail...
# Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>
最好的办法是运行该redis-check-aof实用程序,最初没有--fix选项,然后了解问题,在文件中给定的偏移处跳转,看看是否可以手动修复文件:AOF 使用相同的格式Redis 协议,手动修复非常简单。否则有可能让实用程序为我们修复文件,但在这种情况下,从无效部分到文件末尾的所有 AOF 部分可能会被丢弃,如果损坏发生,将导致大量数据丢失在文件的初始部分。
日志重写使用已用于快照的相同的写时复制技巧。这是它的工作原理:
Redis fork,所以现在我们有一个子进程和一个父进程。
孩子开始在临时文件中写入新的 AOF。
父级在内存缓冲区中累积所有新更改(但同时它将新更改写入旧的仅附加文件中,因此如果重写失败,我们是安全的)。
当子进程完成重写文件时,父进程收到一个信号,并将内存缓冲区附加到子进程生成的文件的末尾。
利润!现在 Redis 原子地将旧文件重命名为新文件,并开始将新数据附加到新文件中。
在 Redis 2.0 和 Redis 2.2 中有一个不同的过程来执行此操作,因为您可以猜到它在 Redis 2.2 中更简单,并且根本不需要重新启动。
Redis >= 2.2
第一个 CONFIG 命令启用仅附加文件。为此,Redis 将阻塞以生成初始转储,然后将打开文件进行写入,并开始追加所有下一个写入查询。
第二个 CONFIG 命令用于关闭快照持久性。这是可选的,如果您愿意,可以启用两种持久性方法。
重要:记得编辑你的redis.conf 开启AOF,否则当你重启服务器时,配置更改会丢失,服务器会以旧配置重新启动。
Redis 2.0
redis-cli BGREWRITEAOF. 这将创建仅附加文件。Redis >= 2.4 确保避免在 RDB 快照操作正在进行时触发 AOF 重写,或在 AOF 重写正在进行时允许BGSAVE。这可以防止两个 Redis 后台进程同时进行大量磁盘 I/O。
当快照正在进行并且用户使用BGREWRITEAOF明确请求日志重写操作时,服务器将回复一个 OK 状态代码,告诉用户该操作已安排,一旦快照完成,重写将开始。
在 AOF 和 RDB 持久化都启用并且 Redis 重启的情况下,AOF 文件将用于重建原始数据集,因为它保证是最完整的。
在开始本节之前,请务必阅读以下句子:确保备份您的数据库。磁盘损坏,云中的实例消失,等等:没有备份意味着数据消失在 /dev/null 中的巨大风险。
Redis 对数据备份非常友好,因为您可以在数据库运行时复制 RDB 文件:RDB 一旦生成就永远不会被修改,并且在生成时它使用临时名称并仅使用 rename(2) 原子地重命名为其最终目的地当新快照完成时。
这意味着在服务器运行时复制 RDB 文件是完全安全的。这是我们的建议:
find命令以确保删除太旧的快照:例如,您可以拍摄最近 48 小时的每小时快照,以及一两个月的每日快照。确保使用数据和时间信息命名快照。如果您在仅启用 AOF 持久性的情况下运行 Redis 实例,您仍然可以复制 AOF 以创建备份。该文件可能缺少最后一部分,但 Redis 仍然可以加载它(请参阅前面关于截断 AOF 文件的部分)。
Redis 上下文中的灾难恢复与备份基本相同,并且能够在许多不同的外部数据中心传输这些备份。通过这种方式,即使在影响 Redis 运行并生成其快照的主数据中心的某些灾难性事件的情况下,数据也能得到保护。
由于许多 Redis 用户处于启动阶段,因此没有足够的钱可以花,因此我们将回顾最有趣的灾难恢复技术,并且成本不会太高。
gpg -c(在对称加密模式下)加密您的数据。确保将您的密码存储在许多不同的安全位置(例如,将副本提供给组织中最重要的人)。建议使用多个存储服务以提高数据安全性。authorized_keys到你的小VPS的文件中。您已准备好以自动方式传输备份。在两个不同的提供商处至少获得两个 VPS 以获得最佳效果。如果没有以正确的方式实施,这个系统很容易失败,理解这一点很重要。至少确保在传输完成后您能够验证文件大小(应该与您复制的文件匹配),如果您使用的是 VPS,则可能还可以验证 SHA1 摘要。
如果由于某种原因无法传输新备份,您还需要某种独立的警报系统。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。