RDB
RDB持久化是把當(dāng)前進(jìn)程數(shù)據(jù)生成快照保存到硬盤(pán)的過(guò)程
- 觸發(fā)機(jī)制
手動(dòng)觸發(fā)save命令,阻塞當(dāng)前Redis服務(wù)器,直到RDB過(guò)程完成為止
手動(dòng)觸發(fā)bgsave命令,Redis進(jìn)程執(zhí)行fork操作創(chuàng)建子進(jìn)程,RDB持久化過(guò)程由子進(jìn)程負(fù)責(zé),完成后自動(dòng)結(jié)束。阻塞只發(fā)生在fork階段,一般時(shí)間很短。
自動(dòng)觸發(fā)save m n表示m秒內(nèi)數(shù)據(jù)集存在n次修改時(shí),自動(dòng)觸發(fā)bgsave。
如果從節(jié)點(diǎn)執(zhí)行全量復(fù)制操作,主節(jié)點(diǎn)自動(dòng)執(zhí)行bgsave生成RDB文件并發(fā)送給從節(jié)點(diǎn)
執(zhí)行debug reload命令重新加載Redis時(shí),也會(huì)自動(dòng)觸發(fā)save操作。
默認(rèn)情況下執(zhí)行shutdown命令時(shí),如果沒(méi)有開(kāi)啟AOF持久化功能則自動(dòng)執(zhí)行bgsave。
-
流程說(shuō)明
bgsave命令的運(yùn)作流程 - RDB文件的處理
保存:RDB文件保存在dir配置指定的目錄下,文件名通過(guò)dbfilename配置指定??梢酝ㄟ^(guò)執(zhí)行config set dir{newDir}和config setdbfilename{newFileName}運(yùn)行期動(dòng)態(tài)執(zhí)行,當(dāng)下次運(yùn)行時(shí)RDB文件會(huì)保存到新目錄。
壓縮:Redis默認(rèn)采用LZF算法對(duì)生成的RDB文件做壓縮處理,壓縮后的文件遠(yuǎn)遠(yuǎn)小于內(nèi)存大小,默認(rèn)開(kāi)啟,可以通過(guò)參數(shù)config set rdbcompression{yes|no}動(dòng)態(tài)修改。
校驗(yàn):如果Redis加載損壞的RDB文件時(shí)拒絕啟動(dòng),可以使用Redis提供的redis-check-dump工具檢測(cè)RDB文件并獲取對(duì)應(yīng)的錯(cuò)誤報(bào)告。
優(yōu)點(diǎn):
- RDB是一個(gè)緊湊壓縮的二進(jìn)制文件,代表Redis在某個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)快照。非常適用于備份,全量復(fù)制等場(chǎng)景。比如每6小時(shí)執(zhí)行bgsave備份,并把RDB文件拷貝到遠(yuǎn)程機(jī)器或者文件系統(tǒng)中(如hdfs),用于災(zāi)難恢復(fù)。
- Redis加載RDB恢復(fù)數(shù)據(jù)遠(yuǎn)遠(yuǎn)快于AOF的方式。
RDB的缺點(diǎn):
- RDB方式數(shù)據(jù)沒(méi)辦法做到實(shí)時(shí)持久化/秒級(jí)持久化。因?yàn)閎gsave每次運(yùn)行都要執(zhí)行fork操作創(chuàng)建子進(jìn)程,屬于重量級(jí)操作,頻繁執(zhí)行成本過(guò)高。
- RDB文件使用特定二進(jìn)制格式保存,Redis版本演進(jìn)過(guò)程中有多個(gè)格式的RDB版本,存在老版本Redis服務(wù)無(wú)法兼容新版RDB格式的問(wèn)題。
AOF
開(kāi)啟AOF功能需要設(shè)置配置:appendonly yes,默認(rèn)不開(kāi)啟。

1)所有的寫(xiě)入命令會(huì)追加到aof_buf(緩沖區(qū))中。
2)AOF緩沖區(qū)根據(jù)對(duì)應(yīng)的策略向硬盤(pán)做同步操作。
3)隨著AOF文件越來(lái)越大,需要定期對(duì)AOF文件進(jìn)行重寫(xiě),達(dá)到壓縮的目的。
4)當(dāng)Redis服務(wù)器重啟時(shí),可以加載AOF文件進(jìn)行數(shù)據(jù)恢復(fù)。
文件同步:
AOF緩沖區(qū)同步文件策略
配置為everysec,是建議的同步策略,也是默認(rèn)配置,做到兼顧性能和數(shù)據(jù)安全性。理論上只有在系統(tǒng)突然宕機(jī)的情況下丟失1秒的數(shù)據(jù)。
重寫(xiě)機(jī)制
隨著命令不斷寫(xiě)入AOF,文件會(huì)越來(lái)越大,為了解決這個(gè)問(wèn)題,Redis引入AOF重寫(xiě)機(jī)制壓縮文件體積。
AOF重寫(xiě)過(guò)程可以手動(dòng)觸發(fā)和自動(dòng)觸發(fā):
- 手動(dòng)觸發(fā):直接調(diào)用bgrewriteaof命令。
- 自動(dòng)觸發(fā):根據(jù)auto-aof-rewrite-min-size和auto-aof-rewrite-percentage參數(shù)確定自動(dòng)觸發(fā)時(shí)機(jī)。
1.auto-aof-rewrite-min-size:表示運(yùn)行AOF重寫(xiě)時(shí)文件最小體積,默認(rèn)為64MB。
2.auto-aof-rewrite-percentage:代表當(dāng)前AOF文件空間(aof_current_size)和上一次重寫(xiě)后AOF文件空間(aof_base_size)的比值。
自動(dòng)觸發(fā)時(shí)機(jī)=aof_current_size>auto-aof-rewrite-minsize&&(aof_current_size-aof_base_size)/aof_base_size>=
auto-aof-rewritepercentage

