圖2-24是Megastore的基本架構,最底層的數(shù)據(jù)是存儲在Bigtable中的。不同類型的副本存儲不同的數(shù)據(jù)。在Megastore中巧有三種副本,分別是完整副本(Full Replica)、 見證者副本(Witness Replica)和只讀副本(Read-only Replica)。圖2-24中出現(xiàn)了兩種副本,分別是完整副本A和B,以及見證者副本C。對于完整副本,Bigtable中存儲完整的日志和數(shù)據(jù)。見證者副本的作用是在Paxos算法執(zhí)行過程中無法產生一個決議時參與投票,因此對于這種副本,Bigtable只存儲其日志而不存儲具體數(shù)據(jù)。最后一種只讀副本和見證者副本恰恰相反,它們無法參與投票。它們的作用只是讀取到最近過去某一個時間點的一致性數(shù)據(jù)。如果讀操作能夠容忍這些過期數(shù)據(jù),只讀副本能夠在不加劇寫延遲的情況下將數(shù)據(jù)在較大的地理空間上進行傳輸。

Megastore的部署需要通過一個客戶端函數(shù)庫和若干的服務器。應用程序連接到這個客戶端函數(shù)庫,這個函數(shù)庫執(zhí)行Paxos算法。圖2-24中還有一個稱為協(xié)調者的服務,要想理解這個服務的作用,首先來了解下Megastore中提供的快速讀(Fast Reads)和快速寫 (FastWrites)機制。
1.快速讀
如果讀操作不需要副本之間進行通信即可完成,那么讀取的效率必然相對較高。由于寫操作基本上能在所有的副本上成功,一旦成功認為該副本上的數(shù)據(jù)都是相同的且是最新的,就能利用本地讀?。↙ocal Reads)實現(xiàn)快速讀,能夠帶來更好的用戶體驗及更 低的延遲。確??焖僮x成功的關鍵是保證選擇的副本上數(shù)據(jù)是最新的。為了達到這一目標,設計團隊引入了協(xié)調者的概念。協(xié)調者是一個服務,該服務分布在每個副本的數(shù)據(jù)中心里面。它的主要作用就是跟蹤一個實體組集合,集合中的實體組需要具備的條件就 是它們的副本已經(jīng)觀察到了所有的Paxos寫。只要出現(xiàn)在這個集合中的實體組,它們的副本就都能夠進行本地讀取,也就是說能夠實現(xiàn)快速讀。協(xié)調者的狀態(tài)是由寫算法來保證。
2.快速寫
為了達到快速的單次交互的寫操作,Megastore釆用了一種在主/從式系統(tǒng)中常用的優(yōu)化方法。如果一次寫成功,那么下一次寫的時候就跳過準備過程,直接進入接受階段。因為一次成功的寫意味著也準確地獲知了下一個日志的位置,所以不再需要準備階段。 Megastore沒有使用專門的主服務器,而是使用leaders。系統(tǒng)在每一個日志位置都運行一個Paxos算法實例。leader主要是來裁決哪個寫入的值可以獲取0號提議。第一個將值提交給leader的可以獲得一個向所有副本請求接收這個值作為0號提議最終值的機會。其他的值就需要重新使用Paxos算法。
由于寫入者在提交值給其他副本之前必須要和leader通信,為了盡可能地減少延遲, Megastore做了一個簡單的優(yōu)化,即在提交值最多的位置附近選擇一個副本作為leader。
客戶端、網(wǎng)絡及Bigtable的故障都會導致一個寫操作處于不確定的狀態(tài)。圖2-24中的復制服務器會定期掃描未完成的寫入并且通過Paxos算法提議沒有操作的值(No-op Values)來讓寫入完成。