redis總結(jié)--持久化

一、Redis持久化必要性

Redis作為內(nèi)存數(shù)據(jù)庫,為了應(yīng)對(duì)因進(jìn)程意外退出造成的數(shù)據(jù)丟失,Redis提供了RDB和AOF兩種持久化方式,用于將數(shù)據(jù)從內(nèi)存持久化到硬盤文件。Redis進(jìn)程意外退出后重啟時(shí),Redis會(huì)自動(dòng)利用持久化文件恢復(fù)數(shù)據(jù)。

  • RDB (Redis database)快照(snapshot),全量備份,單一文件,文件總量小,恢復(fù)快,但數(shù)據(jù)存在丟失。
  • AOF(Append file only), 增量備份,丟失少量數(shù)據(jù),會(huì)影響實(shí)時(shí)性能。

二、RDB

觸發(fā)機(jī)制:
  • 手動(dòng)觸發(fā)
    1. save 會(huì)阻塞客戶端請(qǐng)求命令,影響業(yè)務(wù),線上環(huán)境不建議使用。
    127.0.0.1:6379> save
    OK
    
    1. bgsave 是對(duì)save做的優(yōu)化,不會(huì)阻塞客戶端請(qǐng)求,但是fork過程會(huì)造成阻塞(后面詳細(xì)說明)。這也是目前RDB自動(dòng)持久化的方式。
    127.0.0.1:6379> bgsave
    Background saving started
    
  • 自動(dòng)觸發(fā)
    1. 配置redis.conf中的save備份規(guī)則,或者redis-server啟動(dòng)后,通過config set命令配置save規(guī)則。
    127.0.0.1:6379> config set save "3600 1 300 100 60 10000"
    OK
    
    • save m n表示,表示每m秒內(nèi)數(shù)據(jù)集產(chǎn)生了n次修改,將自動(dòng)觸發(fā)RDB持久化。
    • 關(guān)閉該功能,將save設(shè)置為""
    config set save ""
    
    1. flushall,該命令會(huì)產(chǎn)生空的.rdb文件。
    2. debug reload, 執(zhí)行該命令會(huì)自動(dòng)觸發(fā)save操作。
    3. shutdown,執(zhí)行shudown操作,會(huì)自動(dòng)備份,生成.rdb文件。
RDB過程:
  • RDB過程如下:

    1. 執(zhí)行bgsave,判斷當(dāng)前是否存在RDB子進(jìn)程,如果存在,則返回。
    2. 父進(jìn)程通過fork操作創(chuàng)建子進(jìn)程,父進(jìn)程造成一定阻塞,通過info命令可以查看latest_fork_usec表示上次fork操作用時(shí)。
    3. 父進(jìn)程執(zhí)行完fork后,bgsave命令返回“Background saving started”,并不再阻塞,繼續(xù)響應(yīng)客戶端請(qǐng)求。
    4. 子進(jìn)程創(chuàng)建rdb文件,根據(jù)父進(jìn)程內(nèi)存快照生成臨時(shí)rdb文件,完成后對(duì)原有文件進(jìn)行替換。
    5. 子進(jìn)程發(fā)送信號(hào)給父進(jìn)程表示完成,父進(jìn)程更新統(tǒng)計(jì)信息,可通過info命令查看Persistence信息。
  • 兩個(gè)要點(diǎn):fork and cow (copy on write)

    • fork 這個(gè)過程不是拷貝父進(jìn)程的物理內(nèi)存空間,而是拷貝父進(jìn)程父進(jìn)程內(nèi)存空間頁表(記錄物理內(nèi)存空間地址),父子進(jìn)程共享物理內(nèi)存空間,此過程會(huì)消耗時(shí)間,造成阻塞,數(shù)據(jù)量很大時(shí),對(duì)性能會(huì)造成影響。
    • copy on write fork出子進(jìn)程后,父進(jìn)程繼續(xù)處理請(qǐng)求,子進(jìn)程負(fù)責(zé)將內(nèi)存數(shù)據(jù)寫入臨時(shí)文件。不需要完全拷貝出父進(jìn)程內(nèi)存,因?yàn)閘inux有寫時(shí)復(fù)制(copy on write)機(jī)制。父進(jìn)程在處理寫請(qǐng)求時(shí),會(huì)把要修改的內(nèi)存頁創(chuàng)建副本,而不是修改共享的內(nèi)存頁。子進(jìn)程的地址空間內(nèi)數(shù)據(jù),是fork時(shí)刻數(shù)據(jù)庫的快照。
  • .rdb文件默認(rèn)開啟壓縮,采用LZF算法,雖然消耗一定性能,不過可以大幅降低文件體積,方便保存到硬盤或通過網(wǎng)絡(luò)發(fā)送給從節(jié)點(diǎn)。

config set rdbcompression yes|no

三、AOF

開啟AOF
  • 配置文件設(shè)置 appendonly yes | no , 默認(rèn)不開啟。
