Redis 运行时数据保存在内存中, 一旦重启则数据将全部丢失.
Redis 提供了两种持久化方式:
RDB 持久化: 生成某个时间点的快照文件
AOF 持久化(append only file): 日志追加模式(Redis协议格式保存)
Redis可以同时使用以上两种持久化
RDB 持久化 执行 rdb 持久化时, Redis 会fork出一个子进程, 子进程将内存中数据写入到一个紧凑的文件中, 因此它保存的是某个时间点的完整数据。
如有需要,可以保存最近24小时的每小时备份文件,以及每个月每天的备份文件,便于遇到问题时恢复。
Redis 启动时会从 rdb 文件中恢复数据到内存, 因此恢复数据时只需将redis关闭后,将备份的rdb文件替换当前的rdb文件,再启动Redis即可。
优点
rdb文件体积比较小, 适合备份及传输
性能会比 aof 好(aof 需要写入日志到文件中)
rdb 恢复比 aof 要更快
缺点
服务器故障时会丢失最后一次备份之后的数据
Redis 保存rdb时, fork子进程的这个操作期间, Redis服务会停止响应(一般是毫秒级),但如果数据量大且cpu时间紧张,则停止响应的时间可能长达1秒
相关配置参数 ################################ SNAPSHOTTING ################################ # 快照配置 # 注释掉“save”这一行配置项就可以让保存数据库功能失效 # 设置sedis进行数据库镜像的频率。 # 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化) # 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化) # 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化) save 900 1 save 300 10 save 60 10000 #当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作,可以通过info中的rdb_last_bgsave_status了解RDB持久化是否有错误 stop-writes-on-bgsave-error yes #使用压缩rdb文件,rdb文件压缩使用LZF压缩算法,yes:压缩,但是需要一些cpu的消耗。no:不压缩,需要更多的磁盘空间 rdbcompression yes #是否校验rdb文件。从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。这跟有利于文件的容错性,但是在保存rdb文件的时候,会有大概10%的性能损耗,所以如果你追求高性能,可以关闭该配置。 rdbchecksum yes #rdb文件的名称 dbfilename dump.rdb #数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录 dir /var/lib/redis
AOF 持久化 AOF 其实就是将客户端每一次操作记录追加到指定的aof(日志)文件中,在aof文件体积多大时可以自动在后台重写aof文件(期间不影响正常服务,中途磁盘写满或停机等导致失败也不会丢失数据)
aof 持久化的fsync策略支持:
不执行 fsync:由操作系统保证数据同步到磁盘(linux 默认30秒), 速度最快
每秒1次:最多丢失最近1s的数据(推荐)
每条命令:绝对保证数据持久化(影响性能)
fsync:同步内存中所有已修改的文件数据到储存设备
aof 文件是一个只追加的文件, 若写入了不完整的命令(磁盘满, 停机…)时, 可用自带的 redis-check-aof
工具轻易修复问题:执行redis-check-aof --fix
aof文件过大时会触发自动重写, 重写后的新aof文件包含了恢复当前数据集所需的最少的命令集合.
客户端多次对同一个键 incr 时, 操作N次则会写入N条, 但实际上只需一条 set 命令就可以保存该值, 重建就是生成足够重建当前数据集的最少命令。 Redis 重写aof操作同样是通过 fork 子进程来处理的.
Redis 运行时打开 aof:
redis-cli> CONFIG SET appendonly yes
仅当前实例生命周期内有效
优点
充分保证数据的持久化,正确的配置一般最多丢失1秒的数据
aof 文件内容是以Redis协议格式保存, 易读
缺点
aof 文件通常大于 rdb 文件
速度会慢于rdb, 具体得看具体fsyn策略
重新启动redis时会极低的概率会导致无法将数据集恢复成保存时的原样(概率极低, 但确实出现过)
相关配置参数 ############################## APPEND ONLY MODE ############################### #默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。 appendonly yes #aof文件名, 保存目录由 dir 参数决定 appendfilename "appendonly.aof" #aof持久化策略的配置 #no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快。 #always表示每次写入都执行fsync,以保证数据同步到磁盘。 #everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。 appendfsync everysec # 在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间,no-appendfsync-on-rewrite字段设置为默认设置为no。如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,这样对持久化特性来说这是更安全的选择。设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。Linux的默认fsync策略是30秒。可能丢失30秒数据。 no-appendfsync-on-rewrite no #aof自动重写配置。当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候Redis能够调用bgrewriteaof对日志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。 auto-aof-rewrite-percentage 100 #设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写 auto-aof-rewrite-min-size 64mb #aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。重启可能发生在redis所在的主机操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项(redis宕机或者异常终止不会造成尾部不完整现象。)出现这种现象,可以选择让redis退出,或者导入尽可能多的数据。如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。如果是no,用户必须手动redis-check-aof修复AOF文件才可以。 aof-load-truncated yes