單機(jī)系統(tǒng)故障恢復(fù)策略
在單機(jī)系統(tǒng)中,程序可能遭遇程序錯誤、崩潰等導(dǎo)致進(jìn)程終止。為了在系統(tǒng)重啟后恢復(fù)服務(wù)至先前狀態(tài),依賴于數(shù)據(jù)和日志的完整性。假設(shè)磁盤狀態(tài)良好,我們主要聚焦于操作的重現(xiàn)機(jī)制。
1. 操作日志
操作日志是數(shù)據(jù)庫(無論是關(guān)系型還是NoSQL)實現(xiàn)故障恢復(fù)的關(guān)鍵工具。
日志形式:關(guān)系型數(shù)據(jù)庫常采用UNDO/REDO日志,記錄事務(wù)的撤銷和重做信息。例如,事務(wù)T將記錄X的值從1改為3,則UNDO日志記錄為<T,X,1>,REDO日志為<T,X,3>,或合并記錄為<T,X,1,3>。NoSQL數(shù)據(jù)庫如Redis則使用AOF(Append On* File)文件記錄操作日志,具有獨特的日志格式。
性能優(yōu)化:對于性能敏感的系統(tǒng),頻繁寫入日志可能不是*選擇。此時,可采用批量提交策略,即累積一定數(shù)量的操作后再統(tǒng)一寫入日志。Redis提供了多種AOF寫入策略,包括每秒寫入一次,以平衡數(shù)據(jù)一致性和性能。
2. CheckPoint機(jī)制
隨著系統(tǒng)運(yùn)行時間的增長,操作日志可能變得龐大,僅依賴REDO日志進(jìn)行恢復(fù)將耗時過長。因此,引入CheckPoint機(jī)制,定期將內(nèi)存中的數(shù)據(jù)快照保存到磁盤上。這樣,在恢復(fù)時只需重放CheckPoint之后的REDO日志,顯著縮短恢復(fù)時間。Redis中的RDB持久化即實現(xiàn)了這一機(jī)制。
分布式系統(tǒng)故障恢復(fù)策略
分布式系統(tǒng)中,每個數(shù)據(jù)項擁有多個副本,故障恢復(fù)時可通過選舉新的主副本來繼續(xù)服務(wù)。根據(jù)故障類型(臨時性或*性),恢復(fù)策略有所不同。
- 臨時性故障:節(jié)點重新上線后,需從其他副本同步缺失的數(shù)據(jù),然后恢復(fù)服務(wù)。
- *性故障:需選擇新節(jié)點,復(fù)制現(xiàn)有副本數(shù)據(jù),成為新的副本節(jié)點。
此外,總控節(jié)點也可能故障,需通過強(qiáng)一致性的備機(jī)或選舉協(xié)議(如Paxos)來確保高可用性(HA)。
分布式系統(tǒng)故障探測
故障探測是分布式系統(tǒng)容錯處理的基礎(chǔ)。心跳包是常用的探測手段,但存在誤判風(fēng)險。為此,引入租約(Lease)機(jī)制以增強(qiáng)可靠性。
- 租約特性:包括授權(quán)、時限和續(xù)約??偪毓?jié)點向工作節(jié)點發(fā)放租約,工作節(jié)點在有效期內(nèi)提供服務(wù),并需定期續(xù)約。若續(xù)約失敗或超時,則視為故障,確保服務(wù)一致性。
- 超時判定:考慮節(jié)點間時鐘差異,總控節(jié)點在判定超時時會設(shè)置一定的放寬量,以避免誤判。
一致性問題
分布式系統(tǒng)面臨的*挑戰(zhàn)之一是保持?jǐn)?shù)據(jù)一致性。后續(xù)將深入探討解決一致性問題的經(jīng)典分布式協(xié)議。