zoukankan      html  css  js  c++  java
  • Redis持久化之AOF

    AOF持久化 : 每当有修改数据库的命令执行时,服务器就会将执行的命令写入到AOF文件末尾,但这并不意味着AOF文件持久化不会丢失任务数据,当一条命令真正被写入硬盘里,这条命令才不会因为down机而丢失,丢失命令的数量取决于命令被写入硬盘的时间

    开启AOF持久化会清空redis内部数据

    在目前常见的操作系统中,执行系统调用write函数,将一些内容写入到某个文件中时,为了提高效率,系统通常不会直接将内容写入到硬盘里,而是先将内容放入一个内存缓冲区(buffer)里面,等到缓冲区被填满,或者用户执行fsync调用和fdatasync调用时才将存储在缓冲区里的内容真正写入硬盘里。

    appendfsync

    为了控制redis服务器在遇到意外down机时丢失数据量,redis为AOF持久化提供了appendfsync选项

    •    always : 服务器每写入一个命令,就调用一次fdatasync,将缓冲区里面的命令写入到硬盘中,在这种模式下,服务器即时down机,也不会丢失任何已经成功执行的命令数据

    •    everysec : 服务器每一秒重调一次fdatasync,将缓冲区里面的命令写入到硬盘里,在这种模式下,服务器即时down机,最多只丢失一秒内执行的命令数据,默认值 : everysec

    •    no  :  服务器不主动调用fdatasync,由操作系统决定,在这种模式下,服务器down机时丢失命令数据不确定

       

    命令

    always

    everysec

    no

    优点

    不丢失数据

    每秒一次fsync,丢失一秒数据

     

    缺点

    IO开销较大,一般的SATA盘只有几百TPS

    丢一秒数据

    不可控


    appendonly yes
    #是否开启AOF持久化 默认关闭 appendfilename "appendonly.aof" #AOF持久化文件名 appendfsync everysec #触发条件 no-appendfsync-on-rewrite yes #正在导出rdb快照的过程中,是否停止同步aof 默认no
    dir /bigdiskpath #文件保存路径
    auto-aof-rewrite-percentage 100          #aof文件大小比起上次重写时的大小,增长100%时,重写
    auto-aof-rewrite-min-size 64mb           #aof文件,至少64M时,重写

    /*
    auto-aof-rewrite-percentage 指定触发重写所需的AOF文件体积百分比,当AOF文件的体积大于 auto-aof-rewrite-min-size指定的体积时,
    并且超过上一次重写之后的AOF文件的 percentage %时,就会重新触发AOF重写(如果服务器刚刚启动不久,还没有进行AOF重写,
    那么使用服务器启动时载入的AOF文件的体积作为基准值),将这个值设置为0表示关闭自动AOF重写

    当AOF文件大于64MB之后才考虑进行AOF重写
    */
    127.0.0.1:6379> set yhq 123
    OK
    127.0.0.1:6379> set qhh 123
    OK
    127.0.0.1:6379> exit
    [root@localhost redis-5.0.2]# cat /lamp/redis-5.0.2/appendonly.aof 
    *2
    $6
    SELECT
    $1
    0
    *3
    $3
    set
    $3
    yhq
    $3
    123
    *3
    $3
    set
    $3
    qhh
    $3
    123

    AOF文件重写(压缩)  :   bgrewriteaof

    AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条set语句。重写AOF文件的操作,并没有读取旧的AOF文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的AOF文件,这点和快照有点类似。

    1.减少硬盘占用量

    2.加快恢复速度

    auto-aof-rewrite-percentage 100            #aof文件大小比起上次重写时的大小,增长100%时,重写

    auto-aof-rewrite-min-size 64mb            #aof文件,至少64M时,重写

    127.0.0.1:6379> bgrewriteaof
    Background append only file rewriting started
    -rw-r--r--. 1 root root 790 Dec 15 19:43 appendonly.aof
    [root@localhost redis-5.0.2]# ll appendonly.aof 
    -rw-r--r--. 1 root root 116 Dec 15 19:44 appendonly.aof

    触发机制

       1.客户端向服务端发送bgrewriteaof命令

       2.通过配置项   auto-aof-rewrite-min-size  设置触发aof重写的最小体积(避免对体积过小的AOF文件重写)

       3.通过配置项   auto-aof-rewrite-percentage 设置增长率

    AOF追加阻塞

    AOF阻塞定位

    1.redis日志

    Asynchronous AOF fsync is tasking too long(disk is busy?).  #异步AOF fsync任务太长(磁盘忙吗?).
    Writing the AOF buffer without waiting got fsync to complete. #在不等待的情况下写入AOF缓冲区使fsync完成。
    this may slow downRedis                                                         #这可能会减慢redis的速度

    2.info persistence

    aof_delayed_fsync : 100

    3.top

     

  • 相关阅读:
    迷你图标集大集合:5000+ 30套免费的图标(不得不下,设计必备)
    Github简介
    Sublime Text 3 文本编辑器
    FusionCharts V3图表导出图片和PDF属性说明(转)
    FusionCharts参数的详细说明和功能特性(转)
    SQL 数据结构操作语句
    SQL Server 2008 各种DateTime的取值范围
    Datagrid数据导出到excel文件的三种方法
    开发环境
    如何利用ThoughtWorks.QRCode 生成二维码
  • 原文地址:https://www.cnblogs.com/yhq-qhh/p/9935765.html
Copyright © 2011-2022 走看看