持久化
- RDB
- AOF
- 混合持久化
Redis是一个内存数据库,数据保存在内存中,一旦程序退出或异常就容易发生丢失。Redis为我们提供了持久化的机制,分别是RDB(Redis
DataBase)和AOF(Append Only File)。
RDB(快照持久化)
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。
在我们安装了redis之后,所有的配置都是在redis.conf文件中,里面保存了RDB和AOF两种持久化机制的各种配置。当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。
开启自动持久化后,数据会存储到名为 dump.rdb 的文件中。当 Redis 服务器重启时,检测到 dump.rdb 文件后,会自动加载进行数据恢复。
触发快照的时机
save 命令
Redis 处理命令的方式是以单线程形式来进行的,客户端的请求都会放入一个队列里。当执行save命令时,如果执行时间很长的话,后面的请求就会被阻塞,客户端发送的所有命令都会被拒绝。
bgsave 命令
与 save 不同的是,执行过程中它并不会阻塞客户端的请求。而是将持久化工作交给子进程来执行,主进程仍负责客户端请求的处理工作。
- 配置的快照规则(redis.conf)
# save m n # m 代表秒数,n 代表次数,表示 m 秒内发生 n 次变化时,会触发 bgsave
save 900 1 # 表示的是时间900秒内,如果 Redis 中数据至少发生一次变化,就会执行bgsave
save 300 10
save 60 10000
# 如果不需要持久化,那么你可以注释掉所有的 save 行来停用保存功能
RDB优缺点
优点
RDB可以最大化Redis的性能。
父进程在保存RDB文件时唯一要做的就是fork出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无需执行任何磁盘I/O操作。
- RDB 在恢复大数据集时,速度比 AOF 的恢复速度要快。
缺点
RDB快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。
当进行快照持久化时,会开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子进程不会反应出来,所以在快照持久化期间修改的数据不会被保存,可能丢失数据。一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。
AOF(文件追加持久化)
全量备份总是耗时的,Redis为我们提供了一种更加高效的持久化方式,即AOF(appendonlyfile)。此方式工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。默认情况下Redis没有开启AOF方式的持久化。
开启AOF持久化后,每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件,这一过程显然会降低Redis的性能,但大部分情况下这个影响是能够接受的,另外使用较快的硬盘可以提高AOF的性能。
开启 AOF 持久化后每执行一条修改数据的命令,Redis 就会将该命令写入 aof_buf 缓冲区。根据设置的同步选项,从而确保写命令同步到磁盘文件上的时机。
appendonly yes # 开启AOF
dir ./ # aof文件保存目录
appendfilename appendonly.aof # aof文件名称
appendfsync always # 每个写命令都同步
appendfsync everysec # 每秒同步一次
appendfsync no # 让操作系统来决定何时同步
AOF重写机制
auto-aof-rewrite-percentage 100 # AOF文件距离上次文件增长超过多少百分比
auto-aof-rewrite-min-size 64mb # AOF文件体积最小多大以上触发
满足所设置的条件时,会自动触发AOF重写,此时 Redis 会扫描整个实例的数据,重新生成一个AOF文件来达到瘦身的效果。
所以AOF重写机制,其实是重新生成一个AOF日志文件,只将当前有效并存在的数据转义成符合AOF日志格式的记录,然后依次写入该日志文件,最后刷入硬盘。这些操作都是在子进程中进行的,不会阻塞主进程而导致无法处理新的请求。
子进程还带来了一个问题,就是在子进程在生成AOF重写日志的时候,主进程还在处理新的请求,那么这段区间的写命令是没有记录下来的。
Linux的进程之间的通信可以pipe机制进行,Redis通过该机制,主进程将该段区间执行的命令传递给子进程,然后子进程将这些命令追加到AOF重写日志的末尾,因而解决了这个问题。
AOF恢复
Redis 中是通过创建一个不带网络连接的伪客户端来进行实现的。
AOF文件中的数据格式,都是由命令组成的。通过客户端直接执行每条命令就可以将数据进行恢复。
混合持久化
混合持久化其实就是 RDB 与 AOF 的混合模式
混合持久化是通过 aof-use-rdb-preamble 参数来开启的。它的操作方式是这样的,在写入的时候先把数据以 RDB 的形式写入文件的开头,再将后续的写命令以
AOF 的格式追加到文件中。这样既能保证数据恢复时的速度,同时又能减少数据丢失的风险。
在 Redis 重启时,先加载 RDB 的内容,然后再重放增量 AOF 格式命令。这样就避免了 AOF 持久化时的全量加载,从而使加载速率得到大幅提升。
Comments | NOTHING
该文章已经关闭评论