RDB 文件的优势和劣势
一、優(yōu)勢(shì)
1.RDB 是一個(gè)非常緊湊(compact)的文件,它保存了redis 在某個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)集。這種文件非常適合用于進(jìn)行備份和災(zāi)難恢復(fù)。
2.生成RDB 文件的時(shí)候,redis 主進(jìn)程會(huì)fork()一個(gè)子進(jìn)程來處理所有保存工作,主進(jìn)程不需要進(jìn)行任何磁盤IO 操作。
3.RDB 在恢復(fù)大數(shù)據(jù)集時(shí)的速度比AOF 的恢復(fù)速度要快。
二、劣勢(shì)
1、RDB 方式數(shù)據(jù)沒辦法做到實(shí)時(shí)持久化/秒級(jí)持久化。因?yàn)閎gsave 每次運(yùn)行都要執(zhí)行fork 操作創(chuàng)建子進(jìn)程,頻繁執(zhí)行成本過高。
2、在一定間隔時(shí)間做一次備份,所以如果redis 意外down 掉的話,就會(huì)丟失最后一次快照之后的所有修改(數(shù)據(jù)有丟失)。
如果數(shù)據(jù)相對(duì)來說比較重要,希望將損失降到最小,則可以使用AOF 方式進(jìn)行持久化。
?
AOF
Append Only File
AOF:Redis 默認(rèn)不開啟。AOF 采用日志的形式來記錄每個(gè)寫操作,并追加到文件中。開啟后,執(zhí)行更改Redis 數(shù)據(jù)的命令時(shí),就會(huì)把命令寫入到AOF 文件中。
Redis 重啟時(shí)會(huì)根據(jù)日志文件的內(nèi)容把寫指令從前到后執(zhí)行一次以完成數(shù)據(jù)的恢復(fù)工作。
?
AOF 配置
配置文件redis.conf
# 開關(guān) appendonly no # 文件名 appendfilename "appendonly.aof"AOF 文件的內(nèi)容(vim 查看):
問題:數(shù)據(jù)都是實(shí)時(shí)持久化到磁盤嗎?
由于操作系統(tǒng)的緩存機(jī)制,AOF 數(shù)據(jù)并沒有真正地寫入硬盤,而是進(jìn)入了系統(tǒng)的硬盤緩存。什么時(shí)候把緩沖區(qū)的內(nèi)容寫入到AOF 文件?
| 參數(shù) | 說明 |
| appendfsync everysec | AOF 持久化策略(硬盤緩存到磁盤),默認(rèn)everysec ? no 表示不執(zhí)行fsync,由操作系統(tǒng)保證數(shù)據(jù)同步到磁盤,速度最快,但是不太安全; ? always 表示每次寫入都執(zhí)行fsync,以保證數(shù)據(jù)同步到磁盤,效率很低; ? everysec 表示每秒執(zhí)行一次fsync,可能會(huì)導(dǎo)致丟失這1s 數(shù)據(jù)。通常選擇everysec , 兼顧安全性和效率。 |
?
?
?
?
?
問題:文件越來越大,怎么辦?
由于AOF 持久化是Redis 不斷將寫命令記錄到AOF 文件中,隨著Redis 不斷的進(jìn)行,AOF 的文件會(huì)越來越大,文件越大,占用服務(wù)器內(nèi)存越大以及AOF 恢復(fù)要求時(shí)間越長(zhǎng)。
例如set leon 666,執(zhí)行1000 次,結(jié)果都是leon=666。
為了解決這個(gè)問題,Redis 新增了重寫機(jī)制,當(dāng)AOF 文件的大小超過所設(shè)定的閾值時(shí),Redis 就會(huì)啟動(dòng)AOF 文件的內(nèi)容壓縮,只保留可以恢復(fù)數(shù)據(jù)的最小指令集。
可以使用命令bgrewriteaof 來重寫。
AOF 文件重寫并不是對(duì)原文件進(jìn)行重新整理,而是直接讀取服務(wù)器現(xiàn)有的鍵值對(duì),然后用一條命令去代替之前記錄這個(gè)鍵值對(duì)的多條命令,生成一個(gè)新的文件后去替換原來的AOF 文件。
# 重寫觸發(fā)機(jī)制 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb| 參數(shù) | 說明 |
| auto-aof-rewrite-percentag e | 默認(rèn)值為100。aof 自動(dòng)重寫配置,當(dāng)目前aof 文件大小超過上一次重寫的aof 文件大小的 百分之多少進(jìn)行重寫,即當(dāng)aof 文件增長(zhǎng)到一定大小的時(shí)候,Redis 能夠調(diào)用bgrewriteaof 對(duì)日志文件進(jìn)行重寫。當(dāng)前AOF 文件大小是上次日志重寫得到AOF 文件大小的二倍(設(shè) 置為100)時(shí),自動(dòng)啟動(dòng)新的日志重寫過程。 |
| auto-aof-rewrite-min-size | 默認(rèn)64M。設(shè)置允許重寫的最小aof 文件大小,避免了達(dá)到約定百分比但尺寸仍然很小的 情況還要重寫。 |
?
?
?
?
?
?
問題:重寫過程中,AOF 文件被更改了怎么辦?
另外有兩個(gè)與AOF 相關(guān)的參數(shù):
| 參數(shù) | 說明 |
| no-appendfsync-on-rewrite | 在aof 重寫或者寫入rdb 文件的時(shí)候,會(huì)執(zhí)行大量IO,此時(shí)對(duì)于everysec 和always 的aof 模式來說,執(zhí)行fsync 會(huì)造成阻塞過長(zhǎng)時(shí)間,no-appendfsync-on-rewrite 字段設(shè)置為默認(rèn)設(shè) 置為no。如果對(duì)延遲要求很高的應(yīng)用,這個(gè)字段可以設(shè)置為yes,否則還是設(shè)置為no,這 樣對(duì)持久化特性來說這是更安全的選擇。設(shè)置為yes 表示rewrite 期間對(duì)新寫操作不fsync, 暫時(shí)存在內(nèi)存中,等rewrite 完成后再寫入,默認(rèn)為no,建議修改為yes。Linux 的默認(rèn)fsync 策略是30 秒。可能丟失30 秒數(shù)據(jù)。 |
| aof-load-truncated | aof 文件可能在尾部是不完整的,當(dāng)redis 啟動(dòng)的時(shí)候,aof 文件的數(shù)據(jù)被載入內(nèi)存。重啟 可能發(fā)生在redis 所在的主機(jī)操作系統(tǒng)宕機(jī)后,尤其在ext4 文件系統(tǒng)沒有加上data=ordered 選項(xiàng),出現(xiàn)這種現(xiàn)象。redis 宕機(jī)或者異常終止不會(huì)造成尾部不完整現(xiàn)象,可以選擇讓redis 退出,或者導(dǎo)入盡可能多的數(shù)據(jù)。如果選擇的是yes,當(dāng)截?cái)嗟腶of 文件被導(dǎo)入的時(shí)候, 會(huì)自動(dòng)發(fā)布一個(gè)log 給客戶端然后load。如果是no,用戶必須手動(dòng)redis-check-aof 修復(fù)AOF 文件才可以。默認(rèn)值為yes。 |
AOF 數(shù)據(jù)恢復(fù)
重啟Redis 之后就會(huì)進(jìn)行AOF 文件的恢復(fù)。
AOF 優(yōu)勢(shì)與劣勢(shì)
優(yōu)點(diǎn):
1、AOF 持久化的方法提供了多種的同步頻率,即使使用默認(rèn)的同步頻率每秒同步一次,Redis 最多也就丟失1 秒的數(shù)據(jù)而已。
缺點(diǎn):
1、對(duì)于具有相同數(shù)據(jù)的的Redis,AOF 文件通常會(huì)比RDF 文件體積更大(RDB存的是數(shù)據(jù)快照)。
2、雖然AOF 提供了多種同步的頻率,默認(rèn)情況下,每秒同步一次的頻率也具有較高的性能。在高并發(fā)的情況下,RDB 比AOF 具好更好的性能保證。
兩種方案比較
那么對(duì)于AOF 和RDB 兩種持久化方式,我們應(yīng)該如何選擇呢?
如果可以忍受一小段時(shí)間內(nèi)數(shù)據(jù)的丟失,毫無疑問使用RDB 是最好的,定時(shí)生成RDB 快照(snapshot)非常便于進(jìn)行數(shù)據(jù)庫(kù)備份, 并且RDB 恢復(fù)數(shù)據(jù)集的速度也要比AOF 恢復(fù)的速度要快。
否則就使用AOF 重寫。但是一般情況下建議不要單獨(dú)使用某一種持久化機(jī)制,而是應(yīng)該兩種一起用,在這種情況下,當(dāng)redis 重啟的時(shí)候會(huì)優(yōu)先載入AOF 文件來恢復(fù)原始的數(shù)據(jù),因?yàn)樵谕ǔG闆r下AOF 文件保存的數(shù)據(jù)集要比RDB 文件保存的數(shù)據(jù)集要完整。
?
總結(jié)
以上是生活随笔為你收集整理的RDB 文件的优势和劣势的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis LRU 淘汰原理
- 下一篇: 分布式架构的分类