Redis是内存数据库,宕机后数据会消失,Redis重启后快速恢复数据,要提供持久化机制
Redis的两种持久化方式:RDB 和 AOF,默认使用的是 RDB
实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是 快照。这样一来即使故障宕机,快照文件也不会丢失,数据的可靠性也就得到了保证。 这个快照文件就称为 RDB文件(dump.rdb)(RDB文件是二进制文件,不易阅读,但存的更多),等Redis恢复时再将 RDB 文件直接读回内存里,其中,RDB 就是 Redis DataBase的缩写。
以下是redis7的 conf 配置界面
配置的 save
同时也可在 conf 配置 dbfilename(RDB 文件名,集群模式建议配置) 以及 dir (RDB文件的输出位置)
Redis提供了两个命今来生成RDB文件分别是 save 和 bgsave
在主程序中执行会 阻塞 当前redis服务器,直到持久化工作完成执行save命令期间,Redis不能处理其他命令,线上禁止使用
Redis会在 后台异步 进行快照操作,不阻塞,快照同时还可以响应客户端请求,该触发方式会 fork一个子进程,由子进程复制持久化过程
补充:fork()是 unix 和 linux 这种操作系统的一个api,而不是Redis的api。fork()用于创建一个子进程,注意是子进程,不是子线程。fork()出来的进程共享其父类的内存数据。仅仅是共享fork()出子进程的那一刻的内存数据,后期主进程修改数据对子进程不可见,同理,子进程修改的数据对主进程也不可见。而且子进程B出问题了,对主进程A完全没影响,主进程A依然可以对外提供服务,但是主进程挂了,子进程也必须跟随一起挂。
可以通过 lastsave 命令获取最后一次成功执行快照的时间戳
执行flushall/flushdb命令也会产生 dump.rdb文件,但里面是空的,无意义
Redis Shutdown 命令执行以下操作:
stop-writes-on-gsave-error(建议用默认的保证一致性)
rdbcompression
rdbchecksum
个人感觉没必要为这10%省掉数据校验这比较重要的步骤
rdb-del-sync-files(集群的相关配置,建议默认)
优势
劣势
以日志(易阅读)的形式来记录每个写操作,将Redis执行过的所有 写指令 记录下来(读操作不记录),AOF保存的是 appendonly.aof 文件,并且只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
默认情况下,redis是没有开启AOF(append only file)的。开启AOF功能需要设置配置: appendonly yes
同步写回,每个写命今执行完立刻同步地将日志写回磁盘
每秒写回,每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,每隔1秒把缓冲区中的内容写入磁盘
操作系统控制的写回,每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
Redis7之前
AOF保存文件的位置和RDB保存文件的位置一样,都是通过redis.conf配置文件的 dir 配置
Redis7
Redis7 里AOF保存文件的位置 由 dir + appenddirname 组成
Redis7之前
有且只有一个 appendonly.aof 文件
Redis7.0 Multi Part AOF的设计
MP-AOF就是将原来的单个AOF文件拆分成多个AOF文件,并且统一存放在appenddirname指定的目录下
当key-value写入时,BASE文件和清单文件不会动,由 INCR文件记录
故意乱写正常的AOF文件模拟网络闪断文件写error,下面是在 增量文件INCR 乱插入一行
重启 Redis 之后就会进行 AOF 文件的载入,会发现启动都不行
修复命令
redis-check-aof --fix 文件路径
优势
劣势
由于AOF持久化是Redis不断将写命令记录到AOF文件中,随着Redis不断的进行,AOF 的文件会越来越大文件越大,占用服务器内存越大以及 AOF 恢复要求时间越长
为了解决这个问题,Redis新增了重写机制,当AOF文件的大小超过所设定的峰值时,Redis就会自动启动(通过子进程)AOF文件的内容压缩只保留 可以恢复数据的最小指令集可以手动使用命令 bgrewriteaof来重写
解释一下什么是 可以恢复数据的最小指令集
满足配置文件中的选项后,Redis会记录上次重写时的AOF大小
默认配置是当AOF文件大小是上次rewrite后大小的一倍并且文件大于64M时
可以手动使用命令 bgrewriteaof来重写
因为Redis默认使用的是 RDB持久化机制 ,如果需要使用 RDB-AOF混合持久化机制的话还需要将AOF开启。
在RDB-AOF混合持久化模式下,RDB和AOF的触发机制是各自独立的。RDB持久化根据save配置项触发,而AOF持久化根据appendfsync选项触发。
aof-use-rdb-preamble yes # redis5.0后默认开启
因为AOF文件数据完整性更高,所以redis会优先读取AOF文件
RDB镜像做全量持久化,AOF做增量持久化
RDB可以用来做异地容灾,通常用来作为兜底的手段