亲宝软件园·资讯

展开

Redis持久化

Wang1​​​​​​​ 人气:0

1. 前言

为什么要进行持久化?:持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。

持久化都有那些方式?:Redis支持RDB和AOF两种持久化机制。

2. RDB

RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发自动触发

2.1 手动触发

手动触发分别对应savebgsave命令:

显然bgsave命令是针对save阻塞问题做的优化。因此Redis内部所有的涉及RDB的操作都采用bgsave的方式,而save命令已经废弃。

2.2 自动触发

3. bgsave大致流程

流程说明:

关于RDB文件:

4. RDB持久化方式的优缺点

优点:

缺点:

5. AOF

AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。主要作用是解决了数据持久化的实时性。

6. AOF的使用方式

7. AOF流程剖析

流程描述:

7.1 命令写入

AOF命令写入的内容直接是文本协议格式。例如set hello world这条命令,在AOF缓冲区会追加如下文本:

*3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n

为什么使用文本协议格式?

为什么要追加到aof_buf中而不是直接写入硬盘?

7.2 文件同步

Redis提供了多种AOF缓冲区同步文件策略,由参数appendfsync控制。

系统调用write和fsync的几点说明:

策略的几点说明:

7.3 重写机制

为什么要重写?:

怎么重写?:

重写后那些优化让文件变小了?:

重写有那些触发方式?:

自动触发时机:

aof_current_size > auto-aof-rewrite-minsize && (aof_current_size-aof_base_size)/aof_base_size >= auto-aof-rewrite-percentage

aof_current_size 和 aof_base_size 可以在info Persistence统计信息中查看。

重写流程概述:

流程描述:

7.4 重启加载

流程描述:

关于文件校验:

加载损坏的AOF文件时会拒绝启动,并会输出:

Bad file format reading the append only file: make a backup of your AOF file,then use ./redis-check-aof --fix <filename>

对于错误格式的AOF文件:先进行备份,然后采用redis-check-aof --fix命令进行修复,修复后使用diff-u对比数据的差异,找出丢失的数据,有些可以人工修改补全。

对于AOF文件结尾不完整:比如机器突然掉电导致AOF尾部文件命令写入不全。Redis为我们提供了aof-load-truncated配置来兼容这种情况,默认开启。加载AOF时,当遇到此问题时会忽略并继续启动,同时打印如下警告日志:

# !!! Warning: short read while loading the AOF file !!!
# !!! Truncating the AOF at offset 397856725 !!!
# AOF loaded anyway because aof-load-truncated is enabled

8. 问题定位与优化

8.1 关于fork操作

当Redis做RDB或AOF重写时,一个必不可少的操作就是执行fork操作创建子进程,对于大多数操作系统来说fork是个重量级操作虽然fork创建的子进程不需要拷贝父进程的物理内存空间,但是会复制父进程的空间内存页表,因此fork操作耗时跟进程总内存量息息相关。可以在info stats统计中查latest_fork_usec指标获取最近一次fork操作耗时,单位微秒。

减少fork耗时的措施:

8.2 关于子进程开销

CPU:

内存:

硬盘:

8.3 关于AOF追加阻塞

描述:当开启AOF持久化时,常用的同步硬盘的策略是everysec,用于平衡性能和数据安全性。对于这种方式,Redis使用另一条线程每秒执行fsync同步硬盘。当系统硬盘资源繁忙时,会造成Redis主线程阻塞。

问题定位:

流程概述:

也就是说:

加载全部内容

相关教程
猜你喜欢
用户评论