上一篇文章介紹了FastCFS采用數(shù)據(jù)分組的做法,一個數(shù)據(jù)分組的幾個節(jié)點(如三個節(jié)點即三副本)之間是Master/Slave關(guān)系;FastCFS采用數(shù)據(jù)強(qiáng)一致模型,通過Master/Slave結(jié)構(gòu)的同步復(fù)制機(jī)制來保證數(shù)據(jù)一致性,本文將概要介紹這一機(jī)制的原理和關(guān)鍵點。
和單機(jī)系統(tǒng)相比,分布式系統(tǒng)因網(wǎng)絡(luò)通信方面存在較大不確定性,要做到數(shù)據(jù)強(qiáng)一致的挑戰(zhàn)非常大。業(yè)界分布式系統(tǒng)主流做法是采用BASE理論,有意避開數(shù)據(jù)強(qiáng)一致性這個難題。BASE理論是Basically Available(基本可用),Soft State(軟狀態(tài)或中間狀態(tài))和Eventually Consistent(最終一致性)三個短語的縮寫。BASE理論比較偏工程實踐,見文知意,需要進(jìn)一步了解的朋友自行腦補(bǔ)。
采用Master/Slave結(jié)構(gòu),保證數(shù)據(jù)強(qiáng)一致的邏輯很簡單。client的更新操作只能由Master處理,然后master同步調(diào)用slave轉(zhuǎn)發(fā)該請求。FastCFS中master可以并發(fā)請求多個slave,因此client的響應(yīng)時間和slave數(shù)目(副本數(shù))并不是線性關(guān)系。master只會對在線(ACTIVE)的slave發(fā)起同步調(diào)用,那么slave因重啟服務(wù)或網(wǎng)絡(luò)通信異常導(dǎo)致掉線(OFFLINE),F(xiàn)astCFS是如何處理的呢?OFFLINE狀態(tài)的slave會進(jìn)入數(shù)據(jù)恢復(fù)(追加數(shù)據(jù))階段,追上master的最新數(shù)據(jù)后,方可切換為ACTIVE狀態(tài)。為了確保平滑切換,引入了ONLINE這一中間狀態(tài)。
有朋友就說了,上面的同步復(fù)制方式很簡單直接嘛,并沒有多么高深的地方。嗯,簡單的往往就是最有效的。有挑戰(zhàn)的地方不在方案的復(fù)雜性,而在于工程實現(xiàn)。在保證數(shù)據(jù)一致性前提下,數(shù)據(jù)同步復(fù)制方案的兩大關(guān)鍵點:維護(hù)精準(zhǔn)的集群狀態(tài)和slave狀態(tài)平滑切換。
FastCFS引入leader/follower這一機(jī)制來維護(hù)精準(zhǔn)的集群狀態(tài)。leader通過選舉產(chǎn)生,follower和leader建立連接并每秒報告其自身狀態(tài)(磁盤空間、數(shù)據(jù)版本號等)。當(dāng)集群狀態(tài)發(fā)生變化時,如master切換、slave狀態(tài)變化等,leader會立即將變動消息推送給所有follower。借助zookeeper或者etcd也可以實現(xiàn)同樣的功能,為什么要自造輪子呢?原因有二:一、自主可控,減少依賴;二、簡單高效,避免臃腫。
分布式系統(tǒng)在保證數(shù)據(jù)強(qiáng)一致性的前提下,還要做到高可用和高性能,挑戰(zhàn)非常大。為了做到這一點,還有一個最為關(guān)鍵的地方,下一篇文章將為你揭曉。
|