redis 数据持久化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis 数据持久化相关的知识,希望对你有一定的参考价值。

Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。
RDB持久化
RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。
手动触发数据持久化

手动触发分别对应save和bgsave:

  • save指令:阻塞当前redis服务器,直到RDB过程完成为止(线上不建议使用,阻塞时间过长)。
  • bgsave指令:redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动退出(阻塞只发生在fork截断)。当手动执行bgsave指令时,Redis父进程会判断当前是否存在正在执行的子进程,如RDB/AOF子进程,如果存在bgsave命令直接返回。若没有,则会fork出子进程,fork操作过程中父进程会阻塞,通过info stat命令可以查看latest_fork_userc选项,可以获得最近一个fork操作的耗时,单位为微秒。父进程fork完成后,bgsave命令返回”Background saving started”信息并不再阻塞父进程,可以继续响应其他命令。子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的时间,对应info统计的rdb_last_save_time选项。进程发送信号给父进程表示完成,父进程更新统计信息。

示例如下:

127.0.0.1:6379> save
OK
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379> 
# 持久化的数据存放目录及文件名取决于配置文件中以下几个配置:
dbfilename dump.rdb    # 定义数据持久化的文件名
dir /usr/local/redis/data    # 定义数据持久化的文件存放目录
[root@redis data]# ll /usr/local/redis/data   # 以下就是dump.rdb文件存放目录
总用量 28
-rw-r--r-- 1 root root   725 3月   9 14:15 dump.rdb

在每次redis启动时,都会去指定目录下寻找dump.rdb文件并读取它,把其中的数据读取到redis中,这是它可以做到数据持久化的根本原因。
自动触发数据持久化

四种自动触发的情况:

  • 在配置文件中定义在m秒内数据发生多少次改变,自动触发bgsave。
  • 如果从节点执行全量复制操作,主节点自动执行bgsave,形成RDB的文件发送到其他节点。
  • 执行debug reload命令重新加载redis时,也会自动触发save操作。
  • 执行shutdown时,如果AOF持久化没有开启,则自动执行bgsave。

配置文件中与RDB相关的配置如下:

#以下三行是数据持久化的策略,若要停止数据持久化,只需将其都注释掉即可。
# 以下同步策略可以自行根据线上情况更改
save 900 1   # 每900秒(15分钟)如果有1个key发生变化,则保存
save 300 10    # 每300秒(5分钟)如果有10个key发生变化,则保存
save 60 10000   # 每60秒(1分钟)如果有10000个key发生变化,则保存
dbfilename dump.rdb    # 保存的文件名
dir /usr/local/redis/data    # 文件的存放路径

下面的默认值为yes,当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这可以让我们意识到数据没有正确持久化到磁盘上,否则我们不会注意到灾难的发生了。如果redis重启了,那么有可以重新开始接受数据了。

stop-writes-on-bgsave-error yes  
# 该值为yes的话,在redis持久化数据到磁盘时如果出现失败,redis会停止接受所有的写请求。

下面的选项默认值为yes,表示对于存储到磁盘中的快照数据,是否进行压缩存储。

rdbcompression yes

下面的选项默认值为yes,表示在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样会增加大约10%的性能消耗,如果希望可以获取到最大的性能提升,可以关闭该功能。

rdbchecksum yes

AOF数据持久化
相关参数如下:

appendonly no   # 默认关闭aof持久化方式,将其设置为yes可以开启aof持久化

默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入appendonly.aof文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。

appendfilename "appendonly.aof"   # aof文件名
# appendfsync always
appendfsync everysec
# appendfsync no

上面三行是aof方式的持久化策略:

  • always:表示每次写入都执行fsync,以保证数据同步到磁盘,但会影响性能,线上不建议采用
  • everysec:表示每秒执行依次fsync操作,也就是说一旦宕机最多丢失1秒的数据,如果对数据不是那么敏感,建议采用这种方式。
  • no:表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快。但线上不建议采用,因为最长的同步周期可能有30s。
auto-aof-rewrite-percentage 100

aof自动重写配置,当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候,Redis能够调用bgrewriteaof对日志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。

auto-aof-rewrite-min-size 64mb

设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写,默认这个值为64M,生产中根据实际情况,可能会指定为几个G。

以上是关于redis 数据持久化的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出 Redis 持久化机制

持久片段和查看器

redis 复制,持久化,事务

回栈事务后如何持久化分片数据?

redis常见面试题

面试之Redis