• 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

     

  • 相关阅读:
    mongoDB BI 分析利器
    如何定位 Node.js 的内存泄漏
    如何对MySQL数据库中的数据进行实时同步
    [有奖活动进行中]阿里数据库专家曾文旌为你解决数据库那些事
    如何实现Docker应用的自定义弹性伸缩
    vue methods 中方法的相互调用
    vue 实现部分路由组件缓存
    SSH框架之一详解maven搭建多模块项目
    GitHub Pages 搭建流程-基于jekyll-bootstrap
    ExtJs 4 中的MVC应用架构
  • 原文地址:https://www.cnblogs.com/yhq-qhh/p/9935765.html
Copyright © 2020-2023  润新知