Redis的AOF持久化

前言:redis还提供了AOF持久化功能。于RDB持久化不同,AOF持久化是通过保存redis服务器所执行的写命令来记录数据库状态的。服务器在启动时,通过载入和执行AOF文件中保存的命令,来还原服务器关闭之前的数据库状态。

1、AOF持久化的实现

    AOF持久化的实现可以分为命令追加(append)、文件写入、文件同步(sync)三个步骤。

1.1、命令追加    

    当AOF功能出于打开的状态,服务器执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾。

struct redisServer{    

    sds aof_buf; // AOF缓冲区,SDS底层实现

}

    举个例子, 如果客户端向服务器发送以下命令:SET KEY VALUE

    那么服务器在执行这个 SET 命令之后, 会将以下协议内容追加到 aof_buf 缓冲区的末尾:*3\r\n$3\r\nSET\r\n$3\r\nKEY\r\n$5\r\nVALUE\r\n

1.2、AOF文件的写入同步

    Redis 的服务器进程就是一个事件循环(loop), 这个循环中的文件事件负责接收客户端的命令请求, 以及向客户端发送命令回复, 而时间事件则负责执行像 serverCron 函数这样需要定时运行的函数。

    因为服务器在处理文件事件时可能会执行写命令, 使得一些内容被追加到 aof_buf 缓冲区里面, 所以在服务器每次结束一个事件循环之前, 它都会调用 flushAppendOnlyFile 函数, 考虑是否需要将 aof_buf 缓冲区中的内容写入和保存到 AOF 文件里面, 这个过程可以用以下伪代码表示:

    flushAppendOnlyFile 函数的行为由服务器配置的 appendfsync 选项的值来决定(默认everysec)。

    

    注意,文件的写入和和同步是有区别的。

   

1.3、AOF持久化的效率和安全性

    always安全性最好,但是效率最低。

   everysec效率也足够快,并且就算出现故障停机,数据库也只丢失一秒钟的命令数据。

    no模式下的AOF写入速度总是最快的,但是同步AOF文件的市场也是最长的。

    


2、AOF文件的载入与数据还原

        


     其中,第一步是创建一个伪客户端。因为redis的命令只能在客户端上下文中执行,而载入AOF文件时所使用的命令全部都是来源于AOF文件而不是网络连接,所以服务器创建了一个没有网络连接的伪客户端来执行AOF文件总的写命令。


3、AOF重写

    由于AOF持久化是通过保存写命令来记录数据库状态的,所以随着服务器运行时间的流逝,AOF文件的内容会越来越多 。文件体积会越来越大。如果不加以控制,文件的体积越来愈大,对redis服务器甚至整个宿主计算机造成影响。另外,体积过大的AOF文件,数据恢复的时间也越来越多。

    因此,redis提供了AOF重写功能。AOF文件重写并不需要对现有AOF文件进行任何读取、分析或者写入操作,这个功能是通过读取服务器当前的数据库状态来实现的

3.1、AOF后台重写

    AOF重写会有大量的写入操作,会长期阻塞。因为redis是单线程来处理请求命令,所以在AOF重写期间,服务器将无法处理客户端发来的命令请求。

    所以redis决定将AOF重写放在子进程里面。放在子进程而不是子线程,主要是由于使用子进程,可以在避免使用锁的情况下,保证数据的安全性。

3.2、重写缓冲区

        子进程在重写阶段,服务器的主进程还要继续处理命令操作,而新的操作如果对现有数据库进行修改,会导致重写后的AOF文件和数据库状态不一致。

        因此,redis服务器创建了一个AOF重写缓冲区。这个缓冲区在服务器创建子进程之后开始使用,当redis服务器操作完一个写命令后,用时将这个写命令发送给AOF缓冲区和AOF重写缓冲区

3.3、何时触发AOF重写

       重写配置在配置文件中对应的是

        auto-aof-rewrite-percentage 100

        auto-aof-rewrite-min-size 64mb

        前者是指超过上一次aof重写aof文件大小的百分之多少,会再次优化,如果没有重写过,则以启动时为主。

        后者是限制了允许重写的最小aof文件大小。最少AOF文件多大才开始重写。





    

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342