Redis-AOF日志与RDB快照
AOF日志与RDB是Reids中两大持久化机制,当服务器或者Reids宕机的时候可以通过这两大机制恢复Redis的数据。
先说说AOF日志吧,在执行一条操作请求时,Redis先将命令在内存中执行,之后再将命令写到AOF日志中,与我们熟悉的MySQL的redo log日志先写日志再执行sql的顺序刚好相反。
这么做的好处主要有两点:
- 先执行命令再写入AOF日志确保命令不存在语法错误能正常的被执行;
- 不阻塞主线程;
在Redis中AOF日志有三种写回的策略:
- Always,同步写回。执行完命令立即写入AOF文件;
- Everysec,每秒写回。执行完命令后将命令写入缓冲区,每秒将缓冲区命令写入AOF文件;
- No,由操作系统写回。执行完命令后将命令写入缓冲区,由操作系统决定何时将缓冲区命令写入AOF文件;

由于持续不断的操作Redis服务,这时AOF日志文件的将持续变大,将会带来一些性能上的问题:
- 系统无法保存过大的文件;
- AOF文件过大时将会影响命令写入的效率;
- 如果发生宕机,AOF文件过大会导致数据恢复变得缓慢;
针对AOF文件过大问题Redis采用重写AOF文件的方式来避免AOF文件过大带来的性能问题。与AOF日志由主线程写入的方式不同,AOF重写由后台子线程bgrewriteaof 来完成的,这也是为了避免阻塞主线程,导致数据库性能下降。
重写的过程主要体现在两个方面:一个拷贝,两处日志。
Redis中通过auto-aof-rewrite-min-size、auto-aof-rewrite-percentage来判断是否触发重写机制,当AOF文件大小同时超出这两个参数设定的值后就会触发AOF重写。
当触发AOF重写后,主线程会fork一个子线程bgrewriteaof ,同时将复制一份主线程的页表(一个拷贝)给子线程,这样子线程就能访问到内存中的数据了,在不影响主线程的情况下逐一将数据转成命令记录重写日志。
在AOF日志重写过程中,当有新的操作命令的时候,Redis会将命令写入AOF缓冲区的同时也会写入重写AOF的缓冲区(两处日志),当重写完成后,重写缓冲区的命令会写入新的AOF文件中。此时,新的AOF文件就可以代替旧的AOF文件了。

