本文首发于我的个人网站:http://riun.xyz/
本文介绍了redis的数据持久化方案,即数据如何在重启服务后仍能获取到。
以下基于redis-6.2.1版本,系统为centos7 64位
官方文档:http://www.redis.cn/documentation.html
0、what
redis持久化是指将存在内存中的数据持久化到本地文件系统中。为什么需要这样做?当redis服务端关闭时,数据不能丢失(不要问为什么不能丢失),下次启动redis时要恢复上次内存中的数据。这就需要将内存中数据持久化到硬盘里。
持久化有几个主要的点:
1、如何持久化?即以何种方式将内存数据存入硬盘中。
2、多长时间进行一次持久化?进行一次持久化就将内存数据往硬盘里写一次,那多久这样持久化一次呢?太频繁了一定会对主服务造成影响;间隔时间太长又有可能漏掉数据(下次持久化还没进行时redis服务停掉了,那么上次持久化到停掉服务这段时间内存中“写”的数据就无法正常更新到硬盘)。
redis目前有两种持久化方案:RDB、AOF。
1、Redis持久化之RDB
RDB:Redis DataBase
如何做:在指定时间间隔内将内存中的数据快照写入磁盘;恢复时将快照文件直接读到内存中。
备份如何执行:redis单独创建(fork)一个子进程进行持久化。先将内存中的全部数据(redis服务中的数据)写入一个临时文件(在本地硬盘上)中;等写完后,再用这个临时文件替换上次持久化时保存好的文件。在大规模数据恢复,对数据恢复完整性不敏感的场景下,RDB更加高效适用。其缺点是最后一次持久化后的数据可能丢失。
由于是将内存->硬盘这样数据写入,所以写入过程中不接受任何IO操作,即redis服务不再提供任何其他服务。这就确保了极高的性能。
fork是复制一个和当前进程一样的进程,新进程作为原进程的子进程,且所有数据与原进程一致。
生成的持久化文件名称默认为:dump.rdb,默认保存在redis启动时所在目录下(就是在哪启动,文件就保存在哪个路径)。
2、Redis持久化之AOF
默认是关闭的
AOF:Append Only File
以日志形式增量记录每个写操作(读操作不记录;只追加文件,不会修改记录过的日志)。redis启动时就读取该文件重新构建数据(根据日志文件将写指令从前到后执行一遍完成数据恢复工作)。
持久化过程:
1、客户端的请求写命令会被追加到AOF缓冲区
2、AOF缓冲区根据AOF持久化策略,将操作sync同步到磁盘的AOF文件
3、AOF文件大小超过重写策略或手动重写时,会对AOF文件重写rewrite,压缩AOF文件容量。
4、Redis服务重启时,会重新加载AOF文件中的写操作,完成数据恢复。
AOF持久化策略:
- always(每次redis写命令执行都会立刻记入日志、性能较差数据完整性较好)
- everysec(每秒记入日志一次,宕机时本秒的数据可能丢失)
- no(不主动同步,把同步时机交给操作系统???什么意思)
AOF默认不开启,在redis.conf配置文件中默认配置为:
-
appendonly no
-
appendfilename “appendonly.aof”
-
appendfsync everysec
保存路径和RDB保存路径一致。
AOF和RDB同时开启,redis默认取AOF的数据(因为数据不会存在丢失)。
AOF和RDB备份机制和性能不同,但备份恢复操作一样,都是拷贝备份文件,需要恢复数据时拷贝到Redis工作目录下,启动时加载备份文件。