• 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

  • 相关阅读:
    lnmp下如何建立svn版本库
    解决更新本地svn版本库,提示:工作副本已锁定 问题
    请不要在意
    ecshop在lbi库文件中添加广告位的方法(转载,试过了确实可以添加成功)
    Jquery AjaxUpload实现文件上传
    js提交表单错误:document.form.submit() is not a function
    kindeditor的使用方法
    phpcmsv9整合ucenter经验分享
    替换字符串sql语句
    初生牛犊之spring(二)
  • 原文地址:https://www.cnblogs.com/guxiong/p/6664533.html
Copyright © 2020-2023  润新知