Redis AOF 持久化方式

除了 RDB 持久化之外许昨,Redis 還提供了 AOF(Append Only File)持久化功能。與 RDB 持久化通過保存數(shù)據(jù)庫(kù)中鍵值對(duì)來保存數(shù)據(jù)庫(kù)的狀態(tài)不同,AOF 持久化是通過保存 Redis 服務(wù)器所執(zhí)行的寫命令來記錄數(shù)據(jù)庫(kù)的狀態(tài)

AOF 持久化的實(shí)現(xiàn)

AOF 持久化功能的實(shí)現(xiàn)可以分為:命令追加(append),文件寫入(write),文件同步(sync)三個(gè)步驟

命令追加

AOF 持久化需要將所有寫命令記錄在文件中來保存服務(wù)器狀態(tài)届囚,而文件寫入操作效率比較低,如果每執(zhí)行一條寫命令都要寫一次 AOF 文件無(wú)疑是低效的是尖。為了提高效率意系,Redis 提供了一個(gè)中間層 – AOF 緩沖區(qū),也就是說當(dāng) Redis 執(zhí)行一條寫命令后析砸,先將該命令追加到 AOF 緩沖區(qū)中昔字,在以后的某個(gè)時(shí)刻再將 AOF 緩沖區(qū)中的內(nèi)容同步到文件中

當(dāng) AOF 持久化功能處于打開狀態(tài)時(shí),服務(wù)器在執(zhí)行完一個(gè)寫命令之后首繁,會(huì)以協(xié)議格式將被執(zhí)行的寫命令追加到服務(wù)器狀態(tài)的 aof_buf 緩沖區(qū)的末尾

AOF 文件的寫入與同步

Redis 的服務(wù)器進(jìn)程就是一個(gè)事件循環(huán)(loop)作郭,這個(gè)循環(huán)中的文件事件負(fù)責(zé)接收客戶端的命令請(qǐng)求,以及向客戶端發(fā)送命令回復(fù)弦疮,而時(shí)間事件則負(fù)責(zé)執(zhí)行像 serverCron 函數(shù)這樣需要定時(shí)運(yùn)行的函數(shù)

因?yàn)榉?wù)器在處理文件事件時(shí)可能會(huì)執(zhí)行寫命令夹攒,使得一些內(nèi)容被追加到 aof_buf 緩沖區(qū)里面,所以在服務(wù)器每次結(jié)束一個(gè)事件循環(huán)之前胁塞,它都會(huì)調(diào)用 flushAppendOnlyFile 函數(shù)咏尝,考慮是否需要將 aof_buf 緩沖區(qū)中的內(nèi)容寫入和保存到 AOF 文件里面

def eventLoop():

    while True:
    
        # 處理文件事件,接收命令請(qǐng)求以及發(fā)送命令回復(fù)
        # 處理命令請(qǐng)求時(shí)可能會(huì)有新內(nèi)容被追加到 aof_buf 緩沖區(qū)中
        processFileEvents()

        # 處理時(shí)間事件
        processTimeEvents()

        # 考慮是否要將 aof_buf 中的內(nèi)容寫入和保存到 AOF 文件里面
        flushAppendOnlyFile()

