长久化

长久化(Persistence),即把内存中的数据保留到磁盘中。

长久化的实现形式

快照式

在某个时刻把所有数据进行残缺备份。

例:MySQL 的 Dump 形式、Redis 的 RDB 形式。

日志式

把用户执行的所有写指令(增删改)备份到文件中,还原数据时只须要把备份的所有指令从新执行一遍即可。

例:MySQL 的 Binlog、Redis 的 AOF、Hbase 的 HLog。

RDB简介

默认状况下, Redis 将数据库快照保留在名为 dump.rdb 的二进制文件中。

当 Redis 须要保留 dump.rdb 文件时, 服务器执行以下操作:

  1. Redis 调用 forks 派生一个子过程。父过程和子过程同时存在。
  2. 子过程将以后内存中的数据库快照写入到一个长期 RDB 文件中。
  3. 当子过程实现对新 RDB 文件的写入后,Redis 用新 RDB 文件替换原来的 RDB 文件。

当 Redis 须要复原数据时, Redis 程序能够通过载入 RDB 文件来还原数据库的状态。

RDB 的触发机制

save命令

save 命令是一个同步操作命令,会占用 Redis 的主过程。若 Redis 数据十分多时,save 命令执行速度会十分慢,导致阻塞所有客户端的申请。

生产环境不倡议应用 save 命令,能够应用 bgsave 命令代替。

127.0.0.1:6379> saveOK

bgsave命令

bgsave 命令是一个异步操作命令,Redis 应用 Linux 零碎的 fock() 生成一个子过程来将数据保留到磁盘,主过程能够持续为客户端提供服务。

如果操作胜利,能够通过客户端命令LASTSAVE来查看操作后果。

127.0.0.1:6379> bgsave

主动生成RDB

通过配置 Redis 的配置文件,能够设置“ 在N 秒内数据集至多有 M 个改变”这一条件被满足时,主动进行数据集保留操作。

例如,以下设置会让 Redis 在满足“60 秒内至多有 1000 个键被改变”这一条件时,主动进行数据集保留操作:

save 60 1000

savebgsave 比照

命令savebgsave
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产生谬误时是否进行写入,通常为yesstop-writes-on-bgsave-error yes# rdb文件是否应用压缩格局rdbcompression yes# 是否对rdb文件进行校验和测验,通常为yesrdbchecksum yes

RDB的长处

  1. RDB是一个十分紧凑的文件,它保留了某个工夫点的数据集快照,实用于数据集的定时备份。
  2. RDB是一个繁多文件,能够很不便传送到另一个数据节点,实用于劫难复原。
  3. RDB在保留RDB文件时父过程只须要 fork 一个子过程,接下来的工作全副由子过程实现,父过程不须要再做其余IO操作,所以RDB长久化形式能够最大化redis的性能。
  4. 通常状况下,在复原大数据集的时候,RDB形式会比AOF更快一些。

RDB的毛病

  1. 耗时、耗性能。如果设置的备份频率较高,RDB 须要常常 fork 子过程来进行备份操作,当数据集比拟大并且服务器性能较差时,fork 可能会比拟耗时,从而导致 Redis 在肯定工夫内(毫秒级-秒级)不能响应客户端的申请。
  2. 不可控、失落数据。通常RDB以配置形式进行定时备份,如果 redis 意外宕机(例如电源中断),可能会失落上一次备份到宕机前这段时间的数据。