> 文章列表 > Redis AOF

Redis AOF

Redis AOF

一、Redis AOF

1.简介

目前,redis的持久化主要应用AOF(Append Only File)RDB两大机制。AOF以日志的形式来记录每个写操作(增量保存),redis执行过的所有写指令全部记录下来(读操作不记录)。只许追加文件,但不可以改写文件。redis启动之初会读取该文件,进行重新构建数据。

2.AOF的配置

  • AOF默认不开启,conf配置文件中进行配置。
  • 修改redis.conf配置文件
appendonly no
//修改
appendonly yes
  • 默认文件名是appendonly.aof
  • 默认是启动后的相对路径,redis在哪里启动,appendonly.aof文件就在哪生成

3.AOF日志是如何实现

  • 数据库写前日志(Write Ahead Log ,WAL),在实际写数据库前,先把修改的数据记录到日志文件中,以便发生故障时,时行恢复。
  • AOF日志是写后日志。redis先去执行命令,把数据写入内存中,然后才去记录日志。

  • 查看AOF文件
    • set k1 v1
    • vi appendonly.aof
*3 //接下来的指令由3部分组成
$3 //指令有3个字节
set
$2 //指令有2个字节
k1
$2 //指令有2个字节
v1
  • 为什么使用写后日志?
    • 1.redis为了避免检查开销,向AOF中记录日志,是不做检查的。如果写前执行,很有可能将错误指令记录到日志中,在使用redis恢复日志时,就可能会出现错误
    • 2.不会阻塞当前的写操作

4.AOF潜在风险

  • 1.aof文件可能由于异常原因被损坏。可以使用redis自带的命令redis-check-aof --fix appendonly.aof文件,修复成功,可以正确启动
  • 2.由于刚刚执行一个指令,还没有写入日志,就宕机了。就会导致数据永久丢失(redis做为数据库存储的情况)
  • 3.AOF避免了对当前指令的阻塞,但可能会由于磁盘写入压力较大,对下一个操作带来阻塞风险

5. AOF三种写回策略

  • 打开redis.conf配置文件 appendfsync选项
  • always:同步写回:每个写指令执行完,立即同步将指令写入磁盘日志文件中
  • everysec:每秒写回:默认配置方式。每个写指令执行完,先把日志写到AOF文件的内存缓冲区。每隔一秒把缓冲区的内容写入磁盘
  • no:操作系统控制写回:每个写指令执行完,先把日志写到AOF文件的内存缓冲区,由操作系统决定何时把缓冲区的内容写入磁盘

6.AOF重写机制

6.1 简介

  • Redis根据数据库现有数据,创建一个新的AOF文件,读取数据库中所有键值对,重新对应一条命令写入。
  • 可以使用命令bgrewriteaof

6.2 AOF重写的相关配置

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
  • 如果aof文件超过64m,且比上次重写后的大小增加了100%,自动触发重写。
  • 例如 文件80m,开如重写,重写后降到50m,下一次,达到100m再开始重写

6.3 AOF重写流程

  • bgrewirteaof触发重写,判断是否当前有重写在运行,如果有,则等待重写结束后再执行
  • 主进程fork出一个子进程,执行重写操作,保证主进程不阻塞,可以继续执行命令
  • 子进程循环遍历reids内存中的所有数据到临时文件,客户端的写请求同时写入aof缓冲区和aof重写缓冲区。保证原AOF文件完整以及新的AOF文件生成期间的新的数据修改操作不会丢失
  • 子进程写完新AOF文件以后,向主进程发送信号,主进程更新统计信息
  • 主进程把aof重写缓冲区中的数据写入到新的AOF文件
  • 用新AOF文件覆盖掉旧的AOF文件,完成AOF重写

 

 

英语口语