Redis持久化-RDB

Redis持久化-RDB

Redis的持久化分为RDB持久化和AOF持久化,本篇文章主要说RDB持久化相关的东西。

RDB持久化就是把当前redis数据库中的数据保存到硬盘的过程。

触发时机

RDB持久化的触发方式有两种,第一种是手动触发,另外一种是自动触发。

手动触发

手动触发RBD主要使用savebgsave命令。其实bgsave是对save命令阻塞问题的优化,因此你应该总是使用bgsave命令。

save

save命令会阻塞当前主进程,直到RDB持久化过程执行完毕,对于内存比较大的实例会造成非常长时间的阻塞,因此线上环境不要使用。

bgsave

bgsave命令执行时,redis主进程会fork出子进程,具体的RDB的过程是由子进程来完成的,在持久化期间,主进程依然响应来自应用程序的命令。阻塞仅仅会发生在fork出子进程的阶段。

自动触发

redis配置文件中使用了save配置

如果在redis配置文件中使用了save m n (表示m秒内进行了n次数据修改)配置,满足情况的时候会触发bgsave

redis集群中从节点执行全量复制操作

从节点执行全量复制操作的时候,主节点会自动触发bgsave命令生存rdb文件并发送给从节点

执行debug reload加载redis

在执行debug reload(这个时候redis实例的run id不会发生变化)重新加载redis的时候,也会自动触发bgsave

默认情况下执行shutdown命令

默认情况下执行shutdown命令,如果没有开启AOF持久化功能,就会自动执行bgsave。

bgsave触发RBD的执行过程

( TODO 后续补充流程图)

  • 主进程执行bgsave命令,首先会检查当前是否存在正在运行的子进程,如果存在的话,bgsave命令就会直接退出。
  • 上述条件满足的情况下,主进程会fork出子进程,在fork操作期间,主进程会短暂的阻塞,可以使用info stats命令的latest_fork_usec选项查看最近一次fork操作所耗费的时间,单位是微秒
  • 父进程fork完成以后,会继续响应来自其他应用程序员的命令(但是save,bgsave,bgrewriteaof这三个命令特殊一些,会有不同的响应方式)
  • 子进程创建RDB文件,由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数 据是fork时刻整个数据库的一个快照。.
  • 当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,并发送信号通知父进程RDB持久化过程完成
  • 父进程收到通知,更新相关的持久化信息

RDB持久化的优缺点

优点

  • 非常适合备份,全量复制等场景
  • redis加载RBD恢复数据会比使用AOF方式恢复的快

缺点

  • 没办法做到实时/准实时的持久化
  • 因为RDB文件是一个压缩过的二进制文件,在redis的版本演进过程中,存在多个格式的RDB格式,因此存在老版本的redis不能完全兼容新版RDB格式的情况

原文链接:https://wenchao.ren/archives/165

 

posted @ 2017-04-04 11:19  写代码吧  阅读(644)  评论(0编辑  收藏  举报