Redis 持久性存储

2025 年 3 月 28 日 | 阅读 8 分钟

引言

Redis 是一种免费开源的内存数据结构存储,常被用作消息代理、数据库结构和缓存。尽管它提供了丰富的各种信息结构,包括列表、集合、哈希、字符串等,但它在现代软件构建中是一个非常方便的工具。Redis 的内存存储结构使其能够高效地分析信息,同时也提供了持久化存储的方法,可以在服务器重启或崩溃等意外情况下确保数据安全。

除了快速的内存操作外,Redis 还提供了持久化存储技术,以保护数据免受系统故障和重启的影响。Redis 在处理工作队列、实时分析、会话存储和其他用例方面的能力使其成为一个宝贵的工具。

理解 Redis 中的持久化

在 Redis 中,持久化是指将内存中的数据保存到磁盘的过程。这确保了在 Redis 服务器重启或崩溃时数据不会丢失。没有持久化,Redis 将只能作为缓存解决方案,这意味着数据可能会在重启后丢失。因此,它不适合需要数据持久性的应用程序。

在 Redis 中,有两种主要的持久化选项

Redis 数据库 (RDB) 快照

这是数据集在特定时间点的快照,保存在内存中。它是数据集的一个压缩版本,以二进制文件的形式保存在磁盘上。RDB 快照可以由管理员手动创建,也可以通过设定的计划异步创建。当定期备份足够,并且快照期间的任何性能损失都可以容忍时,RDB 快照效果最好。

RDB 持久化通过在预定时间间隔内对数据集进行快照,将数据集保存为磁盘上的二进制文件。这些简短的快照是整个 Redis 信息在特定时间点的快照,使您能够将关系数据库恢复到与最初捕获时大致相同的状态。

RDB 文件由于其体积小巧,可用于灾难后的安全备份和恢复。

Redis 通过 fork 服务器进程来生成 RDB 文件。父进程继续响应客户端请求,而子进程将快照写入磁盘。

配置 RDB 快照

redis.conf 文件中的 save 配置指令控制快照的频率。Redis 可以被编程为根据在指定时间间隔内对信息集进行的修改数量来采取屏幕截图。例如:

save 900 1 # 如果至少有一个键发生更改,则每 15 分钟保存一次数据集save 300 10 # 如果至少有 10 个键发生更改,则每 5 分钟保存一次数据集save 60 10000 # 如果至少有 10,000 个键发生更改,则每分钟保存一次数据集

RDB 快照的优点

  • 小巧轻便:RDB 文件小巧轻便,易于在服务器之间移动或用作备份。
  • 更快的重启:由于 RDB 文件较小,在服务器重启时加载到内存的速度更快。
  • 更少的磁盘 I/O:因为 RDB 快照很少写入,所以它们比 AOF 使用的 I/O 更少。

RDB 快照的缺点

  • 可能的数据丢失:由于快照是定期创建的,因此在最近一次快照之后但在崩溃之前进行的任何数据更改都将丢失。
  • Forking 开销:在创建快照时,forking 进程可能会消耗大量资源,尤其是对于大型数据集。这可能会影响性能。

RDB 快照的最佳应用场景

  • 冷备份:RDB 非常适合定期对数据进行完整备份。
  • 数据可移植性:由于其紧凑的设计,RDB 是在 Redis 实例之间进行数据迁移的良好选择。
  • 非关键数据:在可以容忍一定量数据丢失(自上次快照以来)的情况下,RDB 是合适的,例如在可以重新生成数据的缓存系统中。

追加日志文件 (AOF)

当使用 AOF 持久化模式时,服务器接收的所有写操作都会被记录并追加到一个日志文件中。在重启时,可以通过重放此日志文件来重新创建原始数据集。与 RDB 快照相比,AOF 确保记录了每个写操作,因此它更适用于需要更高数据完整性保证的用例,但磁盘 I/O 会略有增加。

AOF 如何工作?

Redis 服务器接收的每个写操作都通过 AOF 持久化顺序记录到文件中。更新数据集的每个操作都会追加到此文件,即 AOF 日志。Redis 可以在服务器重启后重放 AOF 日志,将数据集重建到与关机前完全相同的状态。

AOF 提供三种不同的同步策略

  • appendfsync always:在每次写操作后,将 AOF 数据同步到磁盘。
  • appendfsync everysec:每秒将 AOF 数据同步到磁盘。这是默认配置,在持久性和性能之间取得了平衡。依赖操作系统将数据写入磁盘,服务器崩溃时可能导致数据丢失。

AOF 的优点

  • 更高的数据持久性:由于 AOF 记录了每个写操作,因此数据丢失比 RDB 少。这使其比 RDB 更具持久性。
  • 人类可读:由于 AOF 日志是用纯文本写入的,因此更容易查看和理解事件的顺序。
  • 可自定义的同步策略:通过在性能和安全性之间取得平衡,AOF 允许您选择最符合您需求的持久性级别。

