Google Spanner

分佈式系統有各類定義,我的理解:擁有一個以上的時序即爲分佈式系統。

傳統系統,也就是圖靈機或者馮諾依曼計算機,只有一個時序。
圖靈機是串行系統,全部事件順序發生。
馮式計算機做爲圖靈機的具體實現,經過惟一時鐘發生頻率,每Tick裏只完成單個事件,也只有一個時序。

單時序系統的優勢是簡單可控,經過惟一時序操做數據,能夠保證因果固定性,一樣的操做必然產生一樣的結果,也就是邏輯可控。

單時序系統的自然缺陷是吞吐量的制約。
爲了在單時序系統上提升吞吐量,咱們不停提升工業精度,但愈來愈困難:摩爾定律失效,磁錄密度增長緩慢,等等。
世界自己是併發的,咱們用串行手段來數字化世界,註定走不遠。

分佈式系統經過集成多個單時序系統,用併發來解決吞吐量問題,這是有效的方法,目前超級計算機都是經過併發來提升性能。

多時序系統帶來的問題是:如何讓內部的每一個單時序系統看到的數據都經歷了一樣順序的操做?保證這一點才能保證因果一致。

這就是一般說的一致性問題,有人覺得一致性是指「數據都同樣」,這是不精確的。
一致性有不少個級別,「每時每刻數據都同樣」是最高的理想狀態,「若是沒有新操做,各單時序系統的數據將在一段時間後達成一致」是最低的保證,也就是最終一致性。
不能保證最終一致性的系統,就不能保證固定的因果邏輯,就會出問題。

提供最簡單的數據一致性的系統架構是咱們最經常使用的單點提交系統,也就是以某個固定的單時序系統爲準繩,數據向其提交完畢纔算當次操做完成。
好比大多數網站應用,數據以進入數據庫爲準。

這種簡單方案的問題和單時序系統同樣,數據須要在準繩系統上串行操做,吞吐量仍舊受制約。可稱之爲僞分佈式系統。
此方案稱爲垂直劃分,利用了多個系統對數據進行不一樣階段的處理,突破了單時序系統上限。

若是仔細設計,垂直劃分能夠有很高的性能。
好比將數據作成多級索引結構,那麼只有頂級索引須要在準繩系統上提交,而頂級索引的數據量一般不大。
這就是咱們一般所說的數據庫分庫分表。

垂直劃分與應用邏輯結合緊密,維護代價量大。
要想更好突破單時序系統性能制約,更好的辦法是容許多個系統併發地操做數據。

併發操做有兩種狀況,一種是順序操做,即A對數據D操做完畢以後,D傳輸到B,B再操做D。順序操做和單系統上的單時序不同,它僅僅是「碰巧」而非強制。
另外一種狀況是衝突性操做,即A對數據D操做的同時,B也在對處於B本地的數據D進行操做,它將產生數據的不一樣分支版本,不一樣分支沒法自動合併。

分佈式系統的關鍵是數據在各子系統時序一致性,引伸出來就是要解決衝突。
具體說,要解決:
1,衝突檢測,每子系統拿到數據的不一樣版本須要能獨立檢測出是否衝突。
2,衝突決策, 決策結果在每子系統須要一致。

若是分佈式系統的每兩個子系統都兩兩互聯,造成徹底對等網絡,那就不須要額外的數據記錄鏈接的拓撲結構。
但目前的網絡設施仍舊基於串行模型,這樣的鏈接會超出網絡吞吐量。 因此實用型的鏈接是雪花型的拓撲結構。
這樣,對於一個自維護的半對等的分佈式系統,它須要額外的拓撲數據來記錄當前的鏈接模型。

拓撲數據和應用數據因爲用途不一樣,一般使用不一樣的衝突算法。

拓撲數據須要即時決策,若是決策過程太長可能形成期間系統鏈接異常,形成衝突上升等問題。
同時拓撲數據是可拋棄的,發生衝突時,沒被選中的數據版本能夠簡單地拋棄。
典型的應用場景是Leader選擇。

在實際運行的分佈式系統上,對於拓撲數據,無一例外地使用了Paxos算法進行衝突決策。
包括Google的Chubby、新發布的Spanner,亞馬遜S3等。
Paxos簡單說就是對數據進行選舉、使用多數贊成的衝突解決方案,選舉過程有衝突發現機制,詳情參見論文。

對於應用數據,實時性要求低,衝突算法的選擇餘地較大。

亞馬遜的S3系統,使用VectorClock的算法來處理應用數據衝突。
它很簡單,A處理D的時候爲D附加「A:1」的信息,B接着處理時加上「B:2」,詳情參見論文。
這樣,比較兩個D的附加信息,就能夠知道它們的操做時序是否有蘊涵關係,若是是,則新D覆蓋舊D。若是無蘊涵關係,則發生了衝突,同時保留兩個D。

VectorClock算法使用同時保留的策略來解決衝突,一樣也保證了最終一致性。
其實VectorClock也能夠作自動合併,在A、B都能得到一樣的D的狀況下,固定的算法能夠在A、B上分別產生一致性的分支選擇。
但自動合併後的D與合併前的D的各分支的後繼版本均會再次衝突,所以直接保留多版本是比較好的策略。

Google的Spanner則有不一樣的方案,對於數據D的寫操做均會帶上時間戳T,應用層在讀取D的時候須要指定T。至關於D按T分解成了多個版本,並且每一個版本只會寫入一次(下述),這就避免了衝突。

Spanner經過幾個策略保證D的每一個T版本只寫入一次:
1,寫入時在經過選舉出來的Leader上進行單點鎖定提交,保證了T時刻無衝突,只有一個 版本寫入。
2,當寫入時T與上次寫入的T相同時,即爲檢出衝突,此時使用延遲寫入當前版原本解決衝突。
3,原子鐘和GPS提供了全局同步時間TrueTime,假設其最大偏差爲delta,那麼在與上版本衝突時,最多須要延遲delta時間,就能夠保證不衝突。

分佈式系統提起來嚇人,核心算法並不複雜,只是各家的論文都語焉不詳,實在使人鬱悶。
相關文章
相關標籤/搜索