Redis-持久化

兩種持久化機(jī)制

Redis 的持久化機(jī)制有兩種,第一種是快照,第二種是 AOF日志

快照(RDB)

方式:一次全量備份
存儲(chǔ)內(nèi)容:內(nèi)存數(shù)據(jù)的二進(jìn)制序列化形式,在存儲(chǔ)上非常緊湊。
原理:使用操作系統(tǒng)的多進(jìn)程 COW(Copy On Write) 機(jī)制來(lái)實(shí)現(xiàn)快照持久化。
觸發(fā)機(jī)制:

  1. 手動(dòng)觸發(fā)(save:直接阻塞服務(wù)器,知道RDB結(jié)束。實(shí)例較大的話會(huì)造成長(zhǎng)時(shí)間阻塞。和bgsave:執(zhí)行fork操作創(chuàng)建子進(jìn)程,RDB持久化過(guò)程由子進(jìn)程負(fù)責(zé),完成后自動(dòng)結(jié)束。阻塞只發(fā)生在fork階段。)
  2. 自動(dòng)觸發(fā):
    2.1“save m n”。表示m秒內(nèi)數(shù)據(jù)集存在n次修改時(shí),自動(dòng)觸發(fā)bgsave。
    2.2 從節(jié)點(diǎn)執(zhí)行全量復(fù)制操作,主節(jié)點(diǎn)自動(dòng)執(zhí)行bgsave生成RDB文 319
    件并發(fā)送給從節(jié)點(diǎn).
    2.3 debug reload命令重新加載Redis
    2.4 默認(rèn)情況下執(zhí)行shutdown命令時(shí),如果沒(méi)有開(kāi)啟AOF持久化功能則 自動(dòng)執(zhí)行bgsave。
    過(guò)程:
  3. 調(diào)用 glibc 的函數(shù) fork 產(chǎn)生一個(gè)子進(jìn)程,快照持久化完全交給子進(jìn)程來(lái)處理,父進(jìn)程繼續(xù)處理客戶端請(qǐng)求。(子進(jìn)程剛剛產(chǎn)生時(shí),它和父進(jìn)程共享內(nèi)存里面的代 碼段和數(shù)據(jù)段)。
  4. 子進(jìn)程做數(shù)據(jù)持久化,它不會(huì)修改現(xiàn)有的內(nèi)存數(shù)據(jù)結(jié)構(gòu),它只是對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷讀 取,然后序列化寫(xiě)到磁盤中。父進(jìn)程,持續(xù)服務(wù)客戶端請(qǐng)求,然后對(duì)內(nèi)存數(shù)據(jù)結(jié)構(gòu)進(jìn)行不間斷的修改。(操作系統(tǒng)的 COW 機(jī)制來(lái)進(jìn)行數(shù)據(jù)段頁(yè)面的分離:數(shù)據(jù)段是由很多操作系統(tǒng)的頁(yè)面組合而成,當(dāng)父進(jìn)程對(duì)其中一個(gè)頁(yè)面的數(shù)據(jù)進(jìn)行修改時(shí),會(huì)將被共享的頁(yè)面復(fù)制一份分離出來(lái),然后對(duì)這個(gè)復(fù)制的頁(yè)面進(jìn)行修改。這時(shí)子進(jìn)程相應(yīng)的頁(yè)面是沒(méi)有變化的, 還是進(jìn)程產(chǎn)生時(shí)那一瞬間的數(shù)據(jù)。它能看到的內(nèi)存里的數(shù)據(jù)在進(jìn)程產(chǎn)生的一瞬間就凝固了。)
  5. 子進(jìn)程發(fā)送信號(hào)給父進(jìn)程表示完成,父進(jìn)程更新統(tǒng)計(jì)信息。
    RED過(guò)程.jpg

    優(yōu)點(diǎn):
    緊湊壓縮的二進(jìn)制文件,代表Redis在某個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)快照。非常適用于備份,全量復(fù)制等場(chǎng)景。Redis加載RDB恢復(fù)數(shù)據(jù)遠(yuǎn)遠(yuǎn)快于AOF的方式。
    缺點(diǎn):
    沒(méi)辦法做到實(shí)時(shí)持久化/秒級(jí)持久化。(執(zhí)行fork操作創(chuàng)建子進(jìn)程,屬于重量級(jí)操作,頻繁執(zhí)行成本過(guò)高。)
    兼容性問(wèn)題:RDB文件使用特定二進(jìn)制格式保存,Redis版本演進(jìn)過(guò)程中有多個(gè)格式 的RDB版本,存在老版本Redis服務(wù)無(wú)法兼容新版RDB格式的問(wèn)題。

