文章目录
- 1.Redis混合持久化原理
- 2.采用混合持久化时,用的aof文件和rdb分别记录的是什么时候的数据?
- Redis 宕机,数据会丢失么?
1.Redis混合持久化原理
Redis的混合持久化(Hybrid Persistence)是一种结合了RDB(Redis Database Backup)和AOF(Append Only File)持久化方式的策略。这种策略旨在结合两者的优点,提高数据的安全性和恢复速度,同时减少数据丢失的风险。以下是混合持久化原理的详细解释:
-
RDB持久化:
- RDB持久化通过周期性地创建内存数据的快照来保存数据。
- 这些快照保存在磁盘上的RDB文件中,可以用于快速恢复整个Redis数据库的状态。
-
AOF持久化:
- AOF持久化记录每个写操作命令,并将其追加到AOF文件中。
- 当Redis重启时,可以通过重放AOF文件中的命令来重建数据库状态。
-
混合持久化工作流程:
- 在混合持久化模式下,Redis首先使用RDB方式创建一个数据快照。
- 随后,Redis切换到AOF模式,继续记录所有写操作命令。
- 当Redis重启时,它会首先加载RDB快照文件以快速恢复到快照时的状态。
- 然后,Redis会读取AOF文件,重放快照之后的所有写操作命令,以恢复到最新状态。
-
优点:
- 快速启动:由于RDB文件通常比AOF文件小,且恢复速度快,因此可以使用RDB文件快速启动Redis服务器。
- 数据完整性:AOF文件记录了快照之后的所有写操作,即使快照文件损坏或丢失,也可以通过AOF文件恢复数据。
- 减少数据丢失:在混合持久化模式下,即使发生故障,也只会丢失最后一次快照之后的数据,而不是所有未持久化的数据。
-
配置:
- 要启用混合持久化,需要在Redis配置文件中同时启用RDB和AOF持久化,并设置适当的同步策略。
- 例如,可以配置自动触发RDB快照的保存条件,以及AOF文件的同步频率。
-
注意事项:
- 混合持久化虽然提高了数据安全性,但也可能增加系统的复杂性和维护成本。
- 在某些情况下,如果AOF文件过大,重放所有命令可能会影响Redis重启的速度。
混合持久化是一种灵活的持久化策略,适用于对数据安全性和恢复速度都有较高要求的场景。通过合理配置和优化,可以充分发挥混合持久化的优势。
2.采用混合持久化时,用的aof文件和rdb分别记录的是什么时候的数据?
在 Redis 中采用混合持久化时,AOF 文件和 RDB 文件各自记录的数据范围是不同的,具体如下:
-
RDB 文件:
- RDB 文件记录的是在某一个时间点(由
save
配置或手动执行BGSAVE
/SAVE
命令触发)Redis 内存中所有数据的快照。快照就是把Map序列化进去RDB文件!!! - 这个快照包含了那一刻所有键值对的完整状态,可以用来快速恢复 Redis 服务器到该时间点的状态。
- RDB 文件记录的是在某一个时间点(由
-
AOF 文件:
- AOF 文件记录的是自上一次 RDB 快照创建以来,所有写操作命令的序列。
- 当 Redis 重启时,AOF 文件用于重放这些命令,以便将服务器状态从 RDB 快照的结束点恢复到最新的状态。
- AOF 文件提供了更细粒度的数据恢复,因为它记录了每一个写操作,这意味着即使在多次快照之间发生故障,也只会丢失最后一次快照后的数据。
混合持久化的工作原理是:
- 当 Redis 启动时,它会首先加载 RDB 文件以快速恢复到某个时间点的状态。
- 然后,Redis 会继续从 AOF 文件中读取自 RDB 快照以来的所有写操作命令,并按顺序执行这些命令,以确保数据的完整性和一致性。
这种混合持久化策略结合了 RDB 和 AOF 的优点:
- RDB 提供了快速的数据恢复能力,适合大规模数据的快速加载。
- AOF 提供了更好的数据持久化安全性,因为它记录了所有的写操作命令,减少了数据丢失的风险。
Redis 宕机,数据会丢失么?
如果我们没开启任何持久化机制,那么会丢失全部数据,否则只会丢失部分数据,丢失数据的多少取决于持久化配置。
Redis 提供了两套持久化机制,一个是 RDB,它会根据情况定期的 Fork 出一个子进程,生成当前数据库的全量快照;另一个是 AOF,它通过向 AOF 日志文件追加每一条执行过的指令实现。
而对于 RDB 快照,假如我们在 RDB 快照生成后宕机,那么会丢失快照生成期间全部增量数据,如果在连快照都没成功生成,那么就会丢掉全部数据。
而当我们仅开启了 AOF 时,丢失数据的多少取决于我们设置的刷盘策略:当设置为每条指令执行后都刷盘 Always,我们最多丢失一条指令;当设置为每秒刷一次盘的 Eversec 时,最多丢失一秒内的数据;当设置为非主动刷盘的 No 时,则可能丢失上次刷盘后到现在的全部数据。
所以,我们为了避免数据过多丢失,一般都会采用 AOF 方式。由于通过 AOF 恢复数据相对比较耗时,因此 Redis 在 4.0 以后允许通过 aof‐use‐rdb‐preamble 配置开启混合持久化。
当 AOF 重写时,它将会先生成当前时间的 RDB 快照(序列化对象),然后将序列化对象写入新的 AOF 文件,接着再把增量数据追加到这个新 AOF 文件中。如此一来,当 Redis 通过 AOF 文件恢复数据时,将会先加载 RDB,然后再重放后半部分的增量数据。这样就可以大幅度提高数据恢复的速度。