一、三种持久化机制
- RDF快照:通过某一时刻的快照,将数据以二进制形式永久存储在磁盘中。
- AOF:将每个修改命令通过write函数追加到文件中。
- 混合持久化:AOF重写时,将重写这一刻之前的内存做RDB快照存储,并将此刻以后增量的AOF文件写入新的AOF文件中。
二、RDB快照
(一)原理
- Redis借助操作系统提供的写时复制技术(Copy-On-Write, COW)保存数据,此技术有两种方式:save(同步、阻塞)、bgsave(异步不阻塞)。
- 原理:主线程fork出一条子线程,此子线程可以共享主线程内的所有数据。bgsave命令执行后,子线程读取主线程中的数据并写入到RDB文件中。此时,如果主线程正在执行“读”操作,则子线程继续写入;如果主线程正在执行“写”操作,子线程会复制一份正在执行“写”操作的数据,将数据写入RDB文件中。
(二)bgsave写时复制原理
三、AOF
AOF方式持久化会将每一条修改指令追加到appendonly.aof文件中,每隔一段时间fsync到磁盘。
aof功能的三种策略配置(默认策略时:appendfsync everysec)
- appendfsync always: 每次有新命令都追加到AOF文件中,并在此时执行一次fsync,非常慢也非常安全。
- appendfsync everysec: 每秒fsync一次,足够快,并且发生故障时至多丢失1秒的数据。
- appendfsync no: 从不fsync,将数据交给操作系统来处理。更快也更不安全的选择。
四、RDB和AOF的对比
命 令 | RDB | AOF |
启动优先级 | 低 | 高 |
体 积 | 小 | 大 |
恢复速度 | 快 | 慢 |
数据安全性 | 容易丢失数据 | 根据策略决定 |
注:两者可以都启用。Redis启动时如果既有rdb文件又有aof文件则优先选择aof文件恢复数据,因为aof一般来说数据更安全一点。
五、Redis的数据备份策略
- 写crontab定时任务调度脚本,每小时都copy一份aof的备份数据到一个目录中,保留最近48小时的备份;
- 每天都保留一份当日的数据备份到同一个目录中取,可以保留最近一个月的备份;
- 每次copy备份的时候,都把太久的备份给删了;
- 每天晚上将当前及其的备份复制一份到其他机器,以防止及其损坏。