AOF日志

方式:連續(xù)的增量備份
存儲(chǔ)內(nèi)容:記錄了自 Redis 實(shí)例創(chuàng)建以來(lái)所有的修改性指令序列。(長(zhǎng)期的運(yùn)行過(guò)程中,AOF日志會(huì)變的無(wú)比龐大,數(shù)據(jù)庫(kù)重啟時(shí)需要加載 AOF日志進(jìn)行指令重放,這個(gè)時(shí)間就會(huì)無(wú)比漫長(zhǎng)。 所以需要定期進(jìn)行 AOF 重寫(xiě),給 AOF日志進(jìn)行瘦身。)
過(guò)程:Redis 會(huì)在收到客戶端修改指令后,先進(jìn)行參數(shù)校驗(yàn),如果沒(méi)問(wèn)題,就立即將該指令文本存儲(chǔ)到 AOF 日志中,也就是先存到磁盤,然后再執(zhí)行指令。這樣即使遇到突發(fā)宕機(jī),已經(jīng)存儲(chǔ)到 AOF 日志的指令進(jìn)行重放一下就可以恢復(fù)到宕機(jī)前的狀態(tài)。
AOF瘦身:
就是開(kāi)辟一個(gè)子進(jìn)程對(duì)內(nèi)存進(jìn)行遍歷轉(zhuǎn)換成一系列 Redis 的操作指令,序列化到一個(gè)新的 AOF 日志文件中。 序列化完畢后再將操作期間發(fā)生的增量 AOF 日志追加到這個(gè)新的 AOF 日志文件中,追加完畢后就立即替代舊的 AOF日志文件了,瘦身工作就完成了。
寫(xiě)文件原理和宕機(jī)處理:
程序?qū)?AOF 日志文件進(jìn)行寫(xiě)操作時(shí),實(shí)際上是將內(nèi)容寫(xiě)到了內(nèi)核為文件描述符分配的一個(gè)內(nèi)存緩存中,然后內(nèi)核會(huì)異步將臟數(shù)據(jù)刷回到磁盤的。
AOF 日志內(nèi)容可能還沒(méi)有來(lái)得及完全刷到磁盤中,這個(gè)時(shí)候就會(huì)出現(xiàn)日志丟失。那該怎么辦?Linux 的 glibc 提供了 fsync(int fd)函數(shù)可以將指定文件的內(nèi)容強(qiáng)制從內(nèi)核緩存刷到磁盤。但是 fsync 是一個(gè) 磁盤 IO 操作,它很慢!如果 Redis 執(zhí)行一條指令就要 fsync 一次,那么 Redis 高性能的 地位就不保了。所以在生產(chǎn)環(huán)境的服務(wù)器中,Redis 通常是每隔 1s 左右執(zhí)行一次 fsync 操作,周期 1s 是可以配置的。

混合持久化

將 rdb 文 件的內(nèi)容和增量的 AOF 日志文件存在一起。這里的 AOF 日志不再是全量的日志,而是自持久化開(kāi)始到持久化結(jié)束的這段時(shí)間發(fā)生的增量 AOF 日志,通常這部分 AOF 日志很小。于是在 Redis 重啟的時(shí)候,可以先加載 rdb 的內(nèi)容,然后再重放增量 AOF 日志就可 以完全替代之前的 AOF 全量文件重放,重啟效率因此大幅得到提升。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • RDB(Redis Database) 在指定的時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫(xiě)入磁盤, 也就是行話講的Snaps...
    花神子閱讀 186評(píng)論 0 1
  • by shihang.mai 凡是存儲(chǔ),都有快照/副本、日志 1. RDB RDB(redis db)描述的是快照...
    麥大大吃不胖閱讀 699評(píng)論 0 1
  • 前言 在上一篇文章中,介紹了Redis的內(nèi)存模型,從這篇文章開(kāi)始,將依次介紹Redis高可用相關(guān)的知識(shí)——持久化、...
    不_一閱讀 173評(píng)論 0 1
  • redis是一個(gè)內(nèi)存數(shù)據(jù)庫(kù),一旦服務(wù)器宕機(jī),內(nèi)存中的數(shù)據(jù)將全部丟失。所以,對(duì) Redis 來(lái)說(shuō),實(shí)現(xiàn)數(shù)據(jù)的持久化,...
    碼農(nóng)Kkio閱讀 472評(píng)論 0 1
  • 持久化 本文提供對(duì) Redis 持久化(persistence)的技術(shù)性描述,適合所有的 Redis 用戶來(lái)閱讀。...
    cgw丶閱讀 369評(píng)論 0 2

友情鏈接更多精彩內(nèi)容