1 数据持久化
Redis有自己的持久化机制,以防宕机后内存中的数据丢失。当宕机后,便从磁盘恢复内存数据结构。
1.1 快照
Redis是使用COW机制实现快照持久化。
- 第一步:Redis可以fork出一个子进程,子进程与父进行共享内存中的数据页面,由子进程完成快照持久化任务。
- 第二步:子进程处理的是产出时那一瞬间的数据,它不会修改现有的内存数据结构,只是对数据结构进行遍历读取,然后序列化写入磁盘中。
- 第三步:在子进程进行快照持久化的过程中,父进程可能会修改数据,但是会先复制出一份数据页面,对这个复制的页面进行修改。
1.2 AOF
AOF日志记录了对Redis中数据的修改指令记录,可以通过重放的操作来恢复Redis中的数据结构。
AOF记录修改性指令过程:
- 第一步:Redis接受客户端数据修改命令,先进行参数校验。
- 第二步:将该指令存储到AOF日志中,即写入磁盘。
- 第三步:执行对应的指令。
但是这会有一个问题,那就是AOF日志会随着Redis的长期运行而变得越来越长,那么重放AOF日志会非常耗时,恢复Redis将需要漫长的时间。
Redis提供了对AOF日志重写的机制:
- 第一步:生成一个子进程,对当前Redis内存中的数据结构进行遍历,转换成一系列的操作指令并序列化到一个新的AOF日志文件中。
- 第二步:将操作期间的增量AOF日志追加到新的AOF日志中。
- 第三步:用新的AOF日志替换旧的AOF日志。
1.3 混合持久化
通常而言,快照和AOF各有弊端,比如使用快照会丢失数据,使用AOF性能很低,所以我们一般是将二者结合,混合持久化。
- 第一步:Redis重启时,先加载快找中的内容。
- 第二步:重放AOF日志,注意:这里的AOF日志是从快照持久化开始至今的日志,通常不大。
1.4 从节点持久化
一般而言,Redis的持久化操作是由从节点完成的,因为从节点没有来自于客户端的请求压力。但是我们需要注意如果从节点连接不上主节点,那么数据就会丢失,所以需要加强监控工作。