|
在分布式算法領(lǐng)域,有個(gè)非常重要的算法叫Paxos, 它的重要性有多高呢,Google的Chubby [1]中提到
關(guān)于Paxos算法的詳述在維基百科中有更多介紹,中文版介紹的是choose value的規(guī)則[2],英文版介紹的是Paxos 3 phase commit的流程[3],中文版不是從英文版翻譯而是獨(dú)立寫的,所以非常具有互補(bǔ)性。Paxos算法是由Leslie Lamport提出的,他在Paxos Made Simple[4]中寫道
當(dāng)你研究了很長一段時(shí)間Paxos算法還是有點(diǎn)迷糊的時(shí)候,看到上面這句話可能會(huì)有點(diǎn)沮喪。但是公認(rèn)的它的算法還是比較繁瑣的,尤其是要用程序員嚴(yán)謹(jǐn)?shù)乃季S將所有細(xì)節(jié)理清的時(shí)候,你的腦袋里更是會(huì)充滿了問號(hào)。Leslie Lamport也是用了長達(dá)9年的時(shí)間來完善這個(gè)算法的理論。 實(shí)際上對(duì)于一般的開發(fā)人員,我們并不需要了解Paxos所有細(xì)節(jié)及如何實(shí)現(xiàn),只需要知道Paxos是一個(gè)分布式選舉算法就夠了。本文主要介紹一下Paxos常用的應(yīng)用場(chǎng)合,或許有一天當(dāng)你的系統(tǒng)增大到一定規(guī)模,你知道有這樣一個(gè)技術(shù),可以幫助你正確及優(yōu)雅的解決技術(shù)架構(gòu)上一些難題。 1. database replication, log replication等, 如bdb的數(shù)據(jù)復(fù)制就是使用paxos兼容的算法。Paxos最大的用途就是保持多個(gè)節(jié)點(diǎn)數(shù)據(jù)的一致性。 2. naming service, 如大型系統(tǒng)內(nèi)部通常存在多個(gè)接口服務(wù)相互調(diào)用。 3.config配置管理 4.membership用戶角色/access control list, 比如在權(quán)限設(shè)置中,用戶一旦設(shè)置某項(xiàng)權(quán)限比如由管理員變成普通身份,這時(shí)應(yīng)在所有的服務(wù)器上所有遠(yuǎn)程CDN立即生效,否則就會(huì)導(dǎo)致不能接受的后果。 5. 號(hào)碼分配。通常簡單的解決方法是用數(shù)據(jù)庫自增ID, 這導(dǎo)致數(shù)據(jù)庫切分困難,或程序生成GUID, 這通常導(dǎo)致ID過長。更優(yōu)雅的做法是利用paxos算法在多臺(tái)replicas之間選擇一個(gè)作為master, 通過master來分配號(hào)碼。當(dāng)master發(fā)生故障時(shí),再用paxos選擇另外一個(gè)master。 這里列舉了一些常見的Paxos應(yīng)用場(chǎng)合,對(duì)于類似上述的場(chǎng)合,如果用其它解決方案,一方面不能提供自動(dòng)的高可用性方案,同時(shí)也遠(yuǎn)遠(yuǎn)沒有Paxos實(shí)現(xiàn)簡單及優(yōu)雅。 Yahoo!開源的ZooKeeper [5]是一個(gè)開源的類Paxos實(shí)現(xiàn)。它的編程接口看起來很像一個(gè)可提供強(qiáng)一致性保證的分布式小文件系統(tǒng)。對(duì)上面所有的場(chǎng)合都可以適用。但可惜的是,ZooKeeper并不是遵循Paxos協(xié)議,而是基于自身設(shè)計(jì)并優(yōu)化的一個(gè)2 phase commit的協(xié)議,因此它的理論[6]并未經(jīng)過完全證明。但由于ZooKeeper在Yahoo!內(nèi)部已經(jīng)成功應(yīng)用在HBase, Yahoo! Message Broker, Fetch Service of Yahoo! crawler等系統(tǒng)上,因此完全可以放心采用。 另外選擇Paxos made live [7]中一段實(shí)現(xiàn)體會(huì)作為結(jié)尾。
這里要補(bǔ)充一個(gè)背景,就是要證明分布式容錯(cuò)算法的正確性通常比實(shí)現(xiàn)算法還困難,Google沒法證明Chubby是可靠的,Yahoo!也不敢保證它的ZooKeeper理論正確性。大部分系統(tǒng)都是靠在實(shí)踐中運(yùn)行很長一段時(shí)間才能謹(jǐn)慎的表示,目前系統(tǒng)已經(jīng)基本沒有發(fā)現(xiàn)大的問題了。 Resources |
|
|