1 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
RDB的問(wèn)題
1:fork
一個(gè)進(jìn)程時(shí),內(nèi)存的數(shù)據(jù)也被復(fù)制了,即內(nèi)存會(huì)是原來(lái)的兩倍
2:每次快照持久化都是將內(nèi)存數(shù)據(jù)完整寫(xiě)入到磁盤(pán)一次,并不是增量的只同步臟數(shù)據(jù)。
如果數(shù)據(jù)量大的話,而且寫(xiě)操作比較多,必然會(huì)引起大量的磁盤(pán)io操作,可能會(huì)嚴(yán)重影響性能。
3:由于快照方式是在一定間隔時(shí)間做一次的,所以如果redis意外down掉的話,就會(huì)丟失最后一次快照后的所有修改。
觸發(fā)快照的情況
1:根據(jù)配置規(guī)則進(jìn)行自動(dòng)快照
2:用戶(hù)執(zhí)行save或bgsave命令
3:執(zhí)行flushall命令
4:執(zhí)行復(fù)制replication時(shí)
save命令執(zhí)行
Save命令時(shí),Redis會(huì)阻塞所有客戶(hù)端的請(qǐng)求,然后同步進(jìn)行快照操作。
bgsave命令
執(zhí)行bgsave命令時(shí),Redis會(huì)在后臺(tái)異步進(jìn)行快照操作,快照同時(shí)還可以響應(yīng)客戶(hù)端請(qǐng)求??梢酝ㄟ^(guò)lastsave命令獲取最后一次成功執(zhí)行快照的時(shí)間。
flushall命令
這個(gè)命令會(huì)導(dǎo)致redis清除內(nèi)存中的所有數(shù)據(jù),如果定義了自動(dòng)快照的條件,那么無(wú)論是否滿(mǎn)足條件,都會(huì)進(jìn)行一次快照操作;如果沒(méi)有定義自動(dòng)快照的條件,那么就不執(zhí) 行快照
AOF的問(wèn)題
默認(rèn)的AOF持久化策略是每秒鐘fsync一次,fsync是指把緩存中的寫(xiě)指令記錄到磁盤(pán)中,
在這種情況下,redis扔可以保持很高的性能
當(dāng)然由于OS會(huì)在內(nèi)核中緩存write做的修改,所以可能不是立即寫(xiě)到磁盤(pán)上。
這樣aof方式的持久化也還是有可能會(huì)丟失部分修改。不過(guò)可以通過(guò)配置文件告訴redis,想要通過(guò)fsync函數(shù)強(qiáng)制os寫(xiě)入磁盤(pán)的時(shí)機(jī)
AOF方式在同等數(shù)據(jù)規(guī)模的情況下,AOF文件要比RDB文件的體積大,因此AOF方式的恢復(fù)速度也要慢于RDB方式
AOF日志恢復(fù)
如果在追加日志時(shí),恰好遇到磁盤(pán)空間滿(mǎn)或斷電等情況,導(dǎo)致日志寫(xiě)入不完整,也沒(méi)有關(guān)系,
redis提供了redis-check-aof工具,可以用來(lái)進(jìn)行日志修復(fù),基本步驟如下:
1、備份被寫(xiě)壞的AOF文件
2、運(yùn)行redis-check-aof -fix進(jìn)行修復(fù)
3、用diff -u來(lái)看下兩個(gè)文件的差異,確認(rèn)問(wèn)題點(diǎn)
4、重啟redis,加載修復(fù)后的AOF文件
AOF重寫(xiě)
AOF采用文件追加方式,這樣會(huì)導(dǎo)致AOF文件越來(lái)越大,為此,redis提供了AOF文件重寫(xiě)(rewrite)機(jī)制,即當(dāng)AOF文件的大小超過(guò)所
設(shè)定的閾(yu)值時(shí),redis就會(huì)啟動(dòng)AOF文件的內(nèi)容壓縮,只保留可以恢復(fù)數(shù)據(jù)的最小指令集??梢允褂妹頱grewriteaof.
本回答由網(wǎng)友推薦
- 1 回答
- 0 關(guān)注
- 741 瀏覽
添加回答
舉報(bào)