flushAppendOnlyFile 函數(shù)的行為由服務(wù)器配置的 appendfsync 選項(xiàng)的值來決定:

  • AOF_FSYNC_NO
    在該模式下啸罢,Redis 服務(wù)器在每個(gè)事件循環(huán)都將 AOF 緩沖區(qū)中的數(shù)據(jù)寫入 AOF 文件中,但不執(zhí)行同步 fsync 方法扰才,由操作系統(tǒng)決定何時(shí)同步。該模式速度最快(無(wú)需執(zhí)行同步操作)但也最不安全(如果機(jī)器崩潰將丟失上次同步后的所有數(shù)據(jù))

  • AOF_FSYNC_ALWAYS
    在該模式下衩匣,Redis 服務(wù)器在每個(gè)事件循環(huán)都將 AOF 緩沖區(qū)中的數(shù)據(jù)寫入 AOF 文件中,且執(zhí)行一次 AOF 文件同步操作琅捏。該模式速度最慢(每個(gè)事件循環(huán)都要執(zhí)行同步操作)但也最安全(如果機(jī)器崩潰只丟失當(dāng)前事件循環(huán)中處理的新數(shù)據(jù))

  • AOF_FSYNC_EVERYSEC
    在該模式下生百,Redis 服務(wù)器在每個(gè)事件循環(huán)都將 AOF 緩沖區(qū)中的數(shù)據(jù)寫入 AOF 文件中,且每秒執(zhí)行一次 AOF 文件同步操作柄延。該模式效率和安全性(如果機(jī)器崩潰只丟失前一秒處理的新數(shù)據(jù))比較適中,是 Redis 的默認(rèn)同步策略

AOF 文件的載入與數(shù)據(jù)還原

因?yàn)?Redis 的命令只能在客戶端上下文中執(zhí)行蜡坊,而載入 AOF 文件時(shí)所使用的命令直接來源于 AOF 文件而不是網(wǎng)絡(luò)連接杠输,所以服務(wù)器使用了一個(gè)沒有網(wǎng)絡(luò)連接的偽客戶端來執(zhí)行 AOF 文件保存的寫命令赎败,偽客戶端執(zhí)行命令的效果和帶網(wǎng)絡(luò)連接的客戶端執(zhí)行命令的效果完全一樣

AOF 重寫

AOF 持久化是通過保存被執(zhí)行的寫命令來記錄數(shù)據(jù)庫(kù)狀態(tài)的秕衙,所以 AOF 文件的大小隨著時(shí)間的流逝一定會(huì)越來越大;影響包括但不限于:對(duì)于 Redis 服務(wù)器据忘,計(jì)算機(jī)的存儲(chǔ)壓力;AOF 還原出數(shù)據(jù)庫(kù)狀態(tài)的時(shí)間增加

為了解決 AOF 文件體積膨脹的問題勇吊,Redis 提供了 AOF 重寫功能:Redis 服務(wù)器可以創(chuàng)建一個(gè)新的 AOF 文件來替代現(xiàn)有的 AOF 文件窍仰,新舊兩個(gè)文件所保存的數(shù)據(jù)庫(kù)狀態(tài)是相同的,但是新的 AOF 文件不會(huì)包含任何浪費(fèi)空間的冗余命令驹吮,通常體積會(huì)較舊 AOF 文件小很多

AOF 文件重寫的實(shí)現(xiàn)

AOF 文件重寫并不需要對(duì)現(xiàn)有的 AOF 文件進(jìn)行任何讀取、分析或?qū)懭氩僮鞯@個(gè)功能時(shí)通過讀取服務(wù)器當(dāng)前的數(shù)據(jù)狀態(tài)來實(shí)現(xiàn)的

實(shí)現(xiàn)原理:遍歷數(shù)據(jù)庫(kù)中的所有鍵(忽略已過期的鍵),讀取鍵現(xiàn)在的值族沃,用一條命令去記錄鍵值對(duì),代替之前修改該鍵值對(duì)的多個(gè)命令

在實(shí)際中常空,為了避免執(zhí)行命令時(shí)造成客戶端輸入緩沖區(qū)溢出,重寫程序在處理列表漓糙、哈希咐柜、集合兼蜈、有序集合這四種可能會(huì)帶有多個(gè)元素的鍵時(shí)拙友,會(huì)先檢查鍵所包含的元素?cái)?shù)量,如果超過某個(gè)限制遗契,會(huì)使用多條命令來記錄鍵的值,而不單單使用一條命令

AOF 后臺(tái)重寫

