zoukankan      html  css  js  c++  java
  • Redis持久化机制

    Redis持久化机制:

    RDB快照
    AOF日志

    一. RDB快照

    1.概念

    RDB是把当前进程数据生成快照保存到硬盘的过程(以二进制方式写入磁盘)

    2.触发机制: 手动和自动

    【1】手动触发分别对应save和bgsave命令
    ·save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存 比较大的实例会造成长时间阻塞,线上环境不建议使用 ·bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子 进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短
    2】自动触发就是在配置文件中使用save相关配置,如“save m n”。表示m秒内数据集存在n次修改 时,自动触发bgsave

    3.优缺点

    产生的文件小,恢复速度快, 由于每次生成RDB开销较大(需要fork子进程,属于重量级操作,会导致redis卡顿若干秒),无法做到实时持久化

    4.禁用持久化

    命令 config set save ""

    二. AOF日志

    1.概念

    以独立日志的方式记录每次命令, 重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用 是解决了数据持久化的实时性

    2.开启方式

    查询aof是否开启: 
    命令 config get appendonly
    开启AOF:
    1)命令行(实时生效,但重启后失效): config set appendonly
    2)配置文件(需重启生效): appendonly yes,默认不开启

    3.触发策略

    手动触发:
    执行命令 bgrewriteaof
    
    3种自动触发:
    (1)每修改同步always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
    (2)每秒同步everysec:异步操作,每秒记录 如果一秒内宕机,有数据丢失(推荐)
    (3)不同no:从不同步

    4.AOF工作流程

    1.所有写入命令追加到aof_buf缓冲区(redis是单线程响应命令,如果每次命令都直接追加到磁盘,会影响磁盘的负载)
    2.aof缓冲区根据对应的策略向磁盘做同步操作
    3.随着aof文件越来越大,需要定期对aof文件进行重写,达到压缩目的
    4.redis重启时,可以加载aof文件进行数据恢复

    5.AOF重写机制

    原因: 
    AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多.当AOF文件的大小超过所设定的阈值时,Redis就会对AOF文件的内容压缩
    重写原理:
    Redis 会fork出一条新进程,读取内存中的数据,并重新写到一个临时文件中...最后替换旧的aof文件
    触发机制:
    当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。这里的“一倍”和“64M” 可以通过配置文件修改
    手动触发:
    直接调用bgrewriteaof命令。 自动触发:
    根据auto
    -aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机
    ·auto
    -aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认 为64MB。 ·auto-aof-rewrite-percentage:代表当前AOF文件空间 (aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值。 自动触发时机=aof_current_size > auto-aof-rewrite-minsize &&(aof_current_size-aof_base_size)/aof_base_size>=auto-aof-rewritepercentage

    三. RDB和AOF同时开启可能存在的坑

    场景: 如果redis以rdb模式运行了,然后关闭redis,配置文件配置开启aof,重启redis,此时会发现redis中没有数据

    原因: redis会优先基于aof去恢复,,即使没有.aof文件,,他会创建一个新的空的.aof文件....

    解决方案: 停止redis,关闭aof,拷贝rdb备份,重启redis,确认数据恢复, 直接在命令行热修改redis配置(redis的客户端执行命令: config set appendonly yes),打开aof, 这时redis就会将内存中的数据对应的日志,写入aof文件中, 此时aof和rdb两份数据文件的数据就同步了
  • 相关阅读:
    PL/SQL异常处理
    spool命令
    Oracle循环语句
    替换变量&和&&
    OCP-052 & 053部分答案解析
    Oracle IF & CASE语句
    PL/SQL概念
    AIX下如何根据端口号查找相应的进程
    (转)Tomcat启动报Error listenerStart错误
    Suse碎碎念
  • 原文地址:https://www.cnblogs.com/Baker-Street/p/15012188.html
Copyright © 2011-2022 走看看