2017-01-01 16:42:13


该系列文章链接
NoSQL 数据库简介
Redis的安装及及一些杂项基础知识
Redis 的常用五大数据类型(key,string,hash,list,set,zset)
Redis 配置文件介绍
Redis 持久化之RDB
Redis 持久化之AOF
Redis 主从复制
Redis 事务
Redis 发布与订阅
Redis jdedis 介绍


Redis 官网介绍 持久化(RDB 与 AOF)
1.AOF: Append only file
AOF 以日志的形式记录每个写操作,将 Redis 执行过的所有写指令记录下来,不记录读操作。
只需追加文件但不可以改写文件,redis 启动之初会读取该文件重新构建数据,也就是说,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次已完成数据的恢复工作

aof 保存的文件是 appendonly.aof 文件

2.AOF 在 redis.conf 的一些配置
    2.1 appendonly
         默认情况下,Redis异步转储数据集到磁盘上。此模式在许多应用程序中都足够好,但例如如果Redis进程会由于停电的问题而导致几分钟的写入丢失(取决于配置的保存点)。
        AOF 是一种备用持久化模式,可提供更好的持久化。例如,使用默认数据 fsync 策略(请参阅配置文件中的后面部分)Redis在服务器断电等戏剧性事件中只会丢失一秒写入,如果Redis进程本身出现问题,则会丢失一次,但是操作系统仍然正常运行。
        可以同时启用AOF和RDB持久化以保证不会出现问题。
        如果在启动时启用AOF,Redis将加载AOF,即文件
        将具有更好的持久性保证。
        请查看 http://redis.io/topics/persistence 以获取更多信息。

总的来说,这个配置是 开启或关闭AOF 的总配置

2.2 appendfilename
        AOF 文件的名称(默认:"appendonly.aof")

2.3 appendfsync
         调用 fsync()将让操作系统实际写入数据到磁盘上,而不是等待输出缓冲区中的更多数据。某些操作系统会真正刷新数据到磁盘上,其他一些操作系统会尽快尝试这样做。
        Redis支持三种不同的模式:
            no:不要 fsync,只需让操作系统在需要时刷新数据。速度更快。
            always:每次有写入操作都会调用 fsync,将写入操作记录到 appendonly.aof 中。慢,最安全。
            everysec:每秒调用一次 fsync ,将写入操作记录到 appendonly.aof 中。妥协方案。

默认值为“everysec”,因为这通常是速度和数据安全之间的正确折衷。这取决于你是否可以理解不总是让操作系统在需要时刷新输出缓冲区,以获得更好的性能(但如果你能想到一些数据丢失的想法,请考虑默认的持久化模式,也就是 RDB),或相反,使用“always”,将非常慢,但比 everysec 方案更安全。
        更多详情请查看以下文章:http://antirez.com/post/redis-persistence-demystified.html

如果不确定,请使用“everysec”。
        
    2.4 no-appendfsync-on-rewrite
        当AOF fsync策略设置为always或everysec且后台保存进程(后台保存或AOF日志后台重写)正在对磁盘执行大量I/O操作时,在某些Linux配置中,Redis可能会阻塞太长时间在 fsync()调用。请注意,目前没有对此进行修复,因为即使在不同的线程中执行 fsync 也会阻塞我们的同步 write(2) 的调用。
        为了缓解这个问题,当BGSAVE或BGREWRITEAOF正在进行中时可以使用这个配置来阻止在主进程中调用fsync()。
        这意味着当另一个子进程正在保存时,Redis的 appendfsync 策略将会与“appendfsync none”相同。实际上,这意味着在最糟糕的情况下(使用默认的Linux设置)可能会丢失最多30秒的日志。
        如果您有延迟问题,请将其转为 "yes"。否则,从耐用性的角度来看,它是最“最安全”的选择使用 "no"。

2.5 auto-aof-rewrite-percentage/auto-aof-rewrite-min-size
        自动重写 appendonly.file 。
        当AOF日志大小增长到指定的百分比(即 auto-aof-rewrite-percentage的值)时,Redis能够自动重写日志文件,隐式调用 BGREWRITEAOF。
        这是它的工作原理:Redis会在最近的重写后记住AOF文件的大小(如果重启后没有重写,则使用启动时的AOF大小)。
        将此基本大小与当前大小进行比较。如果当前大小大于指定的百分比,则触发重写。此外,您需要指定要重写的AOF文件的最小大小,这有助于避免重写AOF文件,即使达到 auto-aof-rewrite-percentage 但仍然非常小。
        指定 auto-aof-rewrite-percentage = 0 以禁用自动AOF重写功能。

