概述:對(duì)于內(nèi)存級(jí)的KV數(shù)據(jù)庫(kù)來說,將數(shù)據(jù)定時(shí)持久化到磁盤時(shí)一個(gè)必要的操作,因?yàn)橐坏嚯娀騞own機(jī),就可能導(dǎo)致存儲(chǔ)在內(nèi)存中的數(shù)據(jù)丟失,顯然這不是我們能接受的,對(duì)于kv數(shù)據(jù)庫(kù)來說,我們用得最多的無非就是memcached、TT 、etcd、redis等,而對(duì)于redis來說,相信目前已是it項(xiàng)目中使用最常見的緩存KV數(shù)據(jù)庫(kù)了。那么它有什么策略實(shí)現(xiàn)數(shù)據(jù)的持久化操作呢? 下面就一起來看看吧。
Redis有兩種持久化方式,分別是RDB和AOF , 其中rdb是以間隔時(shí)間內(nèi)定義key變化操作數(shù)來觸發(fā)數(shù)據(jù)持久化;而oaf是以配置持久化區(qū)間來操作持久化動(dòng)作。
RDB持久化:(默認(rèn)持久化方式)
在指定時(shí)間間隔內(nèi),將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤,恢復(fù)時(shí)是將快照文件直接讀到內(nèi)存中,來達(dá)到恢復(fù)數(shù)據(jù)的。在默認(rèn)情況下, Redis 將數(shù)據(jù)庫(kù)快照保存在名字為 dump.rdb 的二進(jìn)制文件中。通過觸發(fā)快照的形式,來做到將指定時(shí)間間隔內(nèi)的數(shù)據(jù)持久化到dump.rdb。
RDB持久化的redis.conf 配置項(xiàng):
save 900 1
save 300 10
save 60 1000
RDB優(yōu)點(diǎn)與缺點(diǎn):
rdb是保存一個(gè)文件,顯然恢復(fù)時(shí)會(huì)方便快速,另外是觸發(fā)機(jī)制類型,明顯寫入磁盤不會(huì)太頻繁; 但缺點(diǎn)也很明顯,在數(shù)據(jù)要求可靠性和一致性很高時(shí),存在數(shù)據(jù)丟失的情況,原因是rdb使用的是間斷性或階段性的觸發(fā)式持久化,可能會(huì)數(shù)據(jù)沒持久化前故障,導(dǎo)致數(shù)據(jù)丟失。
AOF持久化 (默認(rèn)不開啟)
以日志的形式記錄Redis每一個(gè)寫操作,將Redis執(zhí)行過的所有寫指令記錄下來(讀操作不記錄),只許追加文件不可以改寫文件,redis啟動(dòng)之后會(huì)讀取Appendonly.aof文件來實(shí)現(xiàn)重新恢復(fù)數(shù)據(jù),完成恢復(fù)數(shù)據(jù)的工作。默認(rèn)不開啟,需要將redis.conf中的appendonly no改為yes后,重新啟動(dòng)Redis。
AOF持久化的redis.conf 開啟配置項(xiàng)目 :
appendonly yes
AOF持久化策略方式:
appendfsync always:每修改同步,每一次發(fā)生數(shù)據(jù)變更都會(huì)持久化到磁盤上,性能較差,但數(shù)據(jù)完整性較好。
appendfsync everysec: 每秒同步,每秒內(nèi)記錄操作,異步操作,如果一秒內(nèi)宕機(jī),有數(shù)據(jù)丟失。
appendfsync no:不同步。
數(shù)據(jù)恢復(fù):
重啟Redis時(shí),如果dump.rdb與appendfsync.aof同時(shí)都存在時(shí),Redis會(huì)自動(dòng)讀取appendfsync.aof文件,通過該文件中對(duì)數(shù)據(jù)庫(kù)的日志操作,來實(shí)現(xiàn)數(shù)據(jù)的恢復(fù)。當(dāng)然如果該文件被破壞,我們可以通過redis-check-aof工具來修復(fù),如redis-check-aof --fix能修復(fù)破損的appendfsync.aof文件,當(dāng)然如果dump.rdb文件有破損,我們也可以用redis-check-rdb工具來修復(fù),如果appendfsync.aof文件破損了,是啟動(dòng)不了客戶端的,也就是無法完成數(shù)據(jù)的恢復(fù)。
AOF優(yōu)點(diǎn)與缺點(diǎn):
appendfsync always: 每修改同步,每一次發(fā)生數(shù)據(jù)變更都會(huì)持久化到磁盤上,性能較差,但數(shù)據(jù)完整性較好。
appendfsync everysec: 每秒同步,每秒內(nèi)記錄操作,異步操作,如果一秒內(nèi)宕機(jī),有數(shù)據(jù)丟失。
appendfsync no: 不同步。
appendfsync.aof文件要大于dump.rdb,如果aof同步文件持久化,會(huì)實(shí)時(shí)操作磁盤,因此會(huì)消耗一定的性能。 恢復(fù)速度方面aof會(huì)比rdb慢。
關(guān)于aof重寫機(jī)制:
當(dāng)AOF文件一直被追加,這就可能導(dǎo)致AOF文件過于龐大。因此,為了避免這種狀況,Redis新增了重寫機(jī)制,當(dāng)AOF文件的大小超過所指定的閾值時(shí),Redis會(huì)自動(dòng)啟用AOF文件的內(nèi)容壓縮,只保留可以恢復(fù)數(shù)據(jù)的最小指令集,可以使用命令bgrewiteaof。
觸發(fā)機(jī)制:Redis會(huì)記錄上一次重寫時(shí)的AOF大小,默認(rèn)配置是當(dāng)AOF文件大小是上一次的一倍并且大于64m時(shí),會(huì)觸發(fā)從寫機(jī)制。
例如配置:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb