长久化
长久化(Persistence),即把内存中的数据保留到磁盘中。
长久化的实现形式
快照式
在某个时刻把所有数据进行残缺备份。
例:MySQL 的 Dump 形式、Redis 的 RDB 形式。
日志式
把用户执行的所有写指令(增删改)备份到文件中,还原数据时只须要把备份的所有指令从新执行一遍即可。
例:MySQL 的 Binlog、Redis 的 AOF、Hbase 的 HLog。
RDB 简介
默认状况下,Redis 将数据库快照保留在名为 dump.rdb
的二进制文件中。
当 Redis 须要保留 dump.rdb
文件时,服务器执行以下操作:
- Redis 调用 forks 派生一个子过程。父过程和子过程同时存在。
- 子过程将以后内存中的数据库快照写入到一个长期 RDB 文件中。
- 当子过程实现对新 RDB 文件的写入后,Redis 用新 RDB 文件替换原来的 RDB 文件。
当 Redis 须要复原数据时,Redis 程序能够通过载入 RDB 文件来还原数据库的状态。
RDB 的触发机制
save 命令
save
命令是一个同步操作命令,会占用 Redis 的主过程。若 Redis 数据十分多时,save
命令执行速度会十分慢,导致阻塞所有客户端的申请。
生产环境不倡议应用 save
命令,能够应用 bgsave
命令代替。
127.0.0.1:6379> save
OK
bgsave 命令
bgsave
命令是一个异步操作命令,Redis 应用 Linux 零碎的 fock()
生成一个子过程来将数据保留到磁盘,主过程能够持续为客户端提供服务。
如果操作胜利,能够通过客户端命令 LASTSAVE 来查看操作后果。
127.0.0.1:6379> bgsave
主动生成 RDB
通过配置 Redis 的配置文件,能够设置“在 N 秒内数据集至多有 M 个改变”这一条件被满足时,主动进行数据集保留操作。
例如,以下设置会让 Redis 在满足“60 秒内至多有 1000 个键被改变”这一条件时,主动进行数据集保留操作:
save 60 1000
save
与 bgsave
比照
命令 | save | bgsave |
---|---|---|
IO 类型 | 同步 | 异步 |
阻塞 | 是 | 是(阻塞产生在 fock,十分快) |
复杂度 | O(n) | O(n) |
长处 | 不耗费额定的内存 | 不阻塞客户端命令 |
毛病 | 阻塞客户端命令 | fock 子过程须要耗费大量内存 |
RDB 罕用长久化配置
# RDB 主动长久化规定
# 当 900 秒内有至多有 1 个键被改变时,主动进行数据集保留操作
save 900 1
# 当 300 秒内有至多有 10 个键被改变时,主动进行数据集保留操作
save 300 10
# 当 60 秒内有至多有 10000 个键被改变时,主动进行数据集保留操作
save 60 10000
# RDB 长久化文件名
dbfilename dump-<port>.rdb
# 数据长久化文件存储目录
dir /var/lib/redis
# bgsave 产生谬误时是否进行写入,通常为 yes
stop-writes-on-bgsave-error yes
# rdb 文件是否应用压缩格局
rdbcompression yes
# 是否对 rdb 文件进行校验和测验,通常为 yes
rdbchecksum yes
RDB 的长处
- RDB 是一个十分紧凑的文件,它保留了某个工夫点的数据集快照,实用于数据集的定时备份。
- RDB 是一个繁多文件,能够很不便传送到另一个数据节点,实用于劫难复原。
- RDB 在保留 RDB 文件时父过程只须要 fork 一个子过程,接下来的工作全副由子过程实现,父过程不须要再做其余 IO 操作,所以 RDB 长久化形式能够最大化 redis 的性能。
- 通常状况下,在复原大数据集的时候,RDB 形式会比 AOF 更快一些。
RDB 的毛病
- 耗时、耗性能。如果设置的备份频率较高,RDB 须要常常 fork 子过程来进行备份操作,当数据集比拟大并且服务器性能较差时,fork 可能会比拟耗时,从而导致 Redis 在肯定工夫内(毫秒级 - 秒级)不能响应客户端的申请。
- 不可控、失落数据。通常 RDB 以配置形式进行定时备份,如果 redis 意外宕机(例如电源中断),可能会失落上一次备份到宕机前这段时间的数据。