• 一文了解:Redis的AOF持久化


    Redis的AOF持久化

    每当Redis-Server接收到写数据时,就把命令以文本形式追加到AOF文件里,当重启Redis服务时,AOF文件里的命令会被重新执行一次,重新恢复数据。当AOF过大时将重写AOF文件。

    工作原理

    > lpush list 1 2 3 4
    (integer) 4
    127.0.0.1:6379> lrange list 0 -1
    1) "4"
    2) "3"
    3) "2"
    4) "1"
    127.0.0.1:6379> lpop list
    "4"
    127.0.0.1:6379> lrange list 0 -1
    1) "3"
    2) "2"
    3) "1"
    

    appendonly.aof文件中

    *2
    $6
    SELECT
    $1
    0
    *6
    $5
    lpush
    $4
    list
    $1
    1
    $1
    2
    $1
    3
    $1
    4
    *2
    $4
    lpop
    $4
    list
    

    可以看到上面的示例中写操作有lpush和lpop命令,在AOF文件中存在lpush和lpop。SELECT命令为AOF程序自动加上的选择数据库。

    AOF命令写入的内容为文本协议格式,如:命令lpush list 1 2 3 4 的文本形式为"*6 $5 lpushr $4r list $1 1$1 2$1 3$1 4 "。将文本内容追加到aof_buf(缓冲区)中,AOF缓冲区根据相应的策略同步写入AOF文件中,当AOF文件越来越大时,将AOF文件重写。

    AOF原理

    启动AOF持久化

    在redis.conf文件中

    appendonly no  #写成yes,打开AOF持久化
    

    AOF写入频率

    # appendfsync always    
    appendfsync everysec   # 默认
    # appendfsync no
    
    1. alaws:总是同步到AOF文件,每一个命令都写入,安全,速度慢
    2. everysec:每秒写入一次,安全性好,最多丢失1秒钟的数据
    3. no:写入AOF文件工作交给操作系统,由操作系统写入AOF文件,安全性一般

    文件

    aof文件目录通过RDB文件目录,他们共享同一个目录

    dir ./
    
    appendfilename "appendonly.aof"
    

    通过config set dir {newDir} 动态修改dir配置

    通过config set dbfilename {appendfilename} 动态修改AOF文件名称

    重写

    AOF文件过大时,Redis将fork()一个子进程对内存数据进行比那里逆化成Redis命令,序列化文本格式后写入到新的AOF文件中。然后将重写时发生的增量AOF文件追加到新的AOF文件中,最后替换旧的AOF文件。

    自动重写

    auto-aof-rewrite-percentage 100  # 比上次重写时文件增大了100%就重写AOF文件
    auto-aof-rewrite-min-size 64mb   # AOF文件至少超过为64M时重写AOF文件
    

    自动重写必须满足:当前AOF文件大小 > auto-aof-rewrite-min-size &&(当前文件AOF文件大小减去上次重写时AOF文件大小)除以 上次重写时AOF文件大小 = auto-aof-rewrite-percentage

    手动重写

    > bgrewriteaof
    Background append only file rewriting started
    

    优缺点

    优点

    1. 比RDB文件可靠,everysec模式下只丢1秒数据。
    2. AOF文件为纯文本文件。文件协议格式容易恢复成Redis命令。
    3. AOF文件太大会进行自动重写。

    缺点

    1. 同等数据下,比RDB文件大。
    2. 同步过程中Redis主进程会被阻塞,everysec是个折中方案。

    数据恢复

    Redis读取AOF文件数据还原过程

    1. 创建一个不带网络的客户端
    2. 读取AOF文件内容,还原成命令
    3. 将命令在1中的客户端执行
    4. 重复2,3的过程

    结语

    本人深知水平有限,欢迎指正本文错误之处。


    logo

  • 相关阅读:
    YAML 语法小结
    小程序之脚本语言
    小程序WXML 使用小结
    微信小程序 js逻辑
    小程序开发1
    联想Y7000安装Ubuntu16.04/Win10双系统,wifi问题,显卡驱动和CUDA10安装
    VS2015中配置Eigen
    联想Y700安装显卡驱动和CUDA8.0
    php微信生成微信公众号二维码扫描进入公众号带参数
    Y7000 (1)安装ubuntu1604遇到的问题
  • 原文地址:https://www.cnblogs.com/imeng/p/11341006.html
Copyright © 2020-2023  润新知