创建可扩展性系统-4
?高可擴(kuò)展性系統(tǒng)的一些理論基礎(chǔ)
?
?
?
在2000年ACM的PODC座談會(huì)上加州大學(xué)伯克利教授 Eric Brewer在主題“建立可靠的分布式系統(tǒng)”的演講中提出了所謂的CAP定律,至今被大型網(wǎng)絡(luò)公司(如亞馬遜 )作為系統(tǒng)構(gòu)架基礎(chǔ)理論廣泛應(yīng)用。
在討論CAP定律前,先介紹CAP定律涉及到三個(gè)關(guān)鍵概念:一致性(Consistency),可用性(Availability) 和分區(qū)容差(Partition Tolerance)。一致性的含義是指系統(tǒng)在執(zhí)行操作后處于一致的狀態(tài);一些寫(xiě)操作后所有的讀操作都看到共享數(shù)據(jù)源上相同的更新結(jié)果。 可用性,尤其高可用性意味著系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)避免了SPOF,在集群中的節(jié)點(diǎn)崩潰或部分軟硬件由于升級(jí)維護(hù)而不能工作的情況下系統(tǒng)可以繼續(xù)正常事務(wù)處理。 分區(qū)容差反應(yīng)了系統(tǒng)在網(wǎng)絡(luò)物理分區(qū)發(fā)生改變(比如節(jié)點(diǎn)無(wú)法相互連接,或者動(dòng)態(tài)的添加和刪除節(jié)點(diǎn)) 而繼續(xù)工作的能力。
布魯爾聲稱(chēng),一個(gè)“共享數(shù)據(jù)系統(tǒng)”至多可以同時(shí)實(shí)現(xiàn)CAP三個(gè)特征中兩個(gè)。 CAP定律本身并不復(fù)雜。 一個(gè)簡(jiǎn)單的理解是:為了提高系統(tǒng)的可用性,防止SPOF,根本的策略是冗余復(fù)制,為了保證復(fù)制雙方不受相互影響,必須考慮復(fù)制雙方的分區(qū); 分區(qū)必然需要考慮復(fù)制雙方的狀體同步, 也就是一致性問(wèn)題。
進(jìn)一步的討論需要引入新的概念BASE。
(一)ACID / BASE
ACID是數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)中事務(wù)所具有的四個(gè)特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation,又稱(chēng)獨(dú)立性)、持久性(Durability)。例如銀行轉(zhuǎn)帳,從原賬戶(hù)扣除金額,以及向目標(biāo)賬戶(hù)添加金額,這兩個(gè)數(shù)據(jù)庫(kù)操作的總和,構(gòu)成一個(gè)完整的邏輯過(guò)程 。這個(gè)過(guò)程具有ACID屬性, 保證了整個(gè)系統(tǒng)中的總金額沒(méi)有變化, 系統(tǒng)一直處于一致性狀態(tài)。
維基,博客,社交網(wǎng)絡(luò)等互聯(lián)網(wǎng)每天產(chǎn)生海量數(shù)據(jù)需要處理,儲(chǔ)存和分析。系統(tǒng)
需要根據(jù)數(shù)據(jù)的不同性質(zhì), 在性能,可靠性,可用性,一致性和耐久性之間權(quán)衡。事實(shí)是,Facebook狀態(tài)更新, 微博論壇的留言并不嚴(yán)格需要ACID。只要業(yè)務(wù)層和表示層實(shí)現(xiàn)了處理不一致的數(shù)據(jù)的策略, 放寬ACID要求,可以避免系統(tǒng)在數(shù)據(jù)庫(kù)層上的瓶頸,對(duì)實(shí)現(xiàn)高效,高擴(kuò)展的系統(tǒng)構(gòu)架產(chǎn)生巨大的靈活性。
在另一方面, 即使對(duì)于大型電子商務(wù)網(wǎng)站和大型銀行系統(tǒng),越來(lái)越多的系統(tǒng)架構(gòu)使用大量的“廉價(jià),低端和不十分穩(wěn)定的”機(jī)器, 實(shí)現(xiàn)相對(duì)低成本的可用性和無(wú)限可擴(kuò)展性, 但同時(shí)引入了分區(qū)容差(P)的因素。 CAP定理說(shuō)明在一致性,可用性和分區(qū)容差中必須犧牲其中一種屬性。在分區(qū)容差不可避免 的大型和超大數(shù)據(jù)規(guī)模的Web應(yīng)用系統(tǒng)中, 如何選擇呢?作者有一次和一家著名電子商務(wù)公司的構(gòu)架師聊天, 他說(shuō)即使公司內(nèi)部的系統(tǒng)出現(xiàn)嚴(yán)重問(wèn)題,用戶(hù)下單是不會(huì)受到影響的。 從商業(yè)角度來(lái)考慮,可用性比嚴(yán)格的一致性更有價(jià)值。
當(dāng)然, 系統(tǒng)放寬ACID要求的同時(shí), 必須有能力在業(yè)務(wù)層和表示層處理不一致的數(shù)據(jù)。 這就引入了BASE的概念。
BASE是Basic Available(基本上可用) Soft State(軟狀態(tài)) 和 Eventually consistent(最終一致性)的首字母縮寫(xiě)詞。 因?yàn)?/font>ACID在英語(yǔ)中也有酸性的意思, BASE有堿性的意思,技巧的表明了截然兩種不同的性質(zhì)。BASE系統(tǒng)強(qiáng)調(diào)系統(tǒng)的可用性,適度退化和性能 。通俗的講,應(yīng)用程序基本上在所有的時(shí)間都是工作(基本上可用),雖然沒(méi)有在所有的時(shí)間狀態(tài)都是一致的(軟狀態(tài)), 但最終將達(dá)到確定一致的狀態(tài)(最終的一致性)
Table 3.2.: ACID vs. BASE (cf. [Bre00, slide 13])
| ACID | BASE |
| 強(qiáng)的一致性 隔離 強(qiáng)調(diào)事務(wù)的“提交” 嵌套事務(wù) 可用性? 保守的(封閉式) 演進(jìn)困難(如 架構(gòu)) | 弱的一致性 – 過(guò)時(shí)的數(shù)據(jù) OK 可用性第一 盡力而為 近似答案 OK 主動(dòng)式(開(kāi)放式) 簡(jiǎn)單! 更快 更容易演變 |
?
?
?
?
ACID是封閉的和嚴(yán)格要求每一個(gè)操作一致性(CAP中的C);BASE是開(kāi)放的,認(rèn)為數(shù)據(jù)庫(kù)的一致性存在于變化不定的狀態(tài)流中。雖然這聽(tīng)起來(lái)很玄妙,BASE在實(shí)際中非常易于管理,而且獲得了ACID無(wú)法獲得的高水平的可用性(CAP中的A)。
BASE的可用性在于,通過(guò)降低嚴(yán)格一致性要求而去偶聯(lián)分布式節(jié)點(diǎn), 部分系統(tǒng)故障因而不影響系統(tǒng)的整體狀態(tài); 同時(shí)松散化各個(gè)節(jié)點(diǎn)的關(guān)聯(lián),架構(gòu)上也進(jìn)一步支持了高的橫向可擴(kuò)展性。
上面所有的討論中, 一致性的觀點(diǎn)是關(guān)鍵。一致性的概念比較廣泛,數(shù)據(jù)一致性通常指關(guān)聯(lián)數(shù)據(jù)之間的邏輯關(guān)系是否正確和完整,我們主要討論數(shù)據(jù)復(fù)制情況下的一致性。 先舉個(gè) 一致性模型的例子,假設(shè)以下情況下發(fā)生:
-
行X復(fù)制到節(jié)點(diǎn)M和N
-
客戶(hù)端A到節(jié)點(diǎn)N對(duì)行X進(jìn)行寫(xiě)操作
-
經(jīng)過(guò)的時(shí)間t的期間,客戶(hù)端B從節(jié)點(diǎn)M讀取行X
可以從兩方面來(lái)看待一致性問(wèn)題: 從用戶(hù)/程序員的角度,確定客戶(hù)端B是否能夠讀到客戶(hù)端A的寫(xiě)操作結(jié)果; 從服務(wù)器的角度,更新操作是如何完成的,系統(tǒng)所承諾的訪問(wèn)結(jié)果是什么。
?
早期對(duì)分布式數(shù)據(jù)一致性的研究,強(qiáng)調(diào)數(shù)據(jù)分布對(duì)用戶(hù)的透明性。 用戶(hù)應(yīng)該和使用單一系統(tǒng)一樣使用分布式系統(tǒng),如果單一系統(tǒng)的特性沒(méi)法獲得,早期的選擇是讓整體系統(tǒng)失效。90年代中期, 隨著大規(guī)模網(wǎng)絡(luò)系統(tǒng)的出現(xiàn),研究人員開(kāi)始重新審視分布式系統(tǒng)的設(shè)計(jì)理念。Eric的 CAP 定律就是這種反思的總結(jié)。
?
常用的一致性模型有: 【見(jiàn)WIKI】
-
嚴(yán)格一致性(linearizability, strict/atomic Consistency) 要求無(wú)論寫(xiě)操作發(fā)生在哪個(gè)副本上 , 所有的讀操作必須返回最近完成的寫(xiě)操作的結(jié)果 。 這意味著對(duì)于不同節(jié)點(diǎn)上的讀寫(xiě)操作必須執(zhí)行分布式事務(wù)協(xié)議(如兩階段提交協(xié)議)來(lái)保證嚴(yán)格的一致性。分布式事務(wù)協(xié)議的本質(zhì)是把各個(gè)副本通過(guò)協(xié)議緊密偶聯(lián),造成了SPOF而影響系統(tǒng)的可用性。 這和CAP定理得到的結(jié)論相同:ACID強(qiáng)調(diào)嚴(yán)格的一致性。
-
順序一致性(sequential consistency):程序在各個(gè)機(jī)器上并行運(yùn)行時(shí),任何一種有效的交錯(cuò)訪問(wèn)順序都是可認(rèn)可的行為,但所 有使用者以同樣的順序看到對(duì)同一數(shù)據(jù)的操作。 順序一致性是常見(jiàn)的多線程程序執(zhí)行順序的模型。
-
因果一致性(causal consistency ,Hutto和Ahamad,1990 )是順序一致性(SC)的弱化 。 因果一致性 按有無(wú)可能的潛在因果聯(lián)系來(lái)區(qū)分各事件。 假設(shè)進(jìn)程P1寫(xiě)變量x,然后P2讀出x,寫(xiě)入y。這里讀出x和寫(xiě)入y之間可能有潛在的因果聯(lián)系,因?yàn)?/font>y的計(jì)算很可能決定于P2讀到的x值(即P1寫(xiě)入的值)。 只有存在因果關(guān)系的寫(xiě)操作才要求所有使用者以相同的次序看到,對(duì)于無(wú)因果關(guān)系的寫(xiě)入則并行進(jìn)行,無(wú)次序保證 。但在實(shí)現(xiàn)時(shí)可以使用向量時(shí)間戳建立與維護(hù)因果依賴(lài)圖,需要一定開(kāi)銷(xiāo)。
-
管道一致性(PRAM/FIFO consistency):在因果一致性模型上的進(jìn)一步弱化,要求由某一個(gè)進(jìn)程完成的寫(xiě)操作可以被其他所有的進(jìn)程按照順序的感知到,就像寫(xiě)入一個(gè)的管道一樣;而從不同進(jìn)程中來(lái)的寫(xiě)操作則無(wú)需保證順序。管道一致性實(shí)現(xiàn) 相對(duì)來(lái)說(shuō)比較容易。
-
弱一致性(weak consistency):只要求對(duì)共享數(shù)據(jù)結(jié)構(gòu)的訪問(wèn)保證順序一致性。弱一致性的另一個(gè)定義是指所有弱于順序一致性的一致性模型。
-
釋放一致性(release consistency): 使用兩個(gè)不同的操作語(yǔ)句acquire-release。需要寫(xiě)入前acquire該對(duì)象,寫(xiě)操作結(jié)束后release。 提供 釋放一致性也就意味著當(dāng)release發(fā)生后和新的acquire前,所有使用者應(yīng)該可以看到該操作結(jié)果。
-
最終一致性(eventual consistency):當(dāng)沒(méi)有新更新的情況下,系統(tǒng)隨著時(shí)間的推移最終將返回最后寫(xiě)入的值;雖然在數(shù)據(jù)更新過(guò)程中,因?yàn)楦鱾€(gè)副本的同步需要時(shí)間,客戶(hù)端可能會(huì)面臨數(shù)據(jù)不一致的狀態(tài)。允許采用最終一致性模型的關(guān)鍵前提是:偶爾讀出陳舊數(shù)據(jù)是可以接受的。
-
delta consistency:系統(tǒng)會(huì)在固定的delta時(shí)間窗口內(nèi)達(dá)到一致。
-
最終一致性的幾種具體實(shí)現(xiàn):
1、讀不舊于寫(xiě)一致性(Read-your-writes consistency, RYOW):使用者讀
到的數(shù)據(jù),總是不舊于自身上一個(gè)寫(xiě)入的數(shù)據(jù)。RYOW一致性是一種特殊因果一致性。RYOW意味著一個(gè)用戶(hù)完成寫(xiě)操作后可以立刻看到更新的結(jié)果,即使讀寫(xiě)是發(fā)生在不同的服務(wù)器上。其他用戶(hù)對(duì)他的更新不是立刻可見(jiàn)的。
2、會(huì)話(huà)一致性(Session consistency):也翻譯成任務(wù)一致性, 它比RYOW更弱化,是RYOW的應(yīng)用版。使用者在一個(gè)會(huì)話(huà)中才保證讀寫(xiě)一致性,啟動(dòng)新會(huì)話(huà)后則一致性失效。
3、單讀一致性(Monotonic read consistency):任何使用者讀到的數(shù)據(jù)總是不舊于任何使用者上一次讀到的數(shù)據(jù)。
4、單寫(xiě)一致性(Monotonic write consistency):保持同一個(gè)使用者寫(xiě)操作的順序,寫(xiě)操作完成后才能開(kāi)始下一次的寫(xiě)入。這是編程的最低要求。
在實(shí)踐應(yīng)用中可以組合應(yīng)用上述的幾種最終一致性模式。比如 單讀一致性 和 會(huì)話(huà)一致性的組合應(yīng)用。 設(shè)計(jì)師需要根據(jù)應(yīng)用程序?qū)嶋H需要來(lái)選擇特定模式。Werner Vogels認(rèn)為:在很多互聯(lián)網(wǎng)應(yīng)用中,單讀一致性和RYOW 可以提供足夠的一致性了。
最終一致性模式并不是高度分布式系統(tǒng)獨(dú)有的。比如傳統(tǒng)RDBMS的異步備份機(jī)制在備份恢復(fù)過(guò)程中就存在數(shù)據(jù)不一致的時(shí)間窗口。
?
下面轉(zhuǎn)入服務(wù)器端的一致性討論。
在分片構(gòu)架上引入復(fù)制的概念不僅僅增加了系統(tǒng)的可靠性, 而且可以均衡對(duì)特定物理節(jié)點(diǎn)的讀操作的負(fù)載。 Voldermort開(kāi)發(fā)小組 認(rèn)為,以下3個(gè)因素影響在分片數(shù)據(jù)上的讀寫(xiě)操作。
N: 讀寫(xiě)操作對(duì)象的副本數(shù)目
R: 讀操作涉及到的副本數(shù)目
W: 寫(xiě)操作中阻斷的副本數(shù)目, 也是寫(xiě)操作完成前同步寫(xiě)入的副本數(shù)目。
在RYOW一致性模型中, 以下關(guān)系成立
R +W > N
也就是當(dāng)讀操作的副本和寫(xiě)操作的副本有重疊時(shí),系統(tǒng)可以保證比較嚴(yán)格的一致性。 在完全同步的條件下, R+W = R + N > N , 系統(tǒng)嚴(yán)格一致。
系統(tǒng)的常用使用方式和優(yōu)化要求決定了設(shè)置R,W,N的值。如果系統(tǒng)把一致性放
在首位,如果設(shè)W=N,這樣同時(shí)增加了W失敗的可能性;常用的策略是設(shè)W=3, 然后再寫(xiě)更新其他副本。這種情況往往導(dǎo)致 R+ W <= N, 系統(tǒng)具有弱化的最終一致性。 對(duì)于Amazon的Dynamo 而言,為了處理終端用戶(hù)的寫(xiě)操作高可用性,R,W,N的值設(shè)為 N=3, R=2, W=2。
系統(tǒng)架構(gòu)的其他因素也影響一致性的獲得。 服務(wù)器前端的負(fù)載平衡使用粘性連接(Sticky Connection), 將很容易獲得 會(huì)話(huà)一致性和 單讀一致性。有的時(shí)候 RYOW一致性也可以通過(guò)客戶(hù)端使用寫(xiě)操作的版本號(hào)來(lái)實(shí)現(xiàn)。
?
EBay和Amazon都公開(kāi)表示他們的系統(tǒng)嚴(yán)格不使用2PC。如何在沒(méi)有2PC的分布式系統(tǒng)中保證系統(tǒng)的一致性? 上面引入的BASE概念表明, 最終一致性答案不再是一個(gè)BOOL值,而是一個(gè)范圍; 最終一致性的獲得,也不再是一個(gè)原子操作,而是一個(gè)過(guò)程。 常見(jiàn)的策略包括:精心設(shè)計(jì)的數(shù)據(jù)庫(kù)讀寫(xiě)操作的順序; 通過(guò)異步事件或者協(xié)調(diào)批處理(reconciliation batch)來(lái)實(shí)現(xiàn)最終一致性。
轉(zhuǎn)載于:https://blog.51cto.com/6927843/1172097
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的创建可扩展性系统-4的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用hotnode自动更新脚本(热发布)
- 下一篇: PowerShell 2.0 实践(四)