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 数据持久化的主要内容,如果未能解决你的问题,请参考以下文章