redis持久化rdb及aof

2020-06-07  本文已影响0人  gaobinzhan

介绍

​ 持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘中。当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置。Redis持久化分为RDBAOF,前者将当前数据保存到硬盘,后者则是将每次执行的写命令保存的硬盘。

RDB持久化

RDB是一种快照存储持久方式,具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中,默认保存的文件名为dump.rdb,而在Redis服务器启动时,会重新加载dump.rdb文件的数据到内存当中恢复数据。触发RDB持久化过程分为手动触发和自动触发。

触发机制

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

save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用。

bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。

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

除了执行命令手动触发之外,Redis内部还存在自动触发RDB的持久化机制,例如以下场景:

执行流程

bgsave是主流的触发RDB持久化方式:

redis-bgsave命令

服务器配置自动触发

​ 除了通过客户端发送命令外,还有一种方式,就是在Redis配置文件中的save指定到达触发RDB持久化的条件,比如【多少秒内至少达到多少写操作】就开启RDB数据同步。

例如我们可以在配置文件redis.conf指定如下的选项:

# 900s内至少达到1条写命令
save 900 1
# 300s内至少达到10条写命令
save 300 10
# 60s内至少达到1000条写命令
save 60 1000

这种通过服务器配置文件触发RDB的方式,与bgsave命令类似,达到触发条件时,会fork一个子进程进行数据同步,不过最好不要通过这种方式来触发RDB持久化,因为设置触发的时间太短,则容易频繁写入rdb文件,影响服务器性能,时间设置太长会造成数据丢失。

RDB文件的处理

保存:

压缩:

RDB方式的优缺点

优点:

缺点:

AOF持久化

AOF(append only file)持久化;与RDB存储某个时刻的快照不同,AOF持久化方式会记录客户端对服务器的每一次写操作命令到日志当中,并将这些操作以Redis协议追加保存到以后缀为aof文件末尾。

使用AOF

​ 开启AOF功能需要设置配置;appendonly yes,默认不开启。AOF文件名通过appendfilename配置设置,默认文件名是appendonly.aof。保存路径同RDB持久化方式一致,通过dir配置指定。

持久化配置

appendonly yes #启用aof持久化方式
appendfsync always #每次收到命令就立即强制写入磁盘,最慢的大概只有几百的TPS,但是保证完全的持久化,不推荐使用
appendfsync everysec #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
appendfsync no #完全依赖os,性能最好,持久化没保证,Redis不会主动调用fsync去将AOF日志内容同步到磁盘,所以这一切完全依赖于操作系统的调试了。对于大多数Linux操作系统,是每30s进行一次fsync,将缓冲区中的数据写的磁盘上。

执行流程

redis-aof

在同步期间可能会发生阻塞问题

redis-aof追加阻塞

其实这样做是为了保证文件安全性的一种策略。

AOF追加阻塞会产生的问题:

重写机制

触发机制:

AOF重写过程可以手动触发和自动触发:

当触发AOF重写时,内部流程:

image

执行AOF重写请求。如果当前进程正在执行AOF重写,请求不执行并返回如下响应:ERR Background append only file rewriting already in progress

注意事项

​ 在写入AOF日志文件时,如果Redis服务器宕机,则aof日志文件会出现格式错误,在重启Redis服务器时,Redis服务器会拒绝载入这个aof文件,可以通过命令修复aof并恢复数据。

redid-check-aof -fix appendonly.aof

AOF的优缺点

优点:

缺点:

AOF常用配置

appendonly no:是否开启AOF

appendfilename "appendonly.aof"AOF文件名

dir ./RDB文件和AOF文件所在目录

appendfsync everysec:fsync持久化策略

no-appendfsync-on-rewrite noAOF重写期间是否禁止fsync;如果开启该选项,可以减轻文件重写时CPU和硬盘的负载(尤其是硬盘),但是可能会丢失AOF重写期间的数据;需要在负载和安全性之间进行平衡

auto-aof-rewrite-percentage 100:文件重写触发条件之一

auto-aof-rewrite-min-size 64mb:文件重写触发提交之一

aof-load-truncated yes:如果AOF文件结尾损坏,Redis启动时是否仍载入AOF文件

重启加载的选择

AOFRDB文件都可以用于服务器重启时的数据恢复。

redis重写加载

持久化的选择

​ 在实际生产环境中,根据数据量、应用对数据的安全要求、预算限制等不同情况,会有各种各样的持久化策略;如完全不使用任何持久化、使用RDBAOF的一种,或同时开启RDB和AOF持久化等

​ 此外,持久化的选择必须与Redis的主从策略一起考虑,因为主从复制与持久化同样具有数据备份的功能,而且主机master和从机slave可以独立的选择持久化方案。

面分场景来讨论持久化策略的选择,下面的讨论也只是作为参考,实际方案可能更复杂更具多样性。

持久化配置方案

上一篇 下一篇

猜你喜欢

热点阅读