redis 持久化的兩種辦法:
1虑省、RDB
默認(rèn)忧饭、二進(jìn)制
- save :
同步、阻塞
- bgsave:
1)鳞骤、異步窒百、非阻塞 (fork() + copyonwrite)
2)、copyonwrite流程是怎樣的豫尽?假如沒(méi)有這種流程會(huì)怎樣?
fork()之后篙梢,kernel把父進(jìn)程中所有的內(nèi)存頁(yè)的權(quán)限都設(shè)為read-only,然后子進(jìn)程的地址空間指向父進(jìn)程美旧。當(dāng)父子進(jìn)程都只讀內(nèi)存時(shí)渤滞,相安無(wú)事。當(dāng)其中某個(gè)進(jìn)程寫(xiě)內(nèi)存時(shí)榴嗅,CPU硬件檢測(cè)到內(nèi)存頁(yè)是read-only的妄呕,于是觸發(fā)頁(yè)異常中斷(page-fault),陷入kernel的一個(gè)中斷例程嗽测。中斷例程中绪励,kernel就會(huì)把觸發(fā)的異常的頁(yè)復(fù)制一份,于是父子進(jìn)程各自持有獨(dú)立的一份唠粥。
3)疏魏、Redis中的CopyOnWrite
Redis在持久化時(shí),如果是采用BGSAVE命令或者BGREWRITEAOF的方式晤愧,那Redis會(huì)fork出一個(gè)子進(jìn)程來(lái)讀取數(shù)據(jù)大莫,從而寫(xiě)到磁盤(pán)中。
總體來(lái)看官份,Redis還是讀操作比較多只厘。如果子進(jìn)程存在期間,發(fā)生了大量的寫(xiě)操作贯吓,那可能就會(huì)出現(xiàn)很多的分頁(yè)錯(cuò)誤(頁(yè)異常中斷page-fault)懈凹,這樣就得耗費(fèi)不少性能在復(fù)制上蜀变。
而在rehash階段上悄谐,寫(xiě)操作是無(wú)法避免的。所以Redis在fork出子進(jìn)程之后库北,將負(fù)載因子閾值提高爬舰,盡量減少寫(xiě)操作,避免不必要的內(nèi)存寫(xiě)入操作寒瓦,最大限度地節(jié)約內(nèi)存情屹。
- 自動(dòng)觸發(fā)
“save m n”。表示m秒內(nèi)數(shù)據(jù)集存在n次修改時(shí)杂腰,自動(dòng)觸發(fā)bgsave
優(yōu)勢(shì):
全量垃你、適合災(zāi)備的快速恢復(fù)
劣勢(shì):
可能丟失數(shù)據(jù)(備份期間的修改不會(huì)被保存)
2、AOF
appenofaof、追加寫(xiě)惜颇、寫(xiě)命令
具體實(shí)現(xiàn):aof持久化打開(kāi)后皆刺,服務(wù)器在執(zhí)行完一個(gè)命令后,會(huì)以協(xié)議格式將命令追加到aof緩沖區(qū)末尾凌摄,然后根據(jù)flushAppendOnlyFile函數(shù)去執(zhí)行策略(具體策略根據(jù)配置決定)
- always(每個(gè)時(shí)間循環(huán)都會(huì)將aof緩沖寫(xiě)入并同步aof文件)
- everysec(每個(gè)時(shí)間循環(huán)都會(huì)將aof緩沖寫(xiě)步aof文件羡蛾,如果上次同步時(shí)間距當(dāng)前超過(guò)一秒,則進(jìn)行同步锨亏,并且 這個(gè)操作由一個(gè)線程專(zhuān)門(mén)執(zhí)行)
- no (每個(gè)時(shí)間循環(huán)都會(huì)將aof緩沖寫(xiě)入aof文件痴怨,但不同步,所以故障會(huì)丟失)
(上述的同步即保存)
重寫(xiě)原理
在AOF文件文件越來(lái)越大時(shí)器予,使用bgrewriteaof
重寫(xiě)aof文件:將全庫(kù)數(shù)據(jù)以命令方式寫(xiě)入aof文件浪藻,類(lèi)似快照(原aof文件,每行數(shù)據(jù)可能因?yàn)槎啻涡薷那瑁嬖诙鄠€(gè)aof修改記錄珠移,因此才去壓縮命令、計(jì)算過(guò)期時(shí)間等aof比原來(lái)的文件要心┤凇)
重寫(xiě)期間數(shù)據(jù)不一致的問(wèn)題
原因: 子進(jìn)程單獨(dú)讀寫(xiě)钧惧,父進(jìn)程此時(shí)對(duì)數(shù)據(jù)有更新,就會(huì)導(dǎo)致寫(xiě)完的aof文件與數(shù)據(jù)庫(kù)狀態(tài)不一致問(wèn)題
解決方案:
Redis設(shè)置了一個(gè)緩沖區(qū)勾习,寫(xiě)aof緩沖區(qū)時(shí)浓瞪,同時(shí)寫(xiě)aof重寫(xiě)緩沖區(qū),等aof文件寫(xiě)完后巧婶,子進(jìn)程再給父進(jìn)程發(fā)送個(gè)信號(hào)乾颁,父進(jìn)程將重寫(xiě)緩沖區(qū)中的內(nèi)容寫(xiě)入aof文件,并原子的覆蓋艺栈。使得aof文件和數(shù)據(jù)庫(kù)狀態(tài)保持了一致英岭。
優(yōu)點(diǎn):
數(shù)據(jù)不易丟失,尤其everysec
追加寫(xiě)湿右、無(wú)磁盤(pán)尋址開(kāi)銷(xiāo)
可讀性高诅妹、適合做緊急的災(zāi)后恢復(fù)
缺點(diǎn):
同一份數(shù)據(jù),aof比rdb要大
aof恢復(fù)比rdb要慢
注:部分內(nèi)容源自《redis設(shè)計(jì)與實(shí)現(xiàn)》