2018-10-23
RDB持久性以指定的時(shí)間間隔執(zhí)行數(shù)據(jù)集的時(shí)間點(diǎn)快照
AOF持久性會(huì)記錄服務(wù)器執(zhí)行的每個(gè)寫入操作款青,這些操作將在服務(wù)器啟動(dòng)時(shí)通過執(zhí)行這些命令來還原數(shù)據(jù)集
redis還可以同時(shí)使用AOF和RDB做修。這種情況下,重啟時(shí)優(yōu)先使用AOF文件來還原數(shù)據(jù)集抡草,因?yàn)橥ǔOF數(shù)據(jù)集比RDB更完整
也可以關(guān)閉持久化功能饰及,讓數(shù)據(jù)只在服務(wù)器運(yùn)行時(shí)存在
RDB:
優(yōu)點(diǎn):
RDB是一個(gè)非常緊湊(compact)的文件,它保存了redis在某個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)集康震。這種文件非常適用于進(jìn)行備份
RDB非常適用于災(zāi)難恢復(fù)(disaster recovery):它只有一個(gè)文件燎含,并且內(nèi)容非常緊湊,可以(在加密后)將它傳送到別的數(shù)據(jù)中心
RDB 可以最大化 Redis 的性能:父進(jìn)程在保存 RDB 文件時(shí)唯一要做的就是fork出一個(gè)子進(jìn)程腿短,然后這個(gè)子進(jìn)程就會(huì)處理接下來的所有保存工作屏箍,父進(jìn)程無須執(zhí)行任何磁盤 I/O 操作。
RDB 在恢復(fù)大數(shù)據(jù)集時(shí)的速度比 AOF 的恢復(fù)速度要快橘忱。
缺點(diǎn):
如果你需要盡量避免在服務(wù)器故障時(shí)丟失數(shù)據(jù)腰吟,那么 RDB 不適合你飞崖。 雖然 Redis 允許你設(shè)置不同的保存點(diǎn)(save point)來控制保存 RDB 文件的頻率堤器, 但是银酬, 因?yàn)镽DB 文件需要保存整個(gè)數(shù)據(jù)集的狀態(tài), 所以它并不是一個(gè)輕松的操作凝颇。 因此你可能會(huì)至少 5 分鐘才保存一次 RDB 文件潘拱。 在這種情況下, 一旦發(fā)生故障停機(jī)拧略, 你就可能會(huì)丟失好幾分鐘的數(shù)據(jù)芦岂。
每次保存RDB的時(shí)候,Redis都要fork()出一個(gè)子進(jìn)程辑鲤,并由子進(jìn)程來進(jìn)行實(shí)際的持久化工作盔腔。在數(shù)據(jù)集比較龐大時(shí),fork()可能會(huì)非常耗時(shí)月褥,造成服務(wù)器在某某毫秒內(nèi)停止處理客戶端; 如果數(shù)據(jù)集非常巨大弛随,并且CPU時(shí)間非常緊張的話,那么這種停止時(shí)間甚至可能會(huì)長達(dá)整整一秒宁赤。 雖然AOF重寫也需要進(jìn)行fork()舀透,但無論 AOF 重寫的執(zhí)行間隔有多長,數(shù)據(jù)的耐久性都不會(huì)有任何損失决左。
AOF:
優(yōu)點(diǎn):
使用 AOF 持久化會(huì)讓 Redis 變得非常耐久(much more durable):你可以設(shè)置不同的 fsync 策略愕够,比如無 fsync 走贪,每秒鐘一次 fsync ,或者每次執(zhí)行寫入命令時(shí) fsync 惑芭。 AOF 的默認(rèn)策略為每秒鐘 fsync 一次坠狡,在這種配置下,Redis 仍然可以保持良好的性能遂跟,并且就算發(fā)生故障停機(jī)逃沿,也最多只會(huì)丟失一秒鐘的數(shù)據(jù)(fsync會(huì)在后臺(tái)線程執(zhí)行,所以主線程可以繼續(xù)努力地處理命令請(qǐng)求)幻锁。
AOF 文件是一個(gè)只進(jìn)行追加操作的日志文件(append only log)凯亮, 因此對(duì)AOF文件的寫入不需要進(jìn)行seek,即使日志因?yàn)槟承┰蚨宋磳懭胪暾拿?比如寫入時(shí)磁盤已滿哄尔,寫入中途停機(jī)假消,等等),redis-check-aof工具也可以輕易地修復(fù)這種問題岭接。
Redis 可以在 AOF 文件體積變得過大時(shí)富拗,自動(dòng)地在后臺(tái)對(duì) AOF 進(jìn)行重寫:重寫后的新AOF文件包含了恢復(fù)當(dāng)前數(shù)據(jù)集所需的最小命令集合。整個(gè)重寫操作是絕對(duì)安全的亿傅,因?yàn)镽edis在創(chuàng)建新AOF文件的過程中媒峡,會(huì)繼續(xù)將命令追加到現(xiàn)有的AOF文件里面瘟栖,即使重寫過程中發(fā)生停機(jī)葵擎,現(xiàn)有的AOF文件也不會(huì)丟失。 而一旦新 AOF 文件創(chuàng)建完畢半哟,Redis 就會(huì)從舊 AOF 文件切換到新 AOF 文件酬滤,并開始對(duì)新 AOF 文件進(jìn)行追加操作。
AOF 文件有序地保存了對(duì)數(shù)據(jù)庫執(zhí)行的所有寫入操作寓涨, 這些寫入操作以 Redis 協(xié)議的格式保存盯串, 因此 AOF 文件的內(nèi)容非常容易被人讀懂, 對(duì)文件進(jìn)行分析(parse)也很輕松戒良。 導(dǎo)出(export) AOF 文件也非常簡單: 舉個(gè)例子体捏, 如果你不小心執(zhí)行了 FLUSHALL 命令, 但只要 AOF 文件未被重寫糯崎, 那么只要停止服務(wù)器几缭, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重啟 Redis 沃呢, 就可以將數(shù)據(jù)集恢復(fù)到 FLUSHALL 執(zhí)行之前的狀態(tài)年栓。
缺點(diǎn):
對(duì)于相同的數(shù)據(jù)集來說,AOF 文件的體積通常要大于 RDB 文件的體積薄霜。
根據(jù)所使用的 fsync 策略某抓,AOF 的速度可能會(huì)慢于 RDB 纸兔。 在一般情況下, 每秒 fsync 的性能依然非常高否副, 而關(guān)閉 fsync 可以讓 AOF 的速度和 RDB 一樣快汉矿, 即使在高負(fù)荷之下也是如此。 不過在處理巨大的寫入載入時(shí)备禀,RDB 可以提供更有保證的最大延遲時(shí)間(latency)负甸。
AOF 在過去曾經(jīng)發(fā)生過這樣的 bug : 因?yàn)閭€(gè)別命令的原因,導(dǎo)致 AOF 文件在重新載入時(shí)痹届,無法將數(shù)據(jù)集恢復(fù)成保存時(shí)的原樣呻待。 (舉個(gè)例子,阻塞命令 BRPOPLPUSH 就曾經(jīng)引起過這樣的 bug 队腐。) 測試套件里為這種情況添加了測試: 它們會(huì)自動(dòng)生成隨機(jī)的蚕捉、復(fù)雜的數(shù)據(jù)集, 并通過重新載入這些數(shù)據(jù)來確保一切正常柴淘。 雖然這種 bug 在 AOF 文件中并不常見迫淹, 但是對(duì)比來說, RDB 幾乎是不可能出現(xiàn)這種 bug 的为严。