Redis-AOF重写,AOF后台重写实现原理

why

AOF(append only file)对Redis进行持久化是通过保存被执行的写命令来记录数据库状态的,随着服务器运行,AOF文件内容越来越多,载入AOF文件的时间会越来越长,影响Redis服务。
所以有必要对’冗余‘的AOF文件进行优化,即AOF文件重写。
那为什么要进行AOF后台重写?因为Redis单线程特性,AOF重写操作会引入大量写操作,引起stop the world,所以fork出子进程执行AOF后台重写,这样父进程可以继续处理命令请求。

AOF重写原理

怎么重写?是对旧的AOF文件进行读取、分析后进行优化吗?Redis没有采用,Redis是通过读取服务器当前数据库状态实现该功能的。
举个例子:
对一个animals键执行以下命令:

SADD animals "Cat"
SADD animals "Dog" "Tiger"
SREM animals "Tiger"

为了保存上述状态,AOF需要进行3次命令保存。
AOF重写后只需要读取animals键的所有值,再用SADD animals “Cat” "Dog"一条命令即可。
从3条减少为1条,减少了文件体积。

AOF后台重写原理(BGREWRITEAOF命令)

使用子进程(而不是开启一个线程)进行AOF重写虽然可以避免使用锁的情况下,保证数据安全性,但是会带来子进程和父进程一致性问题。
例如在开始重写之后父进程又接收了新的键值对此时子进程是无法知晓的,当子进程重写完成后的数据库和父进程的数据库状态是不一致的。

见下表:

时间服务器进程(父进程)子进程
T1执行命令 SET K1 V1
T2执行命令 SET K1 V1
T3执行命令 SET K1 V1
T4创建子进程,执行AOF文件重写开始AOF重写
T5执行命令 SET K2 V2执行重写
T6执行命令 SET K3 V3执行重写
T7执行命令 SET K4 V4完成AOF重写

在T7时刻服务器进程有了4个键,而子进程只有1个键,即所谓的漏追加。

为了解决这种不一致性,redis设置了一个AOF重写缓冲区。

在这里插入图片描述

在子进程执行AOF重写期间。服务器进程需要执行以下3个动作:

  1. 执行客户端命令
  2. 执行后追加到AOF缓冲区
  3. 执行后追加到AOF重写缓冲区

执行完上述3个操作后可以保证:

  • AOF缓冲区内容会定期被写入和同步到AOF文件,对现有AOF文件处理正常进行
  • 子进程开始,服务器执行的所有写命令都会进入AOF重写缓冲区

子进程完成AOF重写后,它向父进程发送一个信号,父进程收到信号后会调用一个信号处理函数,该函数把AOF重写缓冲区的命令追加到新AOF文件中然后替换掉现有AOF文件。父进程处理完毕后可以继续接受客户端命令调用,可以看出在AOF后台重写过程中只有这个信号处理函数会阻塞服务器进程。
下表是完整的AOF后台重写过程:

时间服务器进程(父进程)子进程
T1执行命令 SET K1 V1
T2执行命令 SET K1 V1
T3执行命令 SET K1 V1
T4创建子进程,执行AOF文件重写开始AOF重写
T5执行命令 SET K2 V2执行重写
T6执行命令 SET K3 V3执行重写
T7执行命令 SET K4 V4完成AOF重写,向父进程发送信号
T8接收到信号,将T5 T6 T7 服务器的写命令追加到新的AOF文件末尾
T9用新的AOF替换旧的AOF

T8 T9执行的任务会阻塞服务器处理命令。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
redis安装 1: 下载redis-5.0.4.tar.gz 2: 解压源码并进入目录 tar zxvf redis-5.0.4.tar.gz cd redis-5.0.4 3: 不用configure 4: 直接make (如果是32位机器 make 32bit) 查看linux机器是32位还是64位的方法:file /bin/ls 注:易碰到的问题,时间错误. 原因: 源码是官方configure过的,但官方configure时,生成的文件有时间戳信息, Make只能发生在configure之后, 如果你的虚拟机的时间不对,比如说是2012年 解决: date -s ' yyyy-mm-dd hh:mm:ss ' 重写时间 再 clock -w 写入cmos 5: 可选步骤: make test 测试编译情况 (可能出现: need tcl >8.4这种情况, yum -y install tcl ) 6: 安装到指定的目录,比如 /usr/local/redis make PREFIX=/usr/local/redis install 注: PREFIX要大写 7: 复制配置文件 cp redis.conf /usr/local/redis 注path为解压后的安装包路径 /root/gsj/redis-3.0.6 8: 让redis后台进程的形式运行 vim /usr/local/redis/redis.conf 编辑redis.conf配置文件,修改如下内容; daemonize yes 9: make install之后,cd /usr/local/redis/bin得到如下几个文件 redis-benchmark 性能测试工具 redis-check-aof 日志文件检测工(比如断电造成日志损坏,可以检测并修复) redis-check-dump 快照文件检测工具,效果类上 redis-cli 客户端 redis-server 服务端 10: 启动与连接 启动redis并指定配置文件 cd /usr/local/redis ./bin/redis-server ./redis.conf #设置随机启动 vim /etc/rc.local 最后添加: /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf 连接: 用redis-cli cd /usr/local/redis/bin/ ./redis-cli #进入 exit /quit #退出 关闭redis pkill redis-server #关闭 ./redis-cli shutdown #关闭 查看是否启动成功 ps -ef | grep redis #查看端口是否占用 netstat -tunpl | grep 6379 11: 测试 String(字符串)类型: set name lijie #设置键name的值为lijie get name #获取name的值。
YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值