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
在磁盘上的数据次数。有三种选择:
fsync
每次将新命令附加到AOF。非常非常慢,非常安全。fsync
每秒。足够快(2.4可能与快照一样快),如果发生灾难,您可能会丢失1秒的数据。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-aof
Redis附带的工具修复原始文件:
$ 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 分叉,所以现在我们有了一个子进程和一个父进程。
孩子开始在临时文件中写入新的AOF。
父级会在内存缓冲区中累积所有新更改(但同时它会将旧更改写入旧的仅附加文件中,因此如果重写失败,我们就是安全的)。
当子进程重写文件时,父进程会获得一个信号,并在子进程生成的文件末尾附加内存缓冲区。
利润!现在,Redis以原子方式将旧文件重命名为新文件,并开始将新数据附加到新文件中。
在Redis 2.0和Redis 2.2中执行此操作有不同的过程,因为您可以猜测它在Redis 2.2中更简单,并且根本不需要重新启动。
Redis> = 2.2
第一个CONFIG命令启用仅附加文件。为了做到这一点,Redis将阻止生成初始转储,然后将打开文件进行写入,并将开始附加所有下一个写入查询。
第二个CONFIG命令用于关闭快照持久性。如果您希望可以同时启用持久性方法,则这是可选的。
重要提示:请记住编辑redis.conf以打开AOF,否则当您重新启动服务器时,配置更改将丢失,服务器将使用旧配置重新启动。
Redis 2.0
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以获得最佳结果。重要的是要理解,如果没有以正确的方式实施,该系统很容易失败。至少要确保在传输完成后您能够验证文件大小(应该与您复制的文件相匹配)以及可能的SHA1摘要(如果您使用的是VPS)。
如果由于某种原因传输新备份不起作用,您还需要某种独立的警报系统。
参考:https://redis.io/topics/persistence
原文:https://www.cnblogs.com/651434092qq/p/11062249.html