redis持久化(rdb/aof)

一、rdbredis database):在指定的时间间隔内将内存中的数据集快照写入到本地磁盘,也就是行话讲的snapshot快照,它恢复时是将快照文件直接读到内存中。

1、备份:内存到磁盘。恢复:快照文件从磁盘读回到内存。

2redis会单独创建(fork)一个子进程来进行持久化,先将数据写入到一个临时文件(dump.rdb)中,待持久化过程都结束了,在用这个临时文件替换上次持久化好的文件。新的替换旧的,在整个过程当中,主进程不进行任何io操作,这就确保了极高的性能。如果需要进行大规模的数据恢复,且对于数据的精度要求不高,那rdb方法比aof更加高效。rdb的缺点是最后一次持久化后的数据可能丢失。

3、fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并且作为原进程的子进程。

4、如何触发rdb快照:

(1):配置文件中默认的快照配置,冷拷贝后重新使用,可以cp dump.rdb dump_new.rdb

(2):命令save或者bgsave save:只管保存,其他不管,全部阻塞 bgsave:redis在后台异步进行快照操作,快照同时还可以响应客户端的请求。可以通过lastsave命令获取最后一次成功执行快照的时间

(3):Flushall也会产生dump.rdb文件,但里面是空的,无意义。

4、数据如何恢复:将备份文件移动到redis的安装目录并启动服务即可。

5、优势:

(1):适合大规模的数据恢复。

(2):对数据的一致性和完整性要求不高。

6、劣势:

(1):在一定间隔时间内做一次备份,所以redis意外down掉的话,就会丢失最后一次快照后的所有修改。

(2)fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑。

二:aof(append only file):以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来(读操作不记录),只有追加文件但不可以修改文件,redis启动之初会读取该文件重新构建数据,换言之,redis启动的话就是根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作(其实更狠的是redis的主从复制,读写分离)。

1、appendonly.aof文件损坏,则不能启动redis修复appendonly.aof文件,redis-check-aof --fix appendonly.aof。

2、appendonly.aof文件和dump.rdb可以同时存在,这种情况下,redis首先会去加载appendonly.aof文件。

3、Aof的配置策略:

Always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好。

Everysec:出厂默认推荐,异步操作,每秒记录,如果一秒内宕机,则有数据丢失。

No

4、aofrewrite重写:aof采用文件追加的形式,文件会越来越大为了避免出现这种情况,新增了重写机制,当aof文件的大小超过所设定的阈值时,redis就会启动aof文件的内容压缩。

重写原理:aof文件会持续增加而过大时,会fork出一条新的进程来将文件重写(也就是先写临时文件最后在rename),遍历新进程的内存中的数据,每条记录有一条的set语句。重写aof文件的操作,并没有去读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这一点和快照有点类似。

触发重写机制:redis会记录上次重写时的aof的文件的大小,默认配置是当aof文件大小是上次rewrite后大小的一倍并且文件大于64m时触发。

conf文件中的配置:auto-aof-rewrite-percentage 设置重写的百分比

Auto-aof-rewrite-min-size 64mb 设置重写的基准值

No-appendfsync-on-rewrite:重写时是否可以运用appendfsync,使用默认no即可,保证数据的安全性。

5、优势:

(1)、同步持久化,每发生数据变更时会被立即记录到磁盘中,性能较差但数据性比较狠。

(2)、异步操作,每秒记录 如果一秒内宕机,有数据丢失。

(3)、不同步。

6、劣势:
1)、相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢与rdb。

(1)aof运行效率慢于rdb,每秒同步策略较好,不同步效率和rdb相同。

8、只做缓存:如果只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。

9、同时开启:redis重启的时候会首先加载aof文件,因为通常情况下aof文件保存的数据集要比rdb保存的数据集完整。也不要只使用aof,因为rdb更适合于备份数据库(aof在不断的变化不好备份)。

10、性能建议:

(1)、因为rdb只用作后备用途,建议只在slave上持久化rdb文件,而且只要15分钟备份一次即可。

(2)如果Enable Aof,好处是在最恶劣的情况下只会丢失不会超过1秒的数据,启动脚本较简单只load自己的aof文件就可以了。代价一是带来了持续的io,二是aof rewrite的最后将rewrite过程中产生的数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该减少重写的频率,比如aof重写默认的基础值太小了,可以设置到5G以上。

(3)、如果不Enable Aof,仅依靠Master-Slave Replication实现高可用也可以。能省掉一大笔的io操作。代价是如果Master-Slave同时倒掉,会丢失十几分钟的数据,启动脚本也需要比较两个Master-Slave中的rdb文件,加载比较新的那一个。

猜你喜欢

转载自blog.csdn.net/aubrey_cr7/article/details/80754477