Redis的持久化——AOF
上一篇博文给大家介绍了redis持久化的方式之一RDB,其中说到过RDB的缺陷是可能会导致数据丢失严重,所以redis的作者
由于强迫症又开发出了AOF来你补这一不足。好接下来我将为大家介绍AOF。
一、AOF是什么?
AOF全称Append Only File,以redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,
redis启动之初会读取该文件重新构造数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完
成数据的恢复工作。
二、AOF保存的是appendonly.aof文件。
三、配置位置
1、appendonly no
是否使用AOF方式持久化数据(可以和RDB一起使用),AOF优先级更高。
2、appendfilename “appendonly.aof”
AOF持久化方式存储日志的文件名。
3、appendfsync everysec
AOF持久化策略,有三种取值:
- always:同步持久化,每次发生数据变更会被立即记录到磁盘,性能较差但数据完整性比较好;
- everysec:默认值,每秒同步记录,但如果一秒内宕机,有数据丢失;
- no:不同步。
4、no-appendfsync-on-rewrite no
重写时是否可以运行appendfsync,默认为no,保证数据安全性。
5、auto-aof-rewrite-min-size 100
当AOF文件大小是上次rewrite后大小的 x% 倍时再次重写,默认x为100,即AOF文件大小是上次rewrite后大小的一倍
时再次重写。
6、auto-aof-rewrite-percentage 64
第一次重写AOF文件时的文件大小,默认为64M。
四、AOF启动、修复、恢复
1、正常恢复:
- 启动:设置appendonly yes
- 将有数据的aof文件复制一份保存到对应目录(config get dir)
- 恢复:重启redis然后重新加载
2、异常恢复:
- 启动:设置appendonly yes
- 备份被写坏的AOF文件
- 修复:redis-check-aof --fix 进行修复,同理redis-check-dump --fix可以修复dump.rdb文件;
- 恢复:重启redis然后重新加载
五、AOF的rewrite(重写)
1、AOF的重写是什么?
AOF采用文件追加的方式,文件会越来越大。为避免出现文件无限大内容冗余的情况,新增了重写机制,当AOF文
件的大小超过所设定的阈值时,redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令
bgrewriteaof 。
2、重写原理
AOF文件持续增长而过大时,会fork出一条新进程来讲文件重写(也是先写临时文件在rename),遍历新进程的内
存数据,每条记录有一条set语句。注意,重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内
容用命令的方式重写了一个aof文件,这点和快照有点类似。
3、触发机制
Redis会记录上次重写时AOF文件的大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。
六、优势
1、每修改同步:appendfsync always,同步持久化,每次发生数据变更会被立即记录到磁盘,性能较差但数据完整性比较好。
2、每秒同步:appendfsync everysec,异步操作,每秒记录,如果一秒内宕机,有数据丢失。
3、不同步:appendfsync no,从不同步。
七、劣势
1、相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb;
2、AOF运行效率要慢于rdb,每秒同步效率较好,不同步效率和rdb相同。
八、总结
1、RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储;
2、AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以
redis协议追加保存每次写的操作到文件末尾;
3、redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大;
4、只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式;
5、同时开启两种持久化方式
- 在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始数据,因为在通常情况下AOF文件保存的数据集要
比RDB文件保存的数据集要完整;
- RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件恢复数据。那要不要只使用AOF呢?作者建议不要,
因为RDB更适合用于备份数据库(AOF在不断变化不好备份),快速重启,而且不会有AOF可能潜在的bug,留着作
为一个万一的手段。
6、性能建议
- 因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留
save 900 1这条规则;
- 如果Enable AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以
了。代价一是带来了持续的IO,二是AOF重写的最后将重写过程中产生的新数据写入新文件造成的堵塞几乎是不可避免
的。只要硬盘许可,应该尽量减少AOF重写的频率,AOF重写的基础大小默认值64M 太小了,可以设到5G以上。默认
超过原大小100%大小时重写可以改到适当的数值。
- 如果不Enable AOF,仅靠Master-Slave复制实现高可用性也可以。能省掉一大笔IO也减少了重写时带来的系统波动。代
价是如果Master和Slave同时挂掉,会丢失十几分钟的数据。启动脚本也要比较Master和Slave中的RDB文件,载入较新
的那个。新浪微博就选用了这种架构。
Redis的持久化——AOF的更多相关文章
- Redis学习六:Redis的持久化-AOF
AOF(Append Only File) 一.是什么 以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文 ...
- redis 数据持久化 aof方式
redis持久化-Append-only file(缩写aof)的方式 本质:把用户执行的每个 ”写“ 指令(增加.修改.删除)都备份到文件中,还原数据的时候就是执行具体写指令. 打开redis的运 ...
- Redis的持久化的两种方式drbd以及aof日志方式
redis的持久化配置: 主要包括两种方式:1.快照 2 日志 来看一下redis的rdb的配置选项和它的工作原理: save 900 1 // 表示的是900s内,有1条写入,则产生快照 save ...
- Redis数据持久化之AOF持久化
一.RDB持久化的缺点创建RDB文件需要将服务器所有的数据库的数据都保存起来,这是一个非常耗费资源和时间的操作,所以服务器需要隔一段时间才能创建一个新的RDB文件,就也是说创建RDB文件的操作不能执行 ...
- redis的持久化 rdb和aof
1.rdb(Redis DataBase) 当满足条件时,redis单独会fork(创建)一个新的线程,会先将内存中的数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次已经持久化 ...
- redis持久化AOF与RDB
RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原 ...
- redis的持久化之AOF
AOF Redis 分别提供了 RDB 和 AOF 两种持久化机制: RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中. AOF 则以协议文本的方式,将所有对数据库进行过写入的命令 ...
- redis的持久化方式RDB和AOF的区别
1.前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能, ...
- Redis之持久化(RDB AOF)
Redis 提供了 RDB 和 AOF 两种持久化方案: RDB:生成指定时间间隔内的 Redis 内存中数据快照,是一个二进制文件 dumpr.rdb AOF:记录 Redis 除了查询以外的所有写 ...
随机推荐
- PHP 根据两点的经纬度计算距离
/** * @name 根据经纬度确定两点的距离[地理位置] * @author tbj * @param float $lat 纬度值 * @param float $lng 经度值 * @date ...
- ZOJ 3466 The Hive II (插头DP,变形)
题意:有一个n*8的蜂房(6边形的格子),其中部分是障碍格子,其他是有蜂蜜的格子,每次必须走1个圈取走其中的蜂蜜,在每个格子只走1次,且所有蜂蜜必须取走,有多少种取法? 思路: 以前涉及的只是n*m的 ...
- 洛谷 P1464 Function
题目描述 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回值1. 如果a>20 or b>20 or c>20就返回w(20,2 ...
- X11/extensions/XShm.h: No such file or directory
CentOS 编译一些开源项目提示:X11/extensions/XShm.h: No such file or directory. 运行命令:yum install libXext-devel就可 ...
- poj1338 Ugly Numbers 打表, 递推
题意:一个数的质因子能是2, 3, 5, 那么这个数是丑数. 思路: 打表或者递推. 打表: 若该数为丑数,那么一定能被2 或者3, 或者5 整除, 除完之后则为1. #include <ios ...
- MINST手写数字识别(一)—— 全连接网络
这是一个简单快速入门教程——用Keras搭建神经网络实现手写数字识别,它大部分基于Keras的源代码示例 minst_mlp.py. 1.安装依赖库 首先,你需要安装最近版本的Python,再加上一些 ...
- 第2节 azkaban调度:1、azkaban的调度任务使用
2.4 Azkaban实战 Azkaba内置的任务类型支持command.java Command类型单一job示例 创建job描述文件 创建文本文件,更改名称为mycommand.job 注意后缀. ...
- 带你进入Angular js的大门
首先需要指出什么是angular js,其实说白了angular js就是Javascript的一个类库,我们使用这个类库可以很容易的创建web页面.双向绑定是angular js其中的一个重要特征, ...
- Broadcast BCM94322 用ubuntu修改ID
1.按这个教程的6楼做的http://bbs.pcbeta.com/viewthread-1324168-1-1.html.注意我先下载 的是ubuntu9.05版本,做U盘启动进live 模式,43 ...
- Vuex 实际使用中的一点心得 —— 一刷新就没了
问题 在开发中,有一些全局数据,比如用户数据,系统数据等.这些数据很多组件中都会使用,我们当然可以每次使用的时候都去请求,但是出于程序员的"洁癖"."抠"等等优 ...