目录
介绍
RDB(redis database)
是什么
备份如何执行
配置
优势
劣势
备份恢复
AOF(Append Only File)
是什么
数据恢复
正常恢复
异常恢复
同步频率设置
重写(压缩)
持久化流程
优势
劣势
总结
redis持久化操作方式有两种:RDB和AOF。
在指定的时间间隔内将内存中的数据集快照写入磁盘,快照为保存时间点的所有数据。它恢复时是将快照文件中的数据直接读到内存中。
redis使用RDB进行备份时,会单独创建一个子进程进行持久化,会先将数据写到一个临时文件中,待持久化过程结束了,在用这个临时文件替换上次持久化好的文件。整个过程中主进程时不进行任何IO操作的。这就确保了极高的性能,如果需要进行大规模的数据恢复,且对于数据恢复的完整性不是很敏感,那RDB的方式比AOF方式更加高效。RDB的缺点是最后一次持久化后的数据可能丢失(因为RDB备份时通过一定周期来进行备份的)。
为什么要将数据先保存到临时文件:
为了保证数据的一致性和完整性。防止在持久化时redis服务器挂了,数据没有持久化完成。
默认生成持久化文件名。
生成dump.rdb文件的默认位置在redis服务器启动时所在的目录。
当redis无法写入磁盘时,直接关掉redis的写操作。推荐yes。
持久化文件是否进行压缩。如果时yes,redis会采用LZF算法进行压缩。如果不想消耗CPU来进行压缩,可以关闭此功能。
检测完整性。
在存储快照时,还可以让redis使用CRC64算法来进行数据校验。
但是这样做会增加大约10%的性能消耗。推荐yes
save 多少秒 有多少key发生变化
下面框住的表示,默认当3600秒内有一个key发送变化,会进行持久化。当300秒至少有100个key发送变化,才会进行持久化,60秒内至少有10000个key发生变化才会进行持久化。
这样说明,想持久化的时间越短,数据的变化需要越多。
禁止使用
注意:需要过完时间才进行持久化。
演示:
1. 修改配置
2. 重启redis服务器
3. 查看dump.rdb文件
当前启动redis的目录下没有dump.rdb文件
4. 在20秒内修改3个key
5. 再次查看dump.rdb文件
1. redis会通过redis.conf文件中save字段的规则会持久化数据到dump.rdb中。
以日志的形式来记录每一个写操作(增量保存),写操作包括插入,删除和修改,不包括查询。并且是将redis执行过的写指令记录下来。只允许追加文件,但是不允许改写文件。
redis启动的时候会读取该日志文件来进行重构数据,也就是redis启动的时候会根据日志文件中的内容将写操作指令从前到后执行一次来完成数据的恢复工作,与RDB类似。
AOF默认不开启。可以在redis.conf配置文件来配置日志文件的名称,默认是appendonly.aof。日志文件生成的位置也是在redis服务器启动时所在的目录下。
RDB时默认开启的,当AOF和RDB都开启了,redis会使用哪一个做来进行数据恢复呢?
答案是AOF。
演示:
将AOF开启,重启服务器。
查看生成的日志文件
重新连接redis客户端,查看数据。redis中没有数据,说明使用的时AOF来恢复数据。
插入数据后,查看日志文件,大小不为0。
查看dump.rdb文件,大小也变化了。说明数据持久化不仅使用了AOF,也使用了RDB。
总结:
当RDB和AOF都开启时,数据恢复使用的是AOF,持久化RDB和AOF都会使用。因为数据不会存在丢失的情况。
AOF的数据持久化的机制虽然和RDB不同,但是数据恢复的操作同RDB一样。同样是备份日志文件,需要时恢复到redis的启动目录下,redis启动时系统会自动加载。
演示:
之前有向redis中插入数据。
将日志文件备份,后关闭redis服务,删除日志文件(模拟redis服务宕机,误删日志文件),在恢复日志文件重启redis服务。
数据恢复了
日志文件中记录的时在redis中写操作数据的指令,有特定的格式、当日志文件发生损坏,比如:被修改,格式被破坏。可以通过redis-check-aof --fix 文件名对日志文件进行修复。不知道redis-check-aof在哪,可以通过命令whereis redis-check-aof,查找。
演示:
将日志文件备份,然后模拟误操作修改日志文件
删除日志文件,关闭redis服务,重启服务。
连接redis客户端
在redis7版本之前使用客户端连接redis服务器时,连接会被拒绝。但是redis7版本后,演示不出来了。
在配置文件中可以通过appendfsync字段来设置redis的同步频率。
AOF采用的是文件追加的方式,文件会越来越大,为了避免这种情况,新增了重写机制。
当文件大小超过设定的阈值时,Redis会启用AOF文件的内容压缩,只保留可以恢复数据的最小指令集。可以使用命令bgrewriteaof。
比如:我在redis中插入了三条数据set k1 11,set k2 22,set k3 33 在日志文件中会记录三条这样的指令。当文件大小超过阈值进行重写时,会将着三条命令压缩成一条命令set k1 11 k2 22 k3 33。
AOF日志文件持续增长超过阈值时,会fork出一个新进程来将文件重写,和RDB一样,也是先写临时文件最后再替换日志文件。
redis4.0 版本后的重写,是指把RDB的快照,以二进制的形式,附在新的AOF头部,作为已有的历史数据,替换掉原来的流水账操作。在配置中如果no-appendfsync-on-rewrite=yes,不写入AOF文件只写入缓存,用户请求不会阻塞,但是如果在这段时间内如果宕机会丢失这段时间的缓存数据。(降低数据的安全性,提高性能)。如果no-appendfsync-on-rewrite=no,还是会把数据往磁盘里刷,但是遇到重写操作,可能会发生阻塞。(数据安全,但是性能降低)
Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上一次重写后大小的一倍且文件大小大于64M时触发。
重写虽然可以节约大量磁盘空间,减少恢复时间。但是每一次重写有一定的负担,因此需要redis满足一定条件才会重写。
文件重写基准值配置:
例如:当前AOF日志文件大小文件70M,重写后大小文件50M,下一次会在100M开始重写。
redis启动或者重写完毕时,Redis会记录此时AOF日志文件的大小,设为base_size,当AOF日志文件大小大于等于base_size+base_size*auto-aof-rewrite-percentage%,并且大于等于auto-aof-rewrite-min-size时进行重写。
官方推荐两个都用,如果对数据不敏感,允许数据部分丢失,可以单独使用RDB,不建议单独使用AOF,因为可能会出现Bug,如果只是做纯内存缓存,两个都可以不用。