zoukankan      html  css  js  c++  java
  • Redis持久化-aof

    1.RDB现存问题

      耗时耗性能

        O(n)数据:耗时

        fork():消耗内存,copy-on-write策略

        Disk I/O: I/O性能

      不可控丢失数据

    时间 save
    T1

    执行多个写命令

    T2 满足RDB自动创建的条件
    T3 再次执行多个写命令
    T4 宕机

    T3和T4之间的数据丢失

    2.AOF原理

      Redis将所有写入命令及其参数记录到AOF文件,当服务器宕机过后启用,重新执行AOF文件中的命令

      Redis将写命令记录到AOF的过程

        Redis-server ————Redis命令及参数——————》AOF程序————将命令转换为网络通讯协议的格式追加到AOF缓存——————》AOF缓存—————将命令写入AOF文件的末尾—————》AOF————满足设定的AOF保存条件————》调用fsync或fdatasync函数将文件真正保存到磁盘

    3.文件的写入和保存

      WIRTE:根据条件,将aof_buf中的缓存写入到AOF文件末尾

      SAVE:根据条件,调用fsync或fdatasync函数将AOF文件保存到磁盘中

    4.AOF保存策略

      AOF_FSYNC_NO 跟随系统

        该策略下,Redis被关闭、AOF功能被关闭、系统的写缓存被刷新三种情况执行SAVE

      AOF_FSYNC_EVERYSEC 每一秒保存一次

        该策略下,原则上每隔一秒钟就会执行一次,但实际情况中并非如此

        执行SAVE的四种情况

        子线程正在执行

          这个SAVE执行时间未超过2秒,程序执行WRITE,程序直接返回,不执行WRITE或新的SAVE,发生故障,用户损失小于2秒内的数据

          SAVE执行超过2秒,程序执行WRITE,不执行新SAVE,WRITE必须等待执行旧SAVE执行完才能执行,这里有阻塞,发生故障,会损失超过2秒的数据

          上次成功执行SAVE距现在不超过1秒,程序执行WRITE,但不执行SAVE

          上次成功执行SAVE距离现在超过1秒,程序执行WRITE和SAVE

          

      AOF_FSYNC_ALWAS 每执行一个命令保存一次

       这种策略下,没执行一条命令都有主进程执行WRITE和SAVE操作,SAVE执行期间,主进程会被阻塞,不能处理请求。

    5.三种保存策略的对比

    模式 WITE是否阻塞? SAVE是否阻塞? 停机时丢失的数据
    AOF_FSYNC_NO  操作系统最后一次对AOF文件触发SAVE操作之后的数据
    AOF_FSYNC_EVERYSEC  一般情况下不超过2秒的数据
    AOF_FSYNC_ALWAS  最多只丢失一条命令
  • 相关阅读:
    邮件系列3 --- 安全传输
    配置postfix支持虚拟域和虚拟用户
    Postfix+Sasl+Courier-authlib+Dovecot+MySQL+extmail 邮件系统部署
    在switch中的case语句中声明变量编译出错的解决方案
    关于自控力
    PUTTY使用Ctrl+s僵死的问题
    sqlite3里类似top的用法
    二维数组、行指针、指针数组、二级指针
    sqlite3_exec函数的使用
    基于s5pv210嵌入式linux使用其他动态、静态库文件程序的交叉编译
  • 原文地址:https://www.cnblogs.com/xiangdongsheng/p/13550537.html
Copyright © 2011-2022 走看看