重啟加載

文件校驗(yàn)
對(duì)于錯(cuò)誤格式的AOF文件,先進(jìn)行備份,然后采用redis-check-aof--fix命令進(jìn)行修復(fù),修復(fù)后使用diff-u對(duì)比數(shù)據(jù)的差異,找出丟失的數(shù)據(jù).
問(wèn)題定位與優(yōu)化
- 改善fork操作
1)優(yōu)先使用物理機(jī)或者高效支持fork操作的虛擬化技術(shù),避免使用Xen。
2)控制Redis實(shí)例最大可用內(nèi)存,fork耗時(shí)跟內(nèi)存量成正比,線上建議每個(gè)Redis實(shí)例內(nèi)存控制在10GB以內(nèi)。
3)合理配置Linux內(nèi)存分配策略,避免物理內(nèi)存不足導(dǎo)致fork失敗
4)降低fork操作的頻率,如適度放寬AOF自動(dòng)觸發(fā)時(shí)機(jī),避免不必要的全量復(fù)制等。 - 子進(jìn)程開(kāi)銷監(jiān)控和優(yōu)化
1.CPU,不要做綁定單核CPU操作,不要和其他CPU密集型服務(wù)部署在一起,造成CPU過(guò)度競(jìng)爭(zhēng),部署多個(gè)Redis實(shí)例,盡量保證同一時(shí)刻只有一個(gè)子進(jìn)程執(zhí)行重寫(xiě)工作.
2.內(nèi)存
1)同CPU優(yōu)化一樣,如果部署多個(gè)Redis實(shí)例,盡量保證同一時(shí)刻只有一個(gè)子進(jìn)程在工作。
2)避免在大量寫(xiě)入時(shí)做子進(jìn)程重寫(xiě)操作,這樣將導(dǎo)致父進(jìn)程維護(hù)大量頁(yè)副本,造成內(nèi)存消耗。
3.硬盤(pán)
a)不要和其他高硬盤(pán)負(fù)載的服務(wù)部署在一起。如:存儲(chǔ)服務(wù)、消息隊(duì)列服務(wù)等。
b)AOF重寫(xiě)時(shí)會(huì)消耗大量硬盤(pán)IO,可以開(kāi)啟配置no-appendfsync-onrewrite,默認(rèn)關(guān)閉。表示在AOF重寫(xiě)期間不做fsync操作。
c)當(dāng)開(kāi)啟AOF功能的Redis用于高流量寫(xiě)入場(chǎng)景時(shí),如果使用普通機(jī)械磁盤(pán),寫(xiě)入吞吐一般在100MB/s左右,這時(shí)Redis實(shí)例的瓶頸主要在AOF同步硬盤(pán)上。
d)對(duì)于單機(jī)配置多個(gè)Redis實(shí)例的情況,可以配置不同實(shí)例分盤(pán)存儲(chǔ)AOF文件,分?jǐn)傆脖P(pán)寫(xiě)入壓力。 -
AOF追加阻塞
使用everysec做刷盤(pán)策略的流程
因?yàn)锳OF線程負(fù)責(zé)每秒執(zhí)行一次同步磁盤(pán)操作,超過(guò)兩秒就會(huì)使主線程阻塞.
1.發(fā)生AOF阻塞時(shí),Redis輸出日志,用于記錄AOF fsync阻塞導(dǎo)致拖慢Redis服務(wù)的行為
2.每當(dāng)發(fā)生AOF追加阻塞事件發(fā)生時(shí),在info Persistence統(tǒng)計(jì)中,aof_delayed_fsync指標(biāo)會(huì)累加,查看這個(gè)指標(biāo)方便定位AOF阻塞問(wèn)題。
3.AOF同步最多允許2秒的延遲,當(dāng)延遲發(fā)生時(shí)說(shuō)明硬盤(pán)存在高負(fù)載問(wèn)題,可以通過(guò)監(jiān)控工具如iotop,定位消耗硬盤(pán)IO資源的進(jìn)程。
多實(shí)例部署

1)外部程序定時(shí)輪詢監(jiān)控機(jī)器(machine)上所有Redis實(shí)例。
2)對(duì)于開(kāi)啟AOF的實(shí)例,查看(aof_current_sizeaof_base_size)/aof_base_size確認(rèn)增長(zhǎng)率。
3)當(dāng)增長(zhǎng)率超過(guò)特定閾值(如100%),執(zhí)行bgrewriteaof命令手動(dòng)觸發(fā)當(dāng)前實(shí)例的AOF重寫(xiě)。
4)運(yùn)行期間循環(huán)檢查aof_rewrite_in_progress和aof_current_rewrite_time_sec指標(biāo),直到AOF重寫(xiě)結(jié)束。
5)確認(rèn)實(shí)例AOF重寫(xiě)完成后,再檢查其他實(shí)例并重復(fù)2)~4)步操作。從而保證機(jī)器內(nèi)每個(gè)Redis實(shí)例AOF重寫(xiě)串行化執(zhí)行。


