AWS入門指南之三:一致性問題

最近比較忙,很少來更新博客。這一次我們簡單聊一聊一致性的問題。對於一個分佈式系統來講,一致性問題是一個非常重要,非常基礎的問題。對於分佈式系統的框架設計者,可以說是一個需要考慮的基本問題。在分佈式系統中一個基礎理論是CAP,具體說就是一致性(Consistency),可用性(Availability),分區容錯(Partition tolerance)。一個個具體解釋一下:

一致性:每一個讀操作可以接收到最新的數據或者是錯誤

可用性:每一個請求可以接收到一個沒有錯誤的相應,但是不保證該相應包含最後寫的數據

分區容錯:在網絡的節點間發生任意數量的錯誤,比如延遲或者丟包,系統仍然可以正常工作。

從理論上講,CAP是不可能完全實現的,爲了擁有其中兩個特性必須要損害第三個性能。對於分佈式系統一般認爲分區容錯是一個必須支持的特性,原因在於分佈式系統必然基於網絡構建,而網絡上的傳輸錯誤是不可避免的。在這裏多說一句,partition的概念在AWS裏很多服務中都會涉及,是一個非常普遍的需要了解的概念。以後再談到具體的服務時再討論。在我們只能選擇兩個而放棄一個的情況下,可用性和一致性只能二選一了。我們如果仔細看AWS的服務,會發現有些服務是允許用戶選擇那個特性優先的,比如DynamoDB,也有很多系統是不可選擇的。當不可選擇時,也就是說系統已經默認了哪個優先,大多數情況下是可用性優先,也有些服務是一致性優先。

當可用性優先時,又會涉及到另一個話題,這個時候什麼樣的系統行爲是可以接受的?對於AWS來說這涉及到冪等(idempotent)和最終一致性(eventually consistency)的問題。其實這些也可以展開很多話題講,這裏我們就簡單說一下冪等的意思對於寫請求的順序是不敏感的,也就是無論是怎樣的順序,最終的結果都保證是一樣的。而最終一致性是說系統在一定時間後可以達到一致性的狀態,也就是說在一定時間後所有client讀到的數據都是一致的。冪等一般需要client特別的設計,AWS服務是沒有辦法保證的,但是AWS的很多關鍵服務會提供方法來輔助client做出冪等的設計。而最終一致性是AWS服務在保證可用性前提下的一般普遍性的選擇。

在這裏我們具體看一下AWS裏兩個最爲流行的服務,S3和DynamoDB的一致性是如何設計的。對於S3和DynamoDB還不熟悉的同學,可以看一下AWS的文檔。簡單說S3是一個對象存儲服務。DynamoDB是一個NoSQL數據庫。關於它們都有不少有意思的話題可以討論。現在我們先看看和一致性有關的內容。

S3的一致性模型:當我們在S3中創建一個對象時(PUTS new objects),S3提供的read-after-write一致性。也就是當新對象被建立並被同步到所有的AZ以後,所有的client都可以看到;而在此之前所有的client都看不到。當我們覆蓋或者刪除一個對象時(overwrite PUTS and DELETES),S3提供最終一致性。這意味着如果有兩個client同時對一個對象做出覆蓋寫請求,在一定的時間內如果多個client去讀這個對象,他們可能會得到不同的結果。而在一定時間後,可以保證所有client最終讀到的內容是一樣的。當然,這個時間一般都很短,絕大多數情況可以在2秒內達到一致性的狀態。

DynamoDB一致性模型:DynamoDB對於寫操作是不提供選項,而默認使用最終一致性寫操作的。而對於讀操作,client是可以選擇是使用最終一致性讀還是強一致性讀的,默認是最終一致性讀。如果我們還記得CAP理論的話,我們會意識到選擇強一致性讀會損害可用性。具體來說,可能會出現系統返回500(Internal System Error)的情況。這是爲什麼呢?原因在於如果我們選擇強一致性讀,DynamoDB會在所有的服務節點中選擇一個作爲主節點(Master Node),而其他的節點叫做從節點(slave node)。而Master Node會收集所有slave node的數據更新狀況來判斷哪個數據作爲當前系統的一致性結果。一般情況下,如果有超出一半的節點選擇了同一個數據作爲最終結果,Master Node就會選擇該結果作爲當前系統的最終結果。而一旦Master Node出現任何問題,整個系統會進入暫時的不可用狀態,這個時候系統各個node會判斷出Master Node出現問題,而重新選舉新的Master Node。當新的Master Node選舉出來以後系統就可以恢復工作了。這個時間一般會持續好幾秒鐘。如下圖所示:

關於一致性的問題就先聊到這裏。大家有什麼問題歡迎留言交流。

參考文檔:

CAP:https://cloudacademy.com/blog/consistency-models-of-amazon-cloud-services/

S3: https://aws.amazon.com/s3/

DynamoDB:https://aws.amazon.com/dynamodb/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章