AOF 的缺点

  • 更大的文件大小:AOF 文件通常比 RDB 文件占用更多的磁盘空间,并且在重启时加载时间更长。
  • 潜在的重启缓慢:如果写入操作很多,重放 AOF 日志可能需要更长时间。
  • 增加的磁盘 I/O:根据同步策略,AOF 可能会产生额外的磁盘 I/O,这可能会影响性能。

AOF 的最佳使用场景

  • 高持久性要求:在数据持久性至关重要的场景中,例如用户会话或金融交易,请使用 AOF。
  • 主数据存储:当 Redis 被用作主数据存储且不希望丢失数据时,AOF 是合适的。
  • 调试和审计:AOF 日志由于人类可读,因此有助于审计和调试。

混合方法:同时使用 RDB 和 AOF

Redis 允许您同时使用 RDB 和 AOF 持久化技术,结合了两者的优点。在这种设置中,AOF 文件保证了更少的数据丢失,而 RDB 文件提供了更快的重启。

当两者都启用时,Redis 会首先从 RDB 文件加载数据,然后执行 AOF 文件中记录的操作,从而将数据库恢复到其最新状态。这种方法在性能和持久性之间提供了极好的平衡。

混合持久化的优点

  • 快速恢复,最小化数据丢失:RDB 文件和 AOF 文件可以实现快速恢复,同时保留所有最新的修改。
  • 增强的数据安全性:RDB 快照和 AOF 日志共同降低了数据丢失的风险,使其适用于关键应用程序。

混合持久化的缺点

  • 增加磁盘使用量:因为 RDB 和 AOF 都创建自己的文件,所以同时使用它们会占用更多的磁盘空间。
  • 复杂性:管理双持久化系统需要仔细的配置和监控,这增加了 Redis 设置的复杂性。

混合持久化的最佳使用场景

  • 任务关键型应用程序:金融系统和大型 Web 应用程序是混合持久化非常适合的应用程序的两个示例,因为它们同时保证了快速恢复和数据持久性。
  • 高可用性系统:即使在发生多次故障的情况下,这种方法也能确保数据安全,并且当 Redis 是高可用性配置的组成部分时非常有用。

Redis 持久化和性能注意事项

持久化对性能的影响

性能开销是持久化系统不可避免的一部分。RDB 快照需要 fork,这会消耗 CPU 和内存,而 AOF 则需要持续的磁盘 I/O。数据集的大小、写入频率以及底层技术都会影响影响的程度。

根据您的工作负载,选择合适的持久化配置以尽量减少性能下降至关重要。

例如

  • 低延迟要求:如果低延迟至关重要,应使用具有稀疏保存间隔的 RDB 快照或使用 everysec 同步策略的 AOF。
  • 高吞吐量:对于高写入吞吐量的用例,单独使用 RDB 或与 AOF(使用 everysec)结合使用可以帮助平衡性能和持久性。
  • 优化磁盘 I/O:为了尽量减少磁盘 I/O 的影响,尤其是在使用 AOF 时,请在 SSD 上实现 Redis。

调整 Redis 持久化

通过仔细调整 redis.conf 中的选项数量,可以使 Redis 更加持久。

关键变量包括:

  • save:它控制 RDB 快照的频率。根据数据更改的频率和可接受的数据丢失量进行调整。
  • appendfsync:它控制 AOF 同步的行为。选择 everysec 以在持久性和性能之间取得平衡。
  • auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size 参数决定了何时发生 AOF 重写。通过调整这些参数,可以减少 AOF 重写对性能的影响并管理磁盘空间。

Redis 持久化的最佳实践

在使用 Redis 持久化时,遵循保证数据安全、速度和可维护性的最佳实践非常重要。

持续备份

即使采取了持久化措施,进行频繁备份也很重要。根据 RDB 快照的间隔安排备份,或定期将 AOF 文件移动到安全位置。通过这样做,您可以确保为硬件损坏或意外删除等重大挫折做好准备。

监控和评估持久性

留意与 Redis 持久化相关的问题,例如保存缓慢、AOF 写入失败或在拍摄 RDB 快照时内存消耗过高。Redis Sentinel 和 Redis Enterprise 等工具包含监控功能。

此外,定期测试您的备份和恢复程序。为了确保您的持久化策略和备份按预期工作,请模拟服务器崩溃和数据丢失情况。

结论

Redis 持久化是使 Redis 成为可靠的、持久的数据存储的关键组成部分,而不仅仅是内存数据库。通过了解并设置 RDB 快照、AOF 日志记录或混合方法,您可以确保即使在服务器重启或发生故障时,数据也能得到保护。

应根据您应用程序的独特需求来选择持久化方法,从而在资源使用、性能和数据持久性之间取得平衡。通过正确的配置、监控和遵循最佳实践,Redis 可以成为您数据架构的可靠基石,提供速度和安全性。

请记住,成功进行 Redis 持久化的关键在于理解权衡并根据您的工作负载调整配置。Redis 的持久化功能通过帮助您在持久性和性能之间取得理想的平衡,从而能够创建任务关键型数据存储以及基本缓存。


下一个主题Redis-rb