aof_rewrite 函數(shù)可以創(chuàng)建新的 AOF 文件漾根,但是這個(gè)函數(shù)會(huì)進(jìn)行大量的寫入操作,所以調(diào)用這個(gè)函數(shù)的線程將被長(zhǎng)時(shí)間的阻塞辐怕,因?yàn)?Redis 服務(wù)器使用單線程來處理命令請(qǐng)求逼蒙;所以如果直接是服務(wù)器進(jìn)程調(diào)用 aof_rewrite 函數(shù)的話,那么重寫 AOF 期間寄疏,服務(wù)器將無(wú)法處理客戶端發(fā)送來的命令請(qǐng)求

Redis 不希望 AOF 重寫會(huì)造成服務(wù)器無(wú)法處理請(qǐng)求是牢,所以 Redis 決定將 AOF 重寫程序放到子進(jìn)程(后臺(tái))里執(zhí)行。這樣處理的最大好處是:

  • 子進(jìn)程進(jìn)行 AOF 重寫期間陕截,主進(jìn)程可以繼續(xù)處理命令請(qǐng)求驳棱;
  • 子進(jìn)程帶有主進(jìn)程的數(shù)據(jù)副本,使用子進(jìn)程而不是線程社搅,可以避免在鎖的情況下乳规,保證數(shù)據(jù)的安全性
使用子進(jìn)程進(jìn)行 AOF 重寫的問題

子進(jìn)程在進(jìn)行 AOF 重寫期間,服務(wù)器進(jìn)程還要繼續(xù)處理命令請(qǐng)求驯妄,而新的命令可能對(duì)現(xiàn)有的數(shù)據(jù)進(jìn)行修改,這會(huì)讓當(dāng)前數(shù)據(jù)庫(kù)的數(shù)據(jù)和重寫后的 AOF 文件中的數(shù)據(jù)不一致

如何修正

為了解決這種數(shù)據(jù)不一致的問題源织,Redis 增加了一個(gè)AOF 重寫緩沖區(qū)微猖,這個(gè)緩沖區(qū)在 fork 出子進(jìn)程之后開始啟用谈息,Redis 服務(wù)器主進(jìn)程在執(zhí)行完寫命令之后凛剥,會(huì)同時(shí)將這個(gè)寫命令追加到 AOF 緩沖區(qū)和 AOF 重寫緩沖區(qū)
即子進(jìn)程在執(zhí)行 AOF 重寫時(shí),主進(jìn)程需要執(zhí)行以下三個(gè)工作:

  • 執(zhí)行 client 發(fā)來的命令請(qǐng)求
  • 將寫命令追加到現(xiàn)有的 AOF 文件中
  • 將寫命令追加到 AOF 重寫緩存中

可以保證:

  • AOF 緩沖區(qū)的內(nèi)容會(huì)定期被寫入和同步到 AOF 文件中逻炊,對(duì)現(xiàn)有的 AOF 文件的處理工作會(huì)正常進(jìn)行
  • 從創(chuàng)建子進(jìn)程開始犁享,服務(wù)器執(zhí)行的所有寫操作都會(huì)被記錄到 AOF 重寫緩沖區(qū)中

當(dāng)子進(jìn)程完成對(duì) AOF 文件重寫之后,它會(huì)向父進(jìn)程發(fā)送一個(gè)完成信號(hào)桨吊,父進(jìn)程接到該完成信號(hào)之后,會(huì)調(diào)用一個(gè)信號(hào)處理函數(shù)视乐,該函數(shù)完成以下工作:

  • 將 AOF 重寫緩存中的內(nèi)容全部寫入到新的 AOF 文件中;這個(gè)時(shí)候新的 AOF 文件所保存的數(shù)據(jù)庫(kù)狀態(tài)和服務(wù)器當(dāng)前的數(shù)據(jù)庫(kù)狀態(tài)一致
  • 對(duì)新的 AOF 文件進(jìn)行改名留美,原子地覆蓋原有的 AOF 文件渣聚;完成新舊兩個(gè) AOF 文件的替換

