redis-4-持久化
2018-10-10 10:37:09 62 举报
AI智能生成
根据redis开发与运维一书,整理的知识点,分章节总结,有兴趣的可以查看下,这是第五章节
作者其他创作
大纲/内容
AOF
默认不开启:appendonly yes
流程
1:所有命令会追加到aof_buf缓冲区
2:AOF缓冲区根据对应的策略向硬盘做同步操作
3:AOF越来越大,需要定期对AOF文件进行重写-压缩
4:重启redis服务器,加载AOF文件进行数据恢复
命令写入
写入的内容是文本协议格式
eg:set hello world
*3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n
eg:set hello world
*3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n
文件同步
always:每次都写入AOF缓冲区,然后同步到硬盘
TPS受到硬盘性能影响,很低,不建议
TPS受到硬盘性能影响,很低,不建议
everysec:命令写入缓冲区后调用系统write操作,
fsync操作由专门线程每秒调用一次
建议配置
fsync操作由专门线程每秒调用一次
建议配置
no:命令写入缓冲区后调用系统write操作,
不对AOF文件做fsync同步,同步操作由OS负责,
不建议
不对AOF文件做fsync同步,同步操作由OS负责,
不建议
重写机制
为什么变小
1:进程内已经超时的数据不再写入文件
2:旧的AOF文件含有无效命令,重写后只保留最终数据
3:多条命令可以合并为一个
触发
1:手动触发:直接调用bgrewriteaof
2:自动触发:根据auto-aof-rewrite-min-size和
auto-aof-rewrite-percentage参数确定自动触发机制
auto-aof-rewrite-percentage参数确定自动触发机制
流程
1:执行AOF请求
2:父进程执行fork创建子线程
3.1:主进程fork完成后,继续响应应其他命令
所有修改命令依然写入缓冲区,并根据appendfsync同步到硬盘
所有修改命令依然写入缓冲区,并根据appendfsync同步到硬盘
3.2:由于fork采用写时复制技术,子进程只能共享fork操作时的内存数据
父进程依然响应命令,redis使用“AOF重写缓冲区”保存这部分数据
父进程依然响应命令,redis使用“AOF重写缓冲区”保存这部分数据
4:子进程根据内存快照,按照命令合并规则写入新的AOF文件
5.1:新的AOF文件写入完成后,子进程发送信号给父进程,后者更新统计信息
5.2:父进程把AOF重写缓存区的数据写入到新的AOF文件
5.3:使用新的AOF文件替换旧文件,完成重写
加载
优先加载AOF文件,如果AOF未开启或者AOF文件不存在,则加载RDB
加载损坏的AOF文件,redis会拒绝启动
对于错误的AOF文件,先进行备份,然后使用命令修复
修复后对比文件,找出丢失的数据,或者人工补全
修复后对比文件,找出丢失的数据,或者人工补全
RDB
触发机制
save
基本废弃
bgsave
如果从节点执行全量复制,主节点自动执行bgsave生产RDB文件并发送给从节点
ad命令重新加载redis时,也会自定触发save
默认情况下执行shutdown,如果没有开启AOF则自动执行bgsave
执行流程
1:执行bgsave,redis父进程判断是否有正在执行的AOF/RDB子进程,如存在则返回
2:父进程执行fork操作,此时会阻塞
3:父进程fork完成后,bgsave返回开始信息,父进程不再阻塞,继续执行其他命令
4:子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原文件进行原子替换
5:子进程发送信号给父进程表示完成
RBD文件处理
RDB文件保存子dir配置指定的目录下,文件名通过dbfilename指定
默认采用LZF算法对生成RDB文件压缩处理,由于压缩率很大,默认开启,建议线上开启
RDB文件的优缺点
RDB是一个压缩的二进制文件,代表的是redis某一时刻的数据快照,适合备份和全量复制
加载RDB文件恢复数据的速度远远快于AOF方式
没办法做到实时/秒级持久化,由于需要开启子进程,消耗大,频繁执行成本高
RDB文件时特定二进制格式,由于redis演进,导致多种格式的RDB文件,新版本不兼容旧版本
0 条评论
下一页