Redis持久化存根
redis 持久化:
redis提供了两种持久化方式:1、RDB;2、AOF
一、RDB:
redis默认持久化方式,在指定的时间间隔内生成数据集快照(point-in-time snapshot)需要在reids.conf中设置配置参数如下图
上图中21,22,23行
21行:在900毫秒内有1次change就执行一次save;22,23同理
运作流程:
流程描述:
- 判断是否有正在执行快照的子进程,如果有直接返回,如果没有父进程直接fork出一个子进程
- 父进程fork出子进程后会继续响应命令(正常工作),不会阻塞
- 子进程创建RDB文件,快照完毕后替换旧文件,通知父进程
- 父进程将同步过程中响应的数据同步到新RDB文件,快照完毕
RDB优缺点:
优点:RDB是一个紧凑压缩的二进制文件,代表了某个时间点的数据快照,可将文件存储文件服务器等,可用于某个时间点的快速容灾,恢复速度快
缺点:备份需要开启子进程,并且是全量备份,需要时间较长,无法做到秒级备份,两次备份之间数据容易丢失
二、AOF:
以命令的形式持久化,将所有的写操作命令以redis协议的格式追加到AOF文件的尾部,随着写入操作的不断增加AOF文件不断变大,这时候需要重写AOF文件(删除无效key,同一个key操作多次只保留最后一次等);
AOF默认关闭,如要开启需手动修改redis.conf配置文件如图:
红框内appendionly no 默认是no,只需要改成yes就可以打开AOF持久化方式
appendfilename 为AOF文件名可自定义
运作流程:
流程描述
- 所有的写入命令追加到AOF缓冲区
- AOF缓冲区数据根据一定策略同步到硬盘AOF文件
- AOF文件根据重写策略 进行重写压缩
- 服务器启动时加载AOF文件恢复数据
AOF追加写命令触发条件有3种:
AOF重写机制触发条件:
手动触发:直接调用bgrewriteaof命令。
自动触发:是按照已下两个条件来判断是否触发重写
- 根据auto-aof-rewrite-min-size:当aof文件大于多少字节后触发重写,默认64mb
- auto-aof-rewrite-percentage:当文件大小超过百分比触发。默认100,意味着文件超过2倍触发重写。
默认:第一次超过64mb重写,第二次超过64mb并且auto-aof-rewrite-min-size*2时重写---未验证
重写的运作流程:
流程描述:
- 发起AOF重写请求,如果存在AOF重写进程直接返回,如果存在保存AOF进程则等待本次保存结束后发起
- 父进程fork子进程
- 主进程
- 继续之前AOF文件追加流程
- 同步复制操作到AOF重写缓冲区,防止重写过程中新写入数据丢失
- 子进程新建AOF文件,根据重写策略重写AOF文件
- 子进程重写AOF文件后
- 子进程通知主进程,更新统计信息(重写使用时间,重写后文件大小等信息)
- 将主进程写入AOF缓冲区的信息同步到新AOF文件
- 新AOF文件替换旧AOF文件重写完成
三、重启加载:
运作流程:
流程说明:
- 服务重启,检查是否开启AOF持久化
- 存在:加载AOF文件,加载成功,启动成功
- 不存在:检查是否存在RDB持久化方式,不存在:启动成功;存在加载RDB快照启动成功
- RDB/AOF存在错误时。启动失败
数据文件损坏的时候如何修复
对于错误格式的AOF文件,先进行备份,然后采用redis-check-aof--fix命令进行修复,修复后使用diff-u对比数据的差异,找出丢失的数据,有些可以人工修改补全。AOF文件可能存在结尾不完整的情况,比如机器突然掉电导致AOF尾部文件命令写入不全。Redis为我们提供了aof-load-truncated配置来兼容这种情况,默认开启。加载AOF时,当遇到此问题时会忽略并继续启动