2.6 aof-load-truncated
        如果系统(尤其是在没有data = ordered选项的情况下挂载ext4文件系统)出现崩溃且此时 Redis 启动进程在使用 AOF 的 appendonly.aof 文件将数据加载回内存时,可能会发生 appendonly.aof 末尾出现错误(也就是末尾被截断,文件不正常终止)这种情况(但是当Redis本身崩溃或中止但操作系统仍能正常工作时,这种情况不会发生)。
        发生这种情况时,Redis可以退出,或者加载尽可能多的数据(默认值),如果发现AOF文件在末尾被截断,则启动。此选项控制此行为。
        如果将aof-load-truncated设置为yes,则会加载截断的AOF文件,并且Redis服务器会开始发出日志以通知用户该事件。
        否则,如果该选项设置为no,则服务器将中止并显示错误并拒绝启动。当该选项设置为no时,用户需要使用“redis-check-aof”实用程序修复AOF文件,然后才能重新启动服务器。
        请注意,如果发现AOF文件在中间被破坏,服务器仍将退出并显示错误。此选项仅在Redis尝试从AOF文件中读取更多数据但不会找到足够的字节时适用。

2.7 aof-use-rdb-preamble
         重写AOF文件时,Redis能够使用AOF文件中的RDB前导码来加快重写和恢复速度。启用此选项后,重写的AOF文件由两个不同的节组成:
               [RDB文件] [AOF尾]
         加载时Redis识别出AOF文件以“REDIS”字符串开头并加载前缀RDB文件,并继续加载AOF尾部。
3.AOF rewrite
    3.1 重写
        AOF 采用文件追加的方式,文件会越来越大为避免出现此种情况,新增重写机制。
        当 AOF 文件大小超过所设定的阈值时,Redis 就会启动 AOF 文件的内容压缩,只保留可以恢复数据的最小指令集。可以使用命令 bgrewriteaof

3.2 重写原理
        AOF 文件持续增长而过大时,会 fork 出一条新进程来讲文件重写(先写临时文件最后在改名,默认名字为 appendonly.aof),遍历新进程的内存中数据,每条记录有一条 set 语句,重写 aof 文件,并没有读取旧的 aof 文件
        而是将整个内存中的数据用命令的方式重写了一个新的 aof 文件,这点和快照有点类似

3.3 重写触发机制
        Redis 会记录赏赐重写时的 AOF 大小,默认配置是当 AOF 文件大小是上次 rewrite 后大小的已被且文件大小大于 64M 时触发

4. AOF 同步策略
    4.1 always:每次发生写入操作时都会被立即记录到磁盘,性能较差但数据完整性比较好

4.2 everysec:异步操作,每秒记录,如果在一秒内宕机,那么将丢失 一秒的数据

4.3 no:不同步

5.AOF 劣势
    5.1 相同数据集的数据而言 aof 文件要远大于 rdb 文件,恢复速度慢于 rdb
    5.2 aof 运行效率要慢于 rdb, everysec 同步策略效率较好,no 同步策略效率和 rdb 相同

6.关于 RDB 和 AOF 这两种持久化方式的总结
    6.1 RDB
        RDB 持久化方式能够在指定的时间间隔内对你的数据进行快照存储

6.2 AOF
        AOF 持久化方式记录每次对服务器写的操作,当服务器冲i的时候会重新执行这些命令来恢复原始的数据。AOF 命令以 redis 协议追加保存每次写的操作到文件末尾
        redis 还能对 AOF 文件进行后台重写,使得 AOF 文件体积不至于过大

6.3 不开启持久化
        当然如果 redis 只做缓存的话,那么可以不用任何持久化的方式

6.4 开启持久化
        但是如果不只做缓存,那么最好同时开启两种持久化方式
        在这种情况下,redis 重启时会优先载入 AOF 文件来恢复原始的数据,因为在通常情况下 AOF 文件保存的数据要比 RDB 文件保存的数据要完整

那么 RDB 数据不实时,而且同时使用两者时服务器重启也只会找 AOF 文件,要不要只使用 AOF 呢?(我有一个大胆的想法,你要不要听听)
        redis 开发人员建议不要,因为 RDB 更适合用于备份数据库,AOF 在不断变化不好备份
        而且快速重启后,RDB 不会有 AOF 可能潜在的bug,留着 RDB 可以作为一个以防万一的手段

6.4 开启了主从复制且开启了持久化
        因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,即只保留save 900 1这条规则。
        如果开启 AOF,好处是在最恶劣情况下也只会丢失不超过30秒数据,启动脚本较简单只加载自己的AOF文件就可以了。代价一是带来了持续的IO,二是AOF 重写的最后将重写过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF 重写的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。默认超过原大小100%大小时重写可以改到适当的数值,例如80%。
        如果不开启 AOF ,仅靠主从复制实现高可用性也可以。能省掉一大笔IO也减少了重写时带来的系统波动。代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件以便载入较新的文件。