AOF文件同步
  • 命令寫入時(shí),會(huì)先寫入aof_buf緩存中,然后同步到磁盤,同步模式有三種:
appendfsync always   // 通過系統(tǒng)調(diào)用fsync, 每次收到寫命令就立即強(qiáng)制寫入磁盤,最慢的,但是保證完全的持久化,不推薦使用
appendfsync everysec    // 通過系統(tǒng)調(diào)用write,每秒鐘強(qiáng)制寫入磁盤一次,在性能和持久化方面做了很好的折中,默認(rèn)。
appendfsync no    // write操作,完全依賴os,性能最好,持久化沒保證,通常不會(huì)超過30s。
  • 系統(tǒng)調(diào)用fsync和write
    • fsync,在操作文件時(shí),強(qiáng)制將高速緩存中的內(nèi)容同步到硬盤。
    • write,在調(diào)用后,數(shù)據(jù)寫入高速緩沖區(qū),此時(shí),系統(tǒng)調(diào)用立刻返回。同步硬盤操作依賴于系統(tǒng)調(diào)度。如果此時(shí)發(fā)生宕機(jī),緩存區(qū)數(shù)據(jù)會(huì)丟失。
  • .aof文件以直接文本協(xié)議格式保存。
AOF重寫機(jī)制
  • 隨著命令的不斷寫入,.aof文件越來越大,redis通過重寫機(jī)制壓縮.aof文件體積,觸發(fā)時(shí)機(jī)由auto-aof-rewrite-min-size和auto-aof-rewrite-percentage參 數(shù)確定。此外,redis提供了命令bgrewriteaof手動(dòng)觸發(fā)重寫機(jī)制。
  • 重寫的過程如下:
    1. redis執(zhí)行AOF重寫,如果當(dāng)前正在進(jìn)行aof重寫,則不執(zhí)行,返回正在進(jìn)行中的錯(cuò)誤響應(yīng)。如果當(dāng)前正在進(jìn)行bgsave,重寫命令延遲到bgsave執(zhí)行完畢進(jìn)行。
    2. 父進(jìn)程進(jìn)行fork創(chuàng)建子進(jìn)程,開銷等于bgsave過程。
    3. 父進(jìn)程繼續(xù)響應(yīng)請(qǐng)求,將新的數(shù)據(jù)保存到AOF重寫緩沖區(qū),由子進(jìn)程操作共享內(nèi)存,(同樣基于copy on write技術(shù))。
    4. 子進(jìn)程根據(jù)內(nèi)存快照,按照合并規(guī)則寫入到新的AOF文件。
    5. 子進(jìn)程發(fā)送信號(hào)給父進(jìn)程表示完成,父進(jìn)程更新統(tǒng)計(jì)信息,可通過info命令查看Persistence信息。
    6. 父進(jìn)程把AOF緩沖區(qū)文件寫入到新的AOF文件。
    7. 用新的AOF文件替換老的AOF文件。
  • 可以通過no-appendfsync-on-rewrite,決定是否在重寫期間進(jìn)行磁盤同步,默認(rèn)不開啟,因?yàn)楸旧碇貙憣?duì)磁盤IO開銷比較大,不過在這可能會(huì)造成重寫期間的數(shù)據(jù)丟失。
AOF阻塞
  • 對(duì)于采用everysec的配置,AOF線程負(fù)責(zé)刷盤同步,1s一次。不過redis采取延遲fsync策略,當(dāng)一次同步超過1s時(shí),會(huì)在再等待1s。每次同步前,主線程都會(huì)檢測(cè)上次同步成功時(shí)間,如果距離上次同步時(shí)間超過2s,主線程會(huì)進(jìn)入阻塞狀態(tài),直到同步完成。
  • 極端情況下,AOF最多丟失2s內(nèi)的數(shù)據(jù)。
  • 每當(dāng)發(fā)生AOF阻塞,aof_delayed_fsync都會(huì)累加,可以通過這個(gè)指標(biāo)查看AOF阻塞問題,主要通過優(yōu)化磁盤負(fù)載解決。

redis重啟加載

  1. AOF持久化開啟,并且.aof文件存在,優(yōu)先加載.aof文件,否則不進(jìn)行AOF恢復(fù)。
  2. RDB持久化開啟,并且.rdb文件存在,根據(jù).rdb文件進(jìn)行恢復(fù)。
  • 加載.aof和.rdb文件時(shí),都會(huì)進(jìn)行文件校驗(yàn)。文件損壞時(shí),會(huì)拒絕啟動(dòng)。對(duì)于rdb可以用Redis的redis-check-dump文件進(jìn)行檢測(cè)。對(duì)于.aof文件,可以通過redis-check-aof --fix進(jìn)行恢復(fù)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,520評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,541評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,896評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,062評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,608評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,356評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,555評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,769評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評(píng)論 1 295
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,289評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,516評(píng)論 2 379