第一天,我們輕鬆一點。在走入一堆系統與理論的迷宮前,
我們來認識一下分散式系統最知名的理論 - CAP Theorem
先舉一個簡單的服務讓大家有一個直觀的分散式系統想法,假設它只提供儲存與讀取 key-value 的服務。
圖1:
如果今天服務只有一個元件,那事情非常簡單,只要該server一直活著,那我的讀寫功能都不會出問題。
圖2:
但是我知道電腦可能斷電或是失效,且可能一瞬間有百萬個人要存取我的服務,因此我希望用最直觀的方法,也就是scale out成兩個servers來提供服務,來避免單一電腦失敗或是增加處理流量的能力。而為了保持數據是一樣的,當有一方寫入後,他必須複製該新結果到其他的replica servers。
圖3:
上述想法非常直觀簡單,但是在分散式系統裡,更常見的錯誤反而是網路的斷線,若是s1與s2失去聯繫,那麼彼此就看不到對方更新的值,最終整個系統的資料會完全不一致。
究竟系統成長成分散式系統後,有哪些細節我們應該考慮,就是接下來幾天探討的主題。
CAP是一個縮寫分別代表三個字,也是未來系列文章每個主題都在奮力爭取的三個字
分別是:
而CAP Theorem說的是
"在分散式系統中,不可能同時滿足上面三個性質,最多只能同時滿足兩個。"
也就是設計系統的時候有三種選擇
Consistency 與 Availability:
Consistency 與 Partition Tolerance:
Distributed RDBMS
以Consistency為最高原則。不允許一個clientA寫入到其中一個serverA,然後clientA從serverB讀取時,發現結果跟剛剛寫入的不一樣。因此當系統發生Partition時,系統返回錯誤。Availability 與 Partition Tolerance:
DNS系統
與近年興起的NoSQL Database
,強調的就是Availablity,也就是系統保證運作,但是可能返回的結果不是最新的,畢竟在網路服務中,如果服務中斷可能帶來更大的不便。CAP最初由Eric Brewer(目前Google VP Infrastructure)在2000提出,在CAP出現前我們先聊聊更早之前就有的兩個名詞: ACID, BASE。
在網路、雲端開始興起之初,資料庫是最早被大量研究的應用。而針對資料庫最重要的就是Transaction。簡單說明,當我透過銀行轉帳,資料庫第一步從我帳戶扣除金額,第二部在對方帳戶增加金額,這兩步連續動作就是一個 Transaction (wiki例子)。資料庫必須保證這個Transaction是安全有效的,因此提出了ACID特性。
ACID:
這邊小比較:
從這裡可以看到ACID的C跟CAP的C不一樣,
一個是資料庫的數據在被修改後仍然必須合法,
一個是分散式系統中每個元件手中的副本資料必須一致,使得client不管從哪個元件讀取皆會得到一樣最新的結果。
而因為網路服務的興起,服務中斷的成本變得越來越高,因為會影響使用者的黏著度。Eric Brewer首先提出了另一個理念BASE來設計往後的網路服務。
BASE
小插曲
大家應該知道做電腦科學的人命名很隨性,其實BASE某程度上也是掰出來的縮寫。
剛好ACID是"酸性",BASE是"鹼性",形成一個對比。"I came up with acronym with my students in their office earlier that year. I agree it is contrived a bit, but so is “ACID” – much more than people realize, so we figured it was good enough" - Eric Brewer
再過了一段時間到2000年 Eric Brewer 就提出了上面介紹的CAP Theorem了
CAP看似三選二,但當今天我們要設計分散式系統的時候,Network Partition是不可避免的。所以更重要的是如何在Consistency和Availability做取捨。
不過,從上面可以知道,BASE 的提出已經意識到可以在Consistency和Availability做取捨,而開始將Consistency定義出不同的等級,所以我們其實不用絕對拋棄任一個性質,而是找出最適合自己服務的平衡。
這一系列的思路也帶動了NoSQL資料庫的興起,最有名的例子應該就是Amazon DynamoDB,他就是採用了Eventual consistency來保證服務的Availability。
另一個例子也藏在生活之中,就是訪問網路時一定會用到的服務 DNS
。前面提到Domain Name Service當然也是一種分散式系統,而為了保證大家都可以用網路,他選擇側重了Availibility,並且也是用了Eventual Consistency來交換,看以下例子:
當一個新的的服務上線並且註冊了他的域名與對應的ip位址後,四散各地的DNS並不是同時同步更新,因此在另外一端的人可能第一次訪問該服務時,不一定可以正確被解析。但是最終過了一段時間DNS更新了資訊後,再次訪問便可以正確使用。
一系列從ACID, BASE到CAP看下來。可以知道設計系統的時候,CAP理論提供了一個方向,但是並不是限制。最終,使用系統的是一般使用者,必須從使用者角度出發考量。
回到最前面的例子,從CAP理論我們知道必須對Consistency和Availability做出取捨,但是這個取捨應該取多少又捨棄多少?
明天將會討論各種data replication的Consistency Model,來看看你說的data要一致到底要多一致。
"也就是scale up成兩個servers來提供服務"
應該是 scale out 吧
沒錯
scale out/in - vertical scaling
scale up/down - horizontal scaling
感謝!
我的想法是
scale out - horizontal scaling
scale up - vertical scaling
http://abhijitkakade.com/2019/04/horizontal-vs-vertical-scaling-azure-autoscaling/
喔喔更正了上面結果下面自己寫錯哈哈