6-Redis 的持久化之 AOF的更多相关文章

  1. Redis数据持久化机制AOF原理分析一---转

    http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...

  2. redis的持久化(RDB&AOF的区别)

    RDB 是什么? 在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里. Redis会单独创建(fork)一个子进程来进行持久化,会 ...

  3. Redis数据持久化之AOF持久化

    一.RDB持久化的缺点创建RDB文件需要将服务器所有的数据库的数据都保存起来,这是一个非常耗费资源和时间的操作,所以服务器需要隔一段时间才能创建一个新的RDB文件,就也是说创建RDB文件的操作不能执行 ...

  4. redis的持久化之AOF

    AOF Redis 分别提供了 RDB 和 AOF 两种持久化机制: RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中. AOF 则以协议文本的方式,将所有对数据库进行过写入的命令 ...

  5. Redis之持久化(RDB AOF)

    Redis 提供了 RDB 和 AOF 两种持久化方案: RDB:生成指定时间间隔内的 Redis 内存中数据快照,是一个二进制文件 dumpr.rdb AOF:记录 Redis 除了查询以外的所有写 ...

  6. redis快照持久化和aof日志持久化

    持久化就是即使断电/重启需要存储的数据不会丢失,即将数据存储在设备中,一般存在硬盘内 redis的持久化有2种方式 :1-rdb快照  2-aof日志,可以通过配置redis.conf文件进行配置 r ...

  7. 详解Redis RDB持久化、AOF持久化

    1.持久化 1.1 持久化简介 持久化(Persistence),持久化是将程序数据在持久状态和瞬时状态间转换的机制,即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘). 1.2 red ...

  8. 《面试官之你说我听》:简明的图解Redis RDB持久化、AOF持久化

    欢迎关注文章这一系列,一起学习 <提升能力,涨薪可待篇> <面试知识,工作可待篇> <实战演练,拒绝996篇> 如果此文对你有帮助.喜欢的话,那就点个赞呗,点个关注 ...

  9. NoSql数据库Redis系列(4)——Redis数据持久化(AOF)

    上一篇文章我们介绍了Redis的RDB持久化,RDB 持久化存在一个缺点是一定时间内做一次备份,如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失).对于数据完整性要求很严 ...

  10. (八)Redis之持久化之AOF方式

    一.概念 AOF方式:将以日志,记录每一个操作 优势:安全性相对RDB方式高很多: 劣势:效率相对RDB方式低很多: 二.案例 appendonly no默认关闭aof方式 我们修改成yes 就开启 ...

随机推荐

  1. es5中的for in 与es6中的for of的用法与区别

    for in 用与循环遍历对象中的属性键值 for of用于循环遍历出数组中的属性值 for in 也可以遍历数组,但是局限是他会把数组的其他属性键值也会遍历出,例如给数组添加一个属性arr.name ...

  2. Hadoop 集群安装(主节点安装)

    1.下载安装包及测试文档 切换目录到/tmp view plain copy cd /tmp 下载Hadoop安装包 view plain copy wget http://192.168.1.100 ...

  3. The algorithm learning of sort which include Bubblesort,Insertsort,Quicksort and Mergesort.

    Notice : these algorithms achieved by Java. So,let's going to it. firstly, what is Bubblesort? why w ...

  4. [Swift]LeetCode684. 冗余连接 | Redundant Connection

    In this problem, a tree is an undirected graph that is connected and has no cycles. The given input ...

  5. HTTP/3 简介

    前言 HTTP 2.0是由谷歌SPDY进化而来,现有的实现基本都是走SSL(说是可以不用SSL,但基本没这么干的),传输层使用TCP.HTTP 3.0是由谷歌QUIC进化出来的,QUIC没有大动HTT ...

  6. BBS论坛(十)

    10.1.客户端权限验证功能完成 (1)cms/cms_profile 显示当前用户的角色和权限 <tr> <td>角色:</td> <td> {% f ...

  7. 【转】kali配置--修改IP和DNS

    修改IP地址 1 编辑文件 nano /etc/network/interfaces 2 在选择静态IP或DHCP,编辑文件内容并保存退出 (1)静态IP: ``` #Loop回环地址 auto lo ...

  8. Elasticsearch之删除索引

    1. #删除指定索引    # curl -XDELETE -u elastic:changeme http://localhost:9200/acc-apply-2018.08.09    {&qu ...

  9. .NET Core中的性能测试工具BenchmarkDotnet

    背景介绍 之前一篇博客中,我们讲解.NET Core中的CSV解析库,在文章的最后,作者使用了性能基准测试工具BenchmarkDotNet测试了2个不同CSV解析库的性能,本篇我们来详细介绍一下Be ...

  10. asp.net core 系列 1 概述

    一.   概述 ASP.NET Core 是一个跨平台的高性能开源框架,可以用来:建置 Web 应用程序和服务.IoT应用和移动后端.在 Windows macOS 和 Linux 上使用喜爱的开发工 ...