你可能会疑惑为什么重写后的AOF文件会比较小呢?
因为旧的AOF文件记录着每一条操作命令,可能存在多条命令执行同一个数据的情况,而AOF重写是将内存中的数据转成命令存储这样一条数据就只会存在一条命令,从而达到缩小AOF文件文件大小的目的。
与AOF日志相比RDB快照的逻辑就相对简单一些。
RDB快照可以理解为Redis数据的全量备份,Redis通过两个命令来生成RDB文件:
- save:在主线程中执行,会阻塞主线程;
- bgsave:创建一个子线程去写入RDB文件,避免了主线程阻塞,Redis默认配置;
首先在Redis主线程会fork一个子线程bgsave,同时复制一份主线程页表给bgsave,这样bgsave子线程就能读到主线程的内存中的数据了将其写到RDB快照中,所以不会影响主线程的读操作。
但是,如果是一个操作请求这时Redis为了保证正常操作请求会借助系统的写时复制技术(Copy-On-Write, COW),当有操作请求时,主线程会申请一份新的内存空间存放数据同时修改自己的页表映射。
这样既保证了快照的完整性,也保证了主线程的正常操作。
在Redis4.0后提出了混合使用AOF和RDB快照的方法,先通过全量备份Redis数据的RDB快照,之后通过AOF日志文件做增量备份。
Redis-AOF日志与RDB快照的更多相关文章
- redis:aof恢复与rdb服务器间迁移
1. aof恢复与rdb服务器间迁移: 1.1. Aof恢复: 如果不小心执行了flushdb或flushall了怎么办? (1)立马执行命令:shutdown nosave 关闭服务器,为了防止其他 ...
- 04 AOF日志:宕机了,Redis如何避免数据丢失
接下来两篇将记录Redis持久化存储两大技术:AOF日志.RDB快照 本篇重点 "AOF日志实现""AOF日志三种写回策略""AOF重写--避免日志过 ...
- Redis数据持久化(RDB、AOF)
1. 简介 Redis作为内存型数据库,数据都保存在内存中,如果重启或意外宕机后,数据会全部丢失.因此,Redis提供了完善的持久化机制,将内存中的数据持久化到磁盘上,避免了完整性和安全性的问题, ...
- 图解 Redis | 不多说了,这就是 RDB 快照
大家好,我是小林. 虽说 Redis 是内存数据库. 但是它为数据的持久化提供了两个技术,分别是「 AOF 日志和 RDB 快照」. 这两种技术都会用各用一个日志文件来记录信息,但是记录的内容是不同的 ...
- redis RDB快照和AOF日志持久化配置
Redis持久化配置 Redis的持久化有2种方式 1快照 2是日志 Rdb快照的配置选项: save 900 1 // 900内,有1条写入,则产生快照 save 300 1000 ...
- redis快照持久化和aof日志持久化
持久化就是即使断电/重启需要存储的数据不会丢失,即将数据存储在设备中,一般存在硬盘内 redis的持久化有2种方式 :1-rdb快照 2-aof日志,可以通过配置redis.conf文件进行配置 r ...
- 解决---MISCONF Redis被配置为保存RDB快照,但目前无法在磁盘上存留。可能修改数据集的命令被禁用。请检查Redis日志,了解有关错误的详细信息。
解决---MISCONF Redis被配置为保存RDB快照,但目前无法在磁盘上存留.可能修改数据集的命令被禁用.请检查Redis日志,了解有关错误的详细信息. 出现bug: 在学习celery,将数据 ...
- 【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
任务描述 本次集中介绍使用Windows和Linux()搭建本地Redis服务器的步骤,从备份的RDB文件中加载数据,以及如何生成AOF文件和通过AOF文件想已经运行的Redis追加数据. 操作步骤 ...
- Redis的持久化的两种方式drbd以及aof日志方式
redis的持久化配置: 主要包括两种方式:1.快照 2 日志 来看一下redis的rdb的配置选项和它的工作原理: save 900 1 // 表示的是900s内,有1条写入,则产生快照 save ...
随机推荐
- stackoverflow & xgqfrms
stackoverflow & xgqfrms stackoverflow https://stackoverflow.com/users/5934465/xgqfrms https://st ...
- H5 常见问题汇总及解决方案
原文链接:http://mp.weixin.qq.com/s/JVUpsz9QHsNV0_7U-3HCMg H5 项目常见问题汇总及解决方案 -- 由钟平勇分享 转自 https://github.c ...
- vue中v-model的学习
v-model在表单元素input.radio.checkBox.textarea创建双向数据绑定,他会根据类型选取正确的方法来更新元素,本质不过是语法糖,负责监听用户的输入操作以更新数据并对一些极端 ...
- Django Admin 配置和定制基本功能(基本二次开发配置)
一 列表显示页面 1. list_display,列表时,定制显示的列 @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdm ...
- CentOS7安装Maven3.6.3及Git2.8.3
安装Maven3.6.3 点击进入官网 1:下载 wget https://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-m ...
- Virtual DOM 简直就是挥霍
彻底澄清"Virtual DOM 飞快"的神话. 注意:原文发表于2018-12-27,随着框架不断演进,部分内容可能已不适用. 近年来,如果你有使用过 JavaScript 框架 ...
- Spring-04 Bean的自动装配
Spring-04 Bean的自动装配 Bean的自动装配 1.自动装配说明 自动装配是使用spring满足bean依赖的一种方法. spring会在应用上下文中为某个bean寻找其依赖的bean. ...
- 后端程序员之路 23、一个c++的api framework
在"21.一个cgi的c++封装"中,我们封装了cgi,在这之上,我们可以再来封装一个webapi的framework.当然,前文的Casablanca是个不错的选择,但是它比较庞 ...
- ElasticSearch 集群的规划部署与运维
公号:码农充电站pro 主页:https://codeshellme.github.io 1,常见的集群部署方式 ES 有以下不同类型的节点: Master(eligible)节点:只有 Master ...
- iot漏洞入门
路由器漏洞入门 下载项目https://github.com/praetorian-inc/DVRF 安装quem sudo apt install qemu-user-static 安装gdb-mu ...