RDB和AOF的优缺点

RDB的优点

RDB快照保存了某个时间点的数据,可以通过脚本执行redis指令bgsave(非阻塞,后台执行)或者save(会阻塞写操作,前台执行,不推荐)命令自定义时间点备份,可以保留多个备份,当出现问题可以恢复到不同时间点的版本,很适合备份,并且文件格式也支持有不少第三方工具可以进行后续的数据分析。比如:

可以在24小时内,每小时备份一次RDB文件,并且在每个月的第一天,也备份一个RDB文件。这样的话即使遇上问题,也可以随时将数据集还原到不同的版本。

RDB可以最大化Redis性能,父进程在保存RDB文件时唯一要做的就是fork出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无需执行任何磁盘I/O操作。

RDB在大量数据,比如几个G的数据,恢复的速度比AOF的快

RDB的缺点

不能实时保存数据,可能会丢失自上一次执行RDB备份到当前的内存数据

虽然Redis允许设置不同的保存点来控制保存RDB文件的频率,但是因为RDB文件需要保存整个数据集的状态,所以他并不是一个轻松的操作。因此可能会至少5分钟才保存一次RDB文件。在这种情况下,服务器一旦宕机,就会丢失好几分钟的数据。

当数据量非常大的时候,从父进程fork子进程进行保存值RDB文件需要一点时间,可能是毫秒或秒,取决于磁盘I/O性能

在数据量比较庞大是,fork可能会非常耗时,造成服务器在一定时间内停止处理客户端过来的请求,如果数据集非常巨大,并且CPU时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒或更久。虽然AOF重写也需要fork,但无论AOF重写的执行间隔有多长,数据的持久性都不会有任何损失

AOF的优点

数据安全性相对较高,根据所使用的fsync策略(fsync是同步内存中redis所有已经修改的文件到存储设备),默认是appendfsync everysec,即每秒执行一次,在这种配置下,Redis仍然可以保持良好的性能,并且就算发生故障停机,也最多只会损失一秒钟的数据(fsync会在后台线程执行,所以主线程可以继续努力地处理命令请求)

由于该机制对日志文件的写入操作采用的追加模式,以你在写入过程中不需要seek,即使出现宕机现象,也不会破坏日志文件中已经存在的内容,然而如果本次操作只是写了一半数据就出现了系统崩溃问题,不用担心,在redis下一次启动之前,可以通过redis-check-aof工具来解决数据一致性的问题

redis可以在AOF文件体积变得过大时,自动地在后台对AOF进行重写,重写后的新AOF文件包含了恢复当前数据集所需的最小命令集合,整个重写操作是绝对安全的,因为redis在创建新AOF文件的过程中,追加模式不断的将修改数据追加到现有的AOF文件里面,即使重写过程中发生停机,现有的AOF文件也不会丢失。而一旦新AOF文件创建完毕,redis就会从旧AOF文件切换到新AOF文件,并开始对新AOF文件产生追加操作

AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,也可以通过该文件完成数据的重建

AOF文件有序保存了对数据库执行的所有写入操作,这些写入操作以redis协议的格式保存,因此AOF文件的内容非常容易被人读懂,对文件进行分析也很轻松。导出AOF文件也非常简单,比如,不小心执行了flushall命令,但只要AOF文件未被重写,那么只要停止服务器,移除AOF文件末尾的flushall命令,并重启redis,就可以将数据集恢复到flushall执行之前的状态

AOF的缺点

即使有些操作是重复的也会全部记录,AOF的文件大小要大于RDB格式的文件

AOF在恢复大数据集时的速度比RDB的恢复速度要慢

根据fsync策略不同,AOF速度可能会慢于RDB

bug出现的可能性更多

猜你喜欢

转载自blog.csdn.net/u014578909/article/details/109282861
今日推荐