Redis 提供了多个持久性选项,以确保数据持久性并防止在服务器发生故障或重启时丢失数据。了解这些选项对于为您的特定使用案例选择正确的策略、平衡性能和数据安全至关重要。本章节将深入探讨 Redis 中的两种主要持久性机制:Redis 数据库 (RDB) 快照和仅附加文件 (AOF)。我们将探讨它们的工作原理、优点和缺点以及如何配置它们。
RDB(Redis 数据库)持久性按指定的时间间隔执行数据集的时间点快照。这些快照表示 Redis 数据库在特定时刻的整个状态。
当指示 Redis 创建 RDB 快照时,它会执行以下步骤:
fork()
系统调用创建子进程。此子进程是父进程(Redis 服务器)的精确副本。在整个过程中,父进程继续为客户端请求提供服务,从而最大限度地减少停机时间。但是,fork()
作可能会占用大量资源,尤其是对于大型数据集,因为它暂时需要双倍的内存。
您可以使用 redis.conf
文件中的 save
指令配置 RDB 快照。save
指令采用两个参数:秒数和在这些秒内必须发生的更改数才能触发快照。
例如:
save 900 1 # Save the DB if at least 1 key changed in 900 seconds
save 300 10 # Save the DB if at least 10 keys changed in 300 seconds
save 60 10000 # Save the DB if at least 10000 keys changed in 60 seconds
redis.conf
中的这些行定义了三个不同的保存点。如果满足_这些条件中的任何一个_ ,Redis 将触发 RDB 快照。您可以通过注释掉所有保存
行来完全禁用 RDB 快照。
您还可以使用 redis-cli
中的 SAVE
或 BGSAVE
命令手动触发 RDB 快照。
SAVE:
此命令执行同步保存,阻止 Redis 服务器,直到快照完成。通常不建议将其用于生产环境。BGSAVE:
此命令使用上述相同的分叉机制执行异步保存。它允许 Redis 服务器在创建快照时继续为客户端请求提供服务。fork()
作可能会占用大量资源,尤其是对于大型数据集,这可能会导致暂时的性能下降。除了 save
指令之外,redis.conf
中其他与 RDB 相关的配置选项还包括:
stop-writes-on-bgsave-error
:如果设置为 yes
(默认值),则当 BGSAVE
命令失败时,Redis 将停止接受写入作。这可以防止在出现磁盘错误或磁盘空间不足时损坏数据。rdbcompression
:如果设置为 yes
(默认值),Redis 将使用 LZF 压缩 RDB 文件。将其设置为 no
可以提高 CPU 性能,但会导致 RDB 文件变大。rdbchecksum
:如果设置为 yes
(默认值),Redis 将在 RDB 文件中包含一个校验和,以检测数据损坏。将其设置为 no
可以提高性能,但会降低数据完整性。dbfilename
:指定 RDB 文件的名称(默认值:dump.rdb
)。dir
:指定 RDB 文件的存储目录(默认:Redis 工作目录)。AOF(仅附加文件)持久性为 RDB 快照提供了更持久的替代方案。AOF 不会定期拍摄快照,而是记录服务器收到的每个写入作。
启用 AOF 后,Redis 会将每个写入作(例如 SET
、HSET、``LPUSH)
附加到 AOF 文件中。此文件实质上包含对数据库执行的所有写入作的完整历史记录。
AOF 在 redis.conf
文件中配置。关键配置选项包括:
appendonly
:设置为 yes
以启用 AOF 持久化。设置为 no
可禁用它(默认)。appendfilename
:指定 AOF 文件的名称(默认:appendonly.aof
)。appendfsync
:指定 Redis 应将 AOF 文件同步到磁盘的频率。它可以具有以下值之一:
always
:在每次写入作后同步。这提供了最高级别的数据持久性,但也提供了最低的性能。everysec
:每秒同步一次。这是数据持久性和性能之间的良好平衡(推荐)。no
:让作系统决定何时同步。这提供了最佳性能,但数据持久性级别最低。使用以下选项配置 AOF 重写:
auto-aof-rewrite-percentage
:指定在触发重写之前 AOF 文件必须增长的百分比。例如,值 100
表示 AOF 文件的大小必须翻倍才能触发重写。auto-aof-rewrite-min-size
:指定触发重写之前 AOF 文件的最小大小。这可以防止重写非常小的 AOF 文件。您还可以使用 redis-cli
中的 BGREWRITEAOF
命令手动触发 AOF 重写。
appendfsync always
或 appendfsync everysec
时。始终使用 appendfsync
时。特征 | RDB | AOF |
---|---|---|
数据持久性 | 较低 (可能丢失数据) | 更高(最小数据丢失) |
文件大小 | 较小 | 较大 |
性能 | 更快 | 更慢(尤其是 always ) |
恢复时间 | 更快 | 较慢(需要重放命令) |
配置 | save 指令 |
appendonly , appendfsync 指令 |
使用案例 | 备份、灾难恢复、缓存 | 需要高数据持久性的应用程序 |
RDB 和 AOF 之间的选择取决于您的具体要求:
假设您使用 Redis 作为网站的缓存服务器。数据丢失是可以接受的,因为可以从主数据库中检索数据。在这种情况下,您可以配置具有相对不频繁的保存间隔的 RDB:
save 600 100 # Save if at least 100 keys changed in 600 seconds
save 300 1000 # Save if at least 1000 keys changed in 300 seconds
save 60 10000 # Save if at least 10000 keys changed in 60 seconds
此配置为缓存服务器提供了性能和数据持久性之间的良好平衡。
假设您使用 Redis 作为电子商务网站的会话存储。数据丢失是不可接受的,因为它可能导致用户丢失购物车或被注销。在这种情况下,您应该每 sece 使用 appendfsync
配置 AOF:
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
此配置可确保每秒将每个会话更改写入磁盘,从而最大限度地降低数据丢失的风险。
对于假设的财务应用程序,您可以同时使用 RDB 和 AOF。每 squad 使用 appendfsync 的
AOF 可确保将事务记录的数据丢失降至最低。RDB 快照每天在非高峰时段拍摄,为灾难恢复和报告目的提供方便的备份。如果服务器发生故障,Redis 将使用 AOF 文件进行恢复。如果 AOF 文件已损坏或不可用,则可以将每日 RDB 快照用作回退,从而承认自上次快照以来可能会丢失数据。