Redis突然挂了,数据丢了多少?就看你用RDB还是AOF
技术解析
RDB
和 AOF
是Redis提供给你的两种选择。你可以只选择其中一种,也可以同时开启两者,以获得更高级别的保障。
1. RDB (Redis Database) - “快照”模式
• 工作原理: RDB是Redis默认的持久化方式。它在指定的时间间隔内,会执行一个“快照”操作,将内存中的所有数据以一种紧凑的二进制格式写入到磁盘上的一个
.rdb
文件中。- • 配置示例:
# 设置快照规则:900秒内有1次写入,或300秒内有10次写入,或60秒内有10000次写入,则执行快照 save 900 1 save 300 10 save 60 10000# 开启后台快照模式。Redis会 fork 一个子进程进行快照,不阻塞主进程 stop-writes-on-bgsave-error yes
• 优点:
• 文件小,恢复快:
.rdb
文件是经过压缩的二进制文件,非常紧凑,适合用于备份和快速恢复。• 性能高:
fork
子进程进行快照,对Redis主进程的性能影响最小,因为它只需做少量的I/O操作。
• 缺点:
• 数据有丢失风险: 由于快照不是实时进行的,如果在两次快照之间Redis意外宕机,那么这段时间的数据会永久丢失。
2. AOF (Append Only File) - “日志”模式
• 工作原理: AOF持久化以日志的形式,记录Redis执行过的每一个写操作命令。当Redis重启时,它会重新执行AOF文件中的所有命令来恢复数据。
- • 配置示例:
# 开启AOF持久化 appendonly yes# 设置AOF文件的同步策略 # everysec:每秒同步一次,性能和数据安全性兼顾 (常用) # always:每次写入都同步,最安全但性能差 # no:不同步,由操作系统决定,最不安全 appendfsync everysec
• 优点:
• 数据安全性高: 可以设置成每秒同步一次(
everysec
),最多只会丢失一秒的数据。• 日志可读: AOF文件记录的是命令,是纯文本,易于理解和恢复。
• 缺点:
• 文件大,恢复慢: AOF文件记录了所有操作,文件会比RDB文件大得多,恢复数据时需要重新执行所有命令,耗时更长。
如何选择?
• RDB 适合用于灾难恢复,因为它快,文件小。你可以定期将RDB文件备份到远程。
• AOF 适合用于实时数据备份,因为它安全性高。
• 最佳实践: 结合使用。开启RDB进行周期性的全量备份,同时开启AOF进行秒级增量备份。在Redis重启时,会优先使用AOF文件进行恢复。
故事场景:大厨的“独门菜谱”
你(Redis)是一位米其林三星大厨,你所有的烹饪秘诀都记录在一本厚厚的菜谱(内存数据)里。为了防止你的菜谱因意外丢失,你需要进行备份。
方式一:RDB — “定时拍照存档”
这是一种追求效率,但有风险的备份方式。
• 工作流程:
你觉得做菜不能被打断,所以你不会实时地记录你的每个操作。相反,你设置了一个“定时拍照”的智能相机(BGSAVE
命令)。• 比如,你设定它每隔30分钟,就对你的菜谱拍一张完整的照片,然后将这张照片压缩,存放在保险柜(磁盘)里。
• 优点:
• 速度快: 拍照过程非常快,不影响你做菜。备份出来的照片文件很小,可以轻松地上传到云端。
• 恢复快: 如果菜谱真的丢失了,你只需要从保险柜里取出最近的一张照片,就能快速地重现你的菜谱。
• 缺点:
• 风险: 假如你在拍照后,又花了29分钟创造了一道新菜,然后厨房突然着火了(服务器宕机)。等你重开厨房,你只能从30分钟前的那张照片恢复。你最新创造的这29分钟的新菜谱,永远地丢失了。
方式二:AOF — “每写一步,都记到日志”
这是一种追求极致安全,但有代价的备份方式。
• 工作流程:
你雇佣了一位专业的速记员。你告诉他:“我做的每一个操作,无论大小,你都必须用文字记录下来。”• 每当你往菜谱里加一个新配料,或者改动一个步骤,速记员都会在旁边的一本日志本(AOF文件)上,用文字详细地记下来:“步骤一:加入3克盐。步骤二:翻炒10秒...”。
• 优点:
• 安全:你可以让速记员每秒钟都向保险柜同步一次日志。即使厨房立刻着火,你最多只会丢失一秒钟的日志,安全性极高。
• 可读性强:日志是文字,你可以随时拿出来,看清楚你每一步都做了什么。
• 缺点:
• 日志多,恢复慢: 这本日志本会记录你的每一个操作,很快就会变得比菜谱本身还要厚。如果菜谱丢了,你要恢复时,需要让一个学徒(Redis恢复进程)把这本日志从头到尾,每一个操作都重新做一遍。这会非常耗时。
故事总结:
持久化方式 | RDB (定时拍照) | AOF (操作日志) |
工作原理 | 全量快照 ,拍照片 | 增量日志 ,记命令 |
文件大小 | 小 ,二进制压缩 | 大 ,记录所有操作 |
恢复速度 | 快 (直接载入) | 慢 (重新执行所有命令) |
数据安全性 | 有丢失风险 (两次快照之间的数据) | 高 (可实现秒级恢复) |
核心比喻 | 每隔一段时间对菜谱拍张照 | 每写一步,都记到日志本上 |
最终建议:
大厨最终决定,他要把两种方法结合起来用:
“每天早上营业前,用相机拍一张菜谱的完整照片,然后平时做菜时,让速记员在一旁持续记录。这样,即使发生了意外,我最多也只丢失当天工作的一部分,而不会丢失全部。”
这正是Redis的最佳实践。