Junki
Junki
Published on 2025-01-21 / 43 Visits
0
0

Redis 宕机了,如何恢复数据?

Redis 持久化策略

Redis 宕机后恢复数据的方法主要取决于 Redis 所采用的持久化方式,官方支持的持久化有四种,如下:

  • RDB(Redis 数据库):RDB 持久性以指定的时间间隔执行数据集的时间点快照。
  • AOF(仅追加文件):AOF 持久性记录服务器接收到的每个写操作。然后可以在服务器启动时再次重播这些操作,从而重建原始数据集。命令使用与 Redis 协议本身相同的格式进行记录。
  • RDB + AOF:您还可以在同一个实例中组合 AOF 和 RDB。
  • 无持久性:您可以完全禁用持久性。这种策略,一般很少有人使用吧

RDB 持久化及恢复

  • RDB 持久化原理
    • RDB 是 Redis 的一种数据持久化方式,它将 Redis 内存中的数据在指定的时间间隔内进行快照,并将其存储为一个二进制文件。这个过程是通过 Redis 的 SAVEBGSAVE 命令完成的。
    • SAVE 命令会阻塞 Redis 服务器,直到 RDB 文件创建完成,在此期间,服务器不能处理其他请求。而 BGSAVE 命令会派生出一个子进程,由子进程在后台进行快照的创建,服务器可以继续处理客户端请求。
    • RDB 文件的生成条件可以在 Redis 的配置文件 redis.conf 中通过 save 指令进行设置,例如 save 900 1 表示在 900 秒内如果至少有 1 个键被修改,则触发 RDB 保存操作。
  • RDB 文件的存储位置和名称
    • RDB 文件的存储位置和文件名可以在 redis.conf 中通过 dirdbfilename 配置项进行设置。默认情况下,dir 是 Redis 工作目录,dbfilenamedump.rdb
    • 例如,dir /var/lib/redisdbfilename dump.rdb 表示 RDB 文件将存储在 /var/lib/redis 目录下,文件名为 dump.rdb
  • RDB 恢复数据步骤
    1. 首先,找到 RDB 文件所在的目录,根据 redis.conf 中的 dirdbfilename 信息。
    2. 确保 Redis 服务器的配置文件中的 save 配置正确,以便后续能继续进行 RDB 持久化操作。
    3. 启动 Redis 服务器,它会自动检查 RDB 文件是否存在。如果存在且有效,Redis 会将 RDB 文件中的数据加载到内存中。
    4. 注意:RDB 恢复数据是一次性的,将整个数据集从文件中读取并加载到内存中,适用于数据量较大且可以接受一定数据丢失的场景,因为它是按照配置的时间间隔进行快照,可能会丢失最后一次快照之后的数据。

AOF 持久化及恢复

  • AOF 持久化原理
    • AOF 是将 Redis 执行的写命令以追加的方式记录到一个日志文件(AOF 文件)中。每当 Redis 执行一个写操作(如 SETDEL 等),这个操作会被追加到 AOF 文件的末尾。
    • AOF 文件的文件名在 redis.conf 中通过 appendfilename 配置项设置,默认是 appendonly.aof
    • AOF 持久化有三种策略:
      • appendfsync always:每次写操作都同步到 AOF 文件,这种方式性能最差,但数据安全性最高,几乎不会丢失数据。
      • appendfsync everysec:每秒同步一次 AOF 文件,兼顾性能和数据安全,最多丢失 1 秒的数据。
      • appendfsync no:让操作系统决定何时同步 AOF 文件,性能最好,但数据丢失风险最大。
  • AOF 文件的存储位置
    • AOF 文件存储位置通常与 RDB 文件的存储位置相同,可在 redis.conf 中通过 dir 配置项指定。
  • AOF 恢复数据步骤
    1. 首先,找到 AOF 文件的位置,根据 redis.conf 中的 appendfilenamedir 信息。
    2. 由于宕机可能导致 AOF 文件不完整或损坏,使用 redis-check-aof 工具进行检查和修复。例如,执行 redis-check-aof --fix /path/to/appendonly.aof,该工具会修复 AOF 文件,将损坏部分删除,原文件会被重命名为 .bak 后缀的文件。
    3. 确保 Redis 配置文件中的 appendonly 参数设置为 yes,表示启用 AOF 持久化。
    4. 启动 Redis 服务器,它会自动读取 AOF 文件并执行其中的写命令,从而将数据逐步恢复到 Redis 内存中。
    5. 注意:AOF 恢复数据的过程可能比 RDB 慢,因为需要重新执行 AOF 文件中的所有写命令,但它能提供更好的数据完整性保证,适用于对数据丢失要求非常严格的场景。

混合持久化及恢复

  • 混合持久化原理
    • 从 Redis 4.0 开始支持混合持久化。在 AOF 重写时,Redis 将内存中的数据以 RDB 格式保存到 AOF 文件的开头,然后将 AOF 重写缓冲区中的增量数据以 AOF 格式追加到文件末尾。
    • 这样结合了 RDB 的快速恢复和 AOF 的数据完整性优势。
    • 混合持久化的开启可以在 redis.conf 中通过 aof-use-rdb-preamble yes 进行设置。
  • 混合持久化文件的存储位置和名称
    • 存储位置和名称与 AOF 文件相同,通过 dirappendfilename 配置。
  • 混合持久化恢复数据步骤
    1. 找到 AOF 文件(此时 AOF 文件包含了 RDB 部分和 AOF 部分),根据 redis.conf 中的 appendfilenamedir 信息。
    2. 确保 Redis 配置文件中的 appendonly 设置为 yes,且 aof-use-rdb-preamble 设置为 yes,表示启用混合持久化。
    3. 启动 Redis 服务器,它会先加载 AOF 文件中的 RDB 部分,快速恢复大部分数据,然后再重放 AOF 部分的增量数据,完成数据的完整恢复。

在 Redis 宕机后,需要根据实际使用的持久化方式来进行数据恢复操作。同时,为了确保数据的安全性,建议定期备份 RDB 和 AOF 文件,并且可以根据不同的业务场景选择合适的持久化策略或组合使用,例如对于对性能要求较高但能接受一定数据丢失的场景可以主要依赖 RDB,对于数据完整性要求极高的场景可以使用 AOF 或混合持久化。在进行恢复操作前,最好先备份现有的文件,防止恢复过程中出现意外导致文件损坏或丢失。

在实际操作中,需要注意不同 Redis 版本之间的细微差异,尤其是在配置文件和持久化功能的实现上。如果出现问题,可以查看 Redis 的日志文件,通常位于 Redis 服务器的工作目录下,日志文件会提供有关持久化和恢复操作的详细信息,帮助解决恢复过程中遇到的问题。


Comment