共计 2042 个字符,预计需要花费 6 分钟才能阅读完成。
明天咱们来聊一聊 Redis 长久化的形式 RDB。
咱们晓得 Redis 绝对于传统的缓存技术最大的特点之一就是反对数据的长久化。Redis 会定期对内存数据快照写入磁盘,当内存数据失落(如服务重启、宕机导致)时,能够加载磁盘中的数据疾速复原到内存。
RDB 即 Redis Database,其长久化形式是将内存数据以二进制的形式存储到磁盘上,防止服务器意外宕机时依然能够从磁盘找回数据。存储的文件默认为 dump.rdb。
RDB 长久化操作过程
- Redis fork 一个子过程
- 子过程领有主过程的内存数据正本,子过程将内存正本数据写入长期的 rdb 文件中
- 子过程写入实现后,用新的 rdb 文件替换掉原有的 rdb 文件,同时删除旧的文件
其实子过程被 fork 进去后,会同时拷贝一份主过程的内存援用,而非残缺的内存正本集。这就利用了操作的零碎的写时复制性能,只有在父过程的内存产生批改时才会实在的复制一份内存给子过程应用,而且复制是以页为单位进行的。这样就大大减少了内存的应用空间,晋升了效率。
整个长久化过程中只有 fork 过程会发送阻塞,子过程 rdb 文件的存储过程是异步的。
RDB 是如何触发的
Redis 提供命令来手动触发 rdb 操作:save 和 bgsave。两者的区别是 save 是同步操作,执行过程中会阻塞 Redis 对外服务。尤其在大数据量的 save 时,会导致服务较长时间的服务中断。而 bgsave 则是 fork 一个子过程来异步解决长久化,长久化的过程齐全不影响 Redis 服务,生产上也是罕用。
Redis 提供了参数来配置 RDB 的主动触发,定义 m 秒内 n 次键值产生改变。例如
save 900 1
save 300 10
save 60 10000
60 秒内呈现 10000 次键值变更
300 秒内呈现 10 次键值扭转
900 秒内 1 次键值扭转
示意当满足上述三种状况的任一种时,都将触发一次 bgsave 操作。
另外有一点补充阐明一下,在执行 save 或 bgsave 操作时,如果发现零碎有正在执行的 save 操作,而且未超过 2 秒
主动存储的实现细节
redisServer 保护了主动触发的配置信息,同时保护了一个 dirty 计数器和上次执行完 save 的工夫。
struct redisServer {
// 主动保留的配置信息
struct saveparam *saveparams;
long dirty;// 批改计数器
time_t lastsave;// 上一次执行 save 的工夫
// ...
};
struct saveparam {
time_t seconds;// 秒数
int changes;// 批改次数
};
- dirty 计数器 redis 每执行一次写入操作时,dirty 值 +1,
- lastsave 记录最近一次胜利执行完 save/bgsave 操作的工夫(Unix 工夫戳)
serverCron 是 redis 中的周期执行函数,默认 100ms 执行一次(可通过 redis.config 批改执行频率),其中一个查看就是查看是否满足了 RDB 主动执行条件。对于单个 save m n 来说,只有当同时满足以下两个条件时,才会触发一次长久化
now - lastsave > m
dirty >= n
这里的 n 次变更是指服务端的变更,而不是执行客户端申请的写入命令操作数。即,当执行一条 sadd myset a b c, dirty 的值会减少 3。
RDB 相干的配置
- save m n m 秒内产生 n 次变更则执行一次 bgsave。呈现 save 配置后,redis 会启用 rdb 长久化
- dir /usr/local/redis-5.0.7/data 快照文件门路
- dbfilename dump.rdb 快照文件名,默认为 dump.rdb。生产环境个别会退出端口信息, 命名为:dupm.6379.rdb
- stop-writes-on-bgsave-error yes 当 bgsave 执行出现异常时,是否进行接管客户端的写入申请。
- rdbcompression yes 启用 rdb 文件压缩。启用压缩后会节俭磁盘空间,但减少 CPU 的耗费资源
- rdbchecksum yes 启用 rdb 文件一致性校验
应用 RDB 复原数据
- 获取快照文件目录。能够应用 config get dir 获取快照目录
- 进行 redis 服务。执行 shudown 命令
- 将快照文件 dump.rdb 拷贝到 config get dir 输入的目录下
- 重新启动 redis 服务
值得阐明的一点是当应用 rdb 文件启动加载内存数据时,会造成服务的阻塞,直到齐全加载实现能力对外提供服务。因而在服务启动时罕用 aof 形式来复原内存数据。
RDB 长久化形式的优劣
- rdb 文件保留的十分紧凑的二进制文件,占用的磁盘空间小,内存复原速度快
- 便于数据快照的备份,能够依据须要定时备份 rdb 文件即可
毛病
- RDB 长久化是有肯定频率的,而且不适宜高频率长久化,这样当意外停机时,可能呈现较长时间段内的数据失落
- 长久化时尽管子过程能够异步进行,但每次都是全量数据的 IO 刷盘,造成 IO 负载减轻,当数据量很大时可能呈现 IO 瓶颈
- fork 过程也会造成阻塞,而且 fork 的工夫和内存的大小无关,过大的内存 fork 时导致较长时间的阻塞