當(dāng)這個(gè)信號(hào)處理函數(shù)執(zhí)行完畢之后独榴,主進(jìn)程就可以繼續(xù)像往常一樣接收命令請(qǐng)求了

在整個(gè) AOF 后臺(tái)重寫過程中奕枝,只有最后的信號(hào)處理函數(shù)執(zhí)行時(shí)會(huì)造成主進(jìn)程阻塞瓶堕,在其他時(shí)候,AOF 后臺(tái)重寫都不會(huì)對(duì)主進(jìn)程造成阻塞谭梗,這將 AOF 重寫對(duì)性能造成的影響降到最低

以上宛蚓,即 AOF 后臺(tái)重寫,也就是 BGREWRITEAOF 命令的工作原理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末远舅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子痕钢,更是在濱河造成了極大的恐慌,老刑警劉巖任连,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件随抠,死亡現(xiàn)場(chǎng)離奇詭異裁着,居然都是意外死亡拱她,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門诸蚕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坏瘩,你說我怎么就攤上這事漠魏【蠓” “怎么了柱锹?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵禁熏,是天一觀的道長(zhǎng)壤巷。 經(jīng)常有香客問我瞧毙,道長(zhǎng),這世上最難降的妖魔是什么矩动? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任释漆,我火速辦了婚禮,結(jié)果婚禮上男图,老公的妹妹穿的比我還像新娘。我一直安慰自己峻凫,他們只是感情好览露,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般梦皮。 火紅的嫁衣襯著肌膚如雪洪囤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音苟翻,去河邊找鬼骗污。 笑死崇猫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诅炉。 我是一名探鬼主播屋厘,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼汗洒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起痹扇,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤溯香,失蹤者是張志新(化名)和其女友劉穎浓恶,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體包晰,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伐憾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年树肃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胸嘴。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乡话,靈堂內(nèi)的尸體忽然破棺而出耳奕,到底是詐尸還是另有隱情绑青,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布坏挠,位于F島的核電站掠拳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏溺欧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一芥牌、第九天 我趴在偏房一處隱蔽的房頂上張望聂使。 院中可真熱鬧,春花似錦柏靶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辆苔。三九已至扼劈,卻和暖如春驻啤,著一層夾襖步出監(jiān)牢的瞬間荐吵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工沐旨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榨婆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓良风,卻偏偏與公主長(zhǎng)得像闷供,于是被迫代替她去往敵國(guó)和親统诺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 從這篇文章開始婿失,將依次介紹Redis高可用相關(guān)的知識(shí)——持久化啄寡、復(fù)制(及讀寫分離)豪硅、哨兵挺物、以及集群。 本文將先說明...
    不變甄心閱讀 693評(píng)論 0 4
  • 一砚著、Redis高可用概述 在介紹Redis高可用之前痴昧,先說明一下在Redis的語(yǔ)境中高可用的含義稽穆。 我們知道赶撰,在w...
    空語(yǔ)閱讀 1,597評(píng)論 0 2
  • 前言 在上一篇文章中,介紹了Redis內(nèi)存模型,從這篇文章開始绒疗,將依次介紹Redis高可用相關(guān)的知識(shí)——持久化、復(fù)...
    Java架構(gòu)閱讀 2,314評(píng)論 3 21
  • 企業(yè)級(jí)redis集群架構(gòu)的特點(diǎn) 海量數(shù)據(jù) 高并發(fā) 高可用 要達(dá)到高可用惕虑,持久化是不可減少的,持久化主要是做災(zāi)難恢復(fù)...
    lucode閱讀 2,206評(píng)論 0 7
  • 我的大馬之旅 抱著滿心的歡喜期待和一點(diǎn)點(diǎn)的緊張溃蔫,踏上了這段探索自己的旅程琳猫。 項(xiàng)目一共有8個(gè)EP,四個(gè)來自中國(guó)的女生...
    Hayleyyyy閱讀 262評(píng)論 0 0