当前位置:首页 > 问答 > 正文

Redis那持久化存储到底咋回事,怎么保证数据不丢失的那些技术讲解

Redis那持久化存储到底咋回事,怎么保证数据不丢失的那些技术讲解

关于Redis如何把内存里的数据存到硬盘上防止丢失,这事儿主要靠两个看家本领,一个叫RDB,一个叫AOF,这俩方法思路完全不同,可以单独用,但通常是一起配合着用,这样最稳妥,下面我根据Redis官方文档(《Redis Persistence》)里的说明,给你掰开揉碎了讲清楚。

Redis那持久化存储到底咋回事,怎么保证数据不丢失的那些技术讲解

第一个本事:RDB(快照) 你可以把RDB理解成“拍照片”,就是隔一段时间,Redis就给当前内存里所有的数据拍一张完整的“照片”,然后把这个二进制格式的照片存成一个文件,名字类似dump.rdb,这个文件就是某个时间点上你全部数据的备份。 那什么时候会触发拍照呢?主要有三种情况:

  1. 你手动发命令让它拍,比如执行SAVE或者BGSAVE命令。SAVE会立刻拍,但这期间Redis不能干别的活,会卡住;BGSAVE是后台拍,Redis会fork出一个“小分身”去拍照,主进程还能继续服务,这是最常用的方式。
  2. 按照你配置文件里设的规则自动拍,比如你在配置文件里写上“save 900 1”,意思就是如果900秒内至少有1个键被改了,那就自动触发一次后台拍照,你可以配好几条不同时间间隔的规则。
  3. 特殊情况,比如Redis要关闭的时候,如果没开AOF,它也会自动拍一张照片留个底。 RDB最大的好处是恢复数据特别快,因为直接把整个文件读进内存就行,这个压缩过的二进制文件也很适合做灾难备份,但它的毛病也很明显:因为是隔一段时间拍一次,所以一旦服务器出故障,从上一次拍照到故障之间这段时间里新写的数据就全丢了,就像你一天只拍一张照片,那这一天里发生的事,除了照片里的那一瞬间,其他都记不下来。

第二个本事:AOF(写日志) AOF的思路和RDB完全不一样,它不拍照片,而是“记流水账”,每当Redis执行一个会改变数据的命令(比如set、del),它就会把这个命令原原本本地追加到一个日志文件的末尾,这个日志文件就是AOF文件,这样,你所有的操作历史都被记录下来了。 等到需要恢复数据的时候,Redis就重新把AOF文件里的命令从头到尾、一条一条地再执行一遍,这样内存就能恢复到和之前一样的状态。 如果每个命令都立刻写到硬盘,那速度就太慢了,所以Redis实际提供了几种策略让你选(在配置文件中用appendfsync设置):

Redis那持久化存储到底咋回事,怎么保证数据不丢失的那些技术讲解

  • always:每执行一个写命令,就立刻同步写到硬盘,这样最安全,但速度也最慢。
  • everysec:每秒把累积的命令批量同步一次到硬盘,这是默认的推荐选项,就算出问题,最多丢一秒的数据,在安全和速度之间取得了平衡。
  • no:让操作系统自己决定什么时候把缓存里的数据刷到硬盘,这样性能最好,但丢数据的风险也最大。 AOF还有个问题:日志文件会越来越大,比如你反复修改同一个键100万次,AOF文件里就会记录100万条命令,但其实可能最后只有一条是有效的,所以Redis提供了“AOF重写”机制,这个机制不是看旧的AOF文件,而是直接根据当前内存里的数据,逆向生成一套能重建当前数据的最精简的命令序列,然后生成一个新的、更小的AOF文件来替换旧的,这个过程也是在后台由“小分身”完成的,不会阻塞主进程。

现在通常怎么用?混合持久化 光用RDB,怕丢数据多;光用AOF,恢复速度又慢点,而且历史文件大,所以Redis 4.0以后,出了一个更厉害的组合拳,叫混合持久化(在配置文件中将aof-use-rdb-preamble设置为yes)。 它的工作方式是:当触发AOF重写时,Redis不再是生成纯命令的AOF文件,而是先把当前内存的数据用RDB的格式拍个快照,写在新文件的开头,然后再把重写过程中收到的新写命令,用AOF的格式追加在后面,这样生成的新文件,一部分是RDB格式的二进制数据,后面尾巴是AOF格式的命令。 当Redis重启恢复数据时,它先快速加载RDB部分的数据,然后再重放后面那一小段AOF命令,这样一来,恢复速度很快(因为大部分数据是RDB格式直接加载的),同时又能保证只丢失很少的数据(因为AOF部分记录了最新的操作),这相当于结合了RDB的快速恢复和AOF的近乎实时的数据安全,是目前最推荐的方式。

总结一下怎么保证数据不丢

  1. 理解取舍:没有百分之百不丢数据的方案,需要在性能和数据安全之间做选择,你要根据业务对数据丢失的容忍度来配置策略。
  2. 推荐配置:对于大多数要求数据安全的场景,建议同时开启RDB和AOF(混合持久化),用RDB做定期的完整备份,便于灾难恢复和快速重启;用AOF(策略设为每秒同步)来确保即使出问题,最多也只丢一秒的数据。
  3. 多重保障:光靠Redis本身还不够,你应该把生成的RDB文件和AOF文件,定期拷贝到别的服务器上做备份(异地备份),这样即使整个Redis服务器硬盘坏了,你还有备份可以恢复。

Redis就是靠着RDB这个“拍照片的”和AOF这个“记流水账的”,再加上后来“混合持久化”这个聪明的二合一办法,再结合管理员自己的定期外部备份,来尽可能地保证数据不丢失,具体怎么配置,就得看你愿意用多少性能来换取多少程度的数据安全性了。

备用