今天,我們將研究一些分布式策略,比如故障檢測中的復制,這些策略用黑體字標出,被分為三段:
數據一致性
眾所周知,分布式系統經常會遇到網絡隔離或是延遲的情況,在這種情況下隔離的部分是不可用的,因此要保持高可用性而不犧牲一致性是不可能的。這一事實通常被稱作“CAP理論”。然而,一致性在分布式系統中是一個非常昂貴的東西,所以經常需要在這上面做一些讓步,不只是針對可用性,還有多種權衡。為了研究這些權衡,我們注意到分布式系統的一致性問題是由數據隔離和復制引起的,所以我們將從研究復制的特點開始:
一致性。一致性比前面幾個特性都要復雜得多,我們需要詳細討論一下幾種不同的觀點。 但是我們不會涉及過多的一致性理論和并發模型,因為這已經超出了本文的范疇,我只會使用一些簡單特點構成的精簡體系。
讀寫一致性。從讀寫的觀點來看,數據庫的基本目標是使副本趨同的時間盡可能短(即更新傳遞到所有副本的時間),保證最終一致性。除了這個較弱的保證,還有一些更強的一致性特點:
寫后讀一致性。在數據項X上寫操作的效果總是能夠被后續的X上的讀操作看見。
讀后讀一致性。在一次對數據項X的讀操作之后,后續對X的讀操作應該返回與第一次的返回值相同或是更加新的值。
寫一致性。分區的數據庫經常會發生寫沖突。數據庫應當能處理這種沖突并保證多個寫請求不會被不同的分區所處理。這方面數據庫提供了幾種不同的一致性模型:
原子寫。假如數據庫提供了API,一次寫操作只能是一個單獨的原子性的賦值,避免寫沖突的辦法是找出每個數據的“最新版本”。這使得所有的節點都能夠在更新結束時獲得同一版本,而與更新的順序無關,網絡故障和延遲經常造成各節點更新順序不一致。 數據版本可以用時間戳或是用戶指定的值來表示。Cassandra用的就是這種方法。
原子化的讀-改-寫。應用有時候需要進行 讀-改-寫 序列操作而非單獨的原子寫操作。假如有兩個客戶端讀取了同一版本的數據,修改并且把修改后的數據寫回,按照原子寫模型,時間上比較靠后的那一次更新將會覆蓋前一次。這種行為在某些情況下是不正確的(例如,兩個客戶端往同一個列表值中添加新值)。數據庫提供了至少兩種解決方法:
沖突預防。 讀-改-寫 可以被認為是一種特殊情況下的事務,所以分布式鎖或是 PAXOS [20, 21] 這樣的一致協議都可以解決這種問題。這種技術支持原子讀改寫語義和任意隔離級別的事務。另一種方法是避免分布式的并發寫操作,將對特定數據項的所有寫操作路由到單個節點上(可以是全局主節點或者分區主節點)。為了避免沖突,數據庫必須犧牲網絡隔離情況下的可用性。這種方法常用于許多提供強一致性保證的系統(例如大多數關系數據庫,HBase,MongoDB)。
沖突檢測。數據庫跟蹤并發更新的沖突,并選擇回滾其中之一或是維持兩個版本交由客戶端解決。并發更新通常用向量時鐘 [19] (這是一種樂觀鎖)來跟蹤,或者維護一個完整的版本歷史。這個方法用于 Riak, Voldemort, CouchDB.
現在讓我們仔細看看常用的復制技術,并按照描述的特點給他們分一下類。第一幅圖描繪了不同技術之間的邏輯關系和不同技術在系統的一致性、擴展性、可用性、延遲性之間的權衡坐標。 第二張圖詳細描繪了每個技術。


復本因子是4。讀寫協調者可以是一個外部客戶端或是一個內部代理節點。
我們會依據一致性從弱到強把所有的技術過一遍:
(A, 反熵) 一致性最弱,基于策略如下。寫操作的時候選擇任意一個節點更新,在讀的時候如果新數據還沒有通過后臺的反熵協議傳遞到讀的那個節點,那么讀到的仍然是舊數據。(下一節會詳細介紹反熵協議)。這種方法的主要特點是:
過高的傳播延遲使它在數據同步方面不太好用,所以比較典型的用法是只作為輔助性的功能來檢測和修復計劃外的不一致。Cassandra就使用了反熵算法來在各節點之間傳遞數據庫拓撲和其他一些元數據信息。
一致性保證較弱:即使在沒有發生故障的情況下,也會出現寫沖突與讀寫不一致。
在網絡隔離下的高可用和健壯性。用異步的批處理替代了逐個更新,這使得性能表現優異。
持久性保障較弱因為新的數據最初只有單個副本。
(B) 對上面模式的一個改進是在任意一個節點收到更新數據請求的同時異步的發送更新給所有可用節點。這也被認為是定向的反熵。
與純粹的反熵相比,這種做法只用一點小小的性能犧牲就極大地提高了一致性。然而,正式一致性和持久性保持不變。
假如某些節點因為網絡故障或是節點失效在當時是不可用的,更新最終也會通過反熵傳播過程來傳遞到該節點。
(C) 在前一個模式中,使用提示移交技術 [8] 可以更好地處理某個節點的操作失敗。對于失效節點的預期更新被記錄在額外的代理節點上,并且標明一旦特點節點可用就要將更新傳遞給該節點。這樣做提高了一致性,降低了復制收斂時間。
(D, 一次性讀寫)因為提示移交的責任節點也有可能在將更新傳遞出去之前就已經失效,在這種情況下就有必要通過所謂的讀修復來保證一致性。每個讀操作都會啟動一個異步過程,向存儲這條數據的所有節點請求一份數據摘要(像簽名或者hash),如果發現各節點返回的摘要不一致則統一各節點上的數據版本。我們用一次性讀寫來命名組合了A、B、C、D的技術- 他們都沒有提供嚴格的一致性保證,但是作為一個自備的方法已經可以用于實踐了。
(E, 讀若干寫若干) 上面的策略是降低了復制收斂時間的啟發式增強。為了保證更強的一致性,必須犧牲可用性來保證一定的讀寫重疊。 通常的做法是同時寫入W個副本而不是一個,讀的時候也要讀R個副本。
首先,可以配置寫副本數W>1。
其次,因為R+W>N,寫入的節點和讀取的節點之間必然會有重疊,所以讀取的多個數據副本里至少會有一個是比較新的數據(上面的圖中 W=2, R=3, N=4 )。這樣在讀寫請求依序進行的時候(寫執行完再讀)能夠保證一致性(對于單個用戶的讀寫一致性),但是不能保障全局的讀一致性。用下面圖示里的例子來看,R=2,W=2,N=3,因為寫操作對于兩個副本的更新是非事務的,在更新沒有完成的時候讀就可能讀到兩個都是舊值或者一新一舊:

對于某種讀延遲的要求,設置R和W的不同值可以調整寫延遲與持久性,反之亦然。
如果W<=N/2,并發的多個寫入會寫到不同的若干節點(如,寫操作A寫前N/2個,B寫后N/2個)。 設置 W>N/2 可以保證在符合回滾模型的原子讀改寫時及時檢測到沖突。
嚴格來講,這種模式雖然可以容忍個別節點的失效, 但是對于網絡隔離的容錯性并不好。在實踐中,常使用”近似數量通過“這樣的方法,通過犧牲一致性來提高某些情景下的可用性。
(F, 讀全部寫若干)讀一致性問題可以通過在讀數據的時候訪問所有副本(讀數據或者檢查摘要)來減輕。這確保了只要有至少一個節點上的數據更新新的數據就能被讀取者看到。但是在網絡隔離的情況下這種保證就不能起到作用了。
(G, 主從) 這種技術常被用來提供原子寫或者 沖突檢測持久級別的讀改寫。為了實現沖突預防級別,必須要用一種集中管理方式或者是鎖。最簡單的策略是用主從異步復制。對于特定數據項的寫操作全部被路由到一個中心節點,并在上面順序執行。這種情況下主節點會成為瓶頸,所以必須要將數據劃分成一個個獨立的片區(不同片有不同的master),這樣才能提供擴展性。
(H, Transactional Read Quorum Write Quorum and Read One Write All) 更新多個副本的方法可以通過使用事務控制技術來避免寫沖突。 眾所周知的方法是使用兩階段提交協議。但兩階段提交并不是完全可靠的,因為協調者失效可能會造成資源阻塞。 PAXOS提交協議 [20, 21] 是更可靠的選擇,但會損失一點性能。 在這個基礎上再向前一小步就是讀一個副本寫所有副本,這種方法把所有副本的更新放在一個事務中,它提供了強容錯一致性但會損失掉一些性能和可用性。
上面分析中的一些權衡有必要再強調一下:
一致性與可用性。 嚴密的權衡已經由CAP理論給出了。在網絡隔離的情況下,數據庫要么將數據集中,要么既要接受數據丟失的風險。
一致性與擴展性。 看得出即使讀寫一致性保證降低了副本集的擴展性,只有在原子寫模型中才可以以一種相對可擴展的方式處理寫沖突。原子讀改寫模型通過給數據加上臨時性的全局鎖來避免沖突。這表明, 數據或操作之間的依賴,即使是很小范圍內或很短時間的,也會損害擴展性。所以精心設計數據模型,將數據分片分開存放對于擴展性非常重要。
一致性與延遲。 如上所述,當數據庫需要提供強一致性或者持久性的時候應該偏向于讀寫所有副本技術。但是很明顯一致性與請求延遲成反比,所以使用若干副本技術會是比較中允的辦法。
故障轉移與一致性/擴展性/延遲。 有趣的是容錯性與一致性、擴展性、延遲的取舍沖突并不劇烈。通過合理的放棄一些性能與一致性,集群可以容忍多達 up to 的節點失效。這種折中在兩階段提交與 PAXOS 協議的區別里體現得很明顯。這種折中的另一個例子是增加特定的一致性保障,比如使用嚴格會話進程的“讀己所寫”,但這又增加了故障轉移的復雜性 [22]。
反熵協議, 謠言傳播算法
讓我們從以下場景開始:
有許多節點,每條數據會在其中的若干的節點上面存有副本。每個節點都可以單獨處理更新請求,每個節點定期和其他節點同步狀態,如此一段時間之后所有的副本都會趨向一致。同步過程是怎樣進行的?同步何時開始?怎樣選擇同步的對象?怎么交換數據?我們假定兩個節點總是用較新版本的數據覆蓋舊的數據或者兩個版本都保留以待應用層處理。
這個問題常見于數據一致性維護和集群狀態同步(如集群成員信息傳播)等場景。雖然引入一個監控數據庫并制定同步計劃的協調者可以解決這個問題,但是去中心化的數據庫能夠提供更好的容錯性。去中心化的主要做法是利用精心設計的傳染協議[7],這種協議相對簡單,但是提供了很好的收斂時間,而且能夠容忍任何節點的失效和網絡隔離。盡管有許多類型的傳染算法,我們只關注反熵協議,因為NoSQL數據庫都在使用它。
反熵協議假定同步會按照一個固定進度表執行,每個節點定期隨機或是按照某種規則選擇另外一個節點交換數據,消除差異。有三種反風格的反熵協議:推,拉和混合。推協議的原理是簡單選取一個隨機節點然后把數據狀態發送過去。在真實應用中將全部數據都推送出去顯然是愚蠢的,所以節點一般按照下圖所示的方式工作。

節點A作為同步發起者準備好一份數據摘要,里面包含了A上數據的指紋。節點B接收到摘要之后將摘要中的數據與本地數據進行比較,并將數據差異做成一份摘要返回給A。最后,A發送一個更新給B,B再更新數據。拉方式和混合方式的協議與此類似,就如上圖所示的。
反熵協議提供了足夠好的收斂時間和擴展性。下圖展示了一個在100個節點的集群中傳播一個更新的模擬結果。在每次迭代中,每個節點只與一個隨機選取的對等節點發生聯系。

可以看到,拉方式的收斂性比推方式更好,這可以從理論上得到證明[7]。而且推方式還存在一個“收斂尾巴”的問題。在多次迭代之后,盡管幾乎遍歷到了所有的節點,但還是有很少的一部分沒受到影響。與單純的推和拉方式相比, 混合方式的效率更高,所以實際應用中通常使用這種方式。反熵是可擴展的,因為平均轉換時間以集群規模的對數函數形式增長。
盡管這些技術看起來很簡單,仍然有許多研究關注于不同約束條件下反熵協議的性能表現。其中之一通過一種更有效的結構使用網絡拓撲來取代隨機選取 [10] 。在網絡帶寬有限的條件下調整傳輸率或使用先進的規則來選取要同步的數據 [9]。摘要計算也面臨挑戰,數據庫會維護一份最近更新的日志以有助于摘要計算。
最終一致數據類型Eventually Consistent Data Types
在上一節我們假定兩個節點總是合并他們的數據版本。但要解決更新沖突并不容易,讓所有副本都最終達到一個語義上正確的值出乎意料的難。一個眾所周知的例子是Amazon Dynamo數據庫[8]中已經刪除的條目可以重現。
我們假設一個例子來說明這個問題:數據庫維護一個邏輯上的全局計數器,每個節點可以增加或者減少計數。雖然每個節點可以在本地維護一個自己的值,但這些本地計數卻不能通過簡單的加減來合并。假設這樣一個例子:有三個節點A、B和C,每個節點執行了一次加操作。如果A從B獲得一個值,并且加到本地副本上,然后C從B獲得值,然后C再從A獲得值,那么C最后的值是4,而這是錯誤的。解決這個問題的方法是用一個類似于向量時鐘[19]的數據結構為每個節點維護一對計數器[1]:
1 class Counter { 2 int[] plus 3 int[] minus 4 int NODE_ID 5 6 increment() { 7 plus[NODE_ID]++ 8 } 9 10 decrement() { 11 minus[NODE_ID]++ 12 } 13 14 get() { 15 return sum(plus) 国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
久草福利资源在线视频| 国产亚洲精品自在线观看| 成人日韩欧美| 午夜视频在线看| 国产精品白浆视频免费观看| 国产经典自拍视频在线观看| 精品全国在线一区二区| 精品一区二区三区高清免费不卡| 黄色av电影在线播放| 国产有码在线| 精品一区二区三区免费站| 国产欧美在线观看视频| 在线国产中文字幕| 国产免费电影网站入口| 综合蜜桃精品| 超碰在线影院| 伊人中文字幕在线| 国精一区二区三区| 999在线视频| 国产一级免费| 成人免费一区二区三区视频网站| 国产桃色电影在线播放| 国产福利在线免费观看| av中文在线资源| 国产成人精品男人的天堂538| av丝袜在线| 综合激情丁香| 日本高清中文字幕二区在线| 国产麻豆精品一区二区三区v视界| 国产叼嘿网站免费观看不用充会员| 91这里只有精品| 狠狠操视频网站| 日韩精品免费一区二区| 69久久精品| 国产精品bbw一区二区三区| 麻豆av电影在线观看| 伊人狠狠av| 在线看a视频| 亚洲欧美中文字幕在线观看 | 国产小视频在线| 91国内精品在线视频| 好男人社区在线视频| 日本一本久久| h网站免费在线观看| 一级二级在线观看| 精品一区二区三区高清免费不卡| 免费电影网站在线视频观看福利| 国产精品久久久久永久免费看| a视频在线播放| 18av在线播放| 伊人中文字幕在线| 伊人网站在线| www.91在线播放| 快射av在线播放一区| 免费国产阿v视频在线观看| 中文av字幕| www.狠狠操.com| 丁香花在线电影| 国产日韩欧美一区二区三区视频| 国产区成人精品视频| 国产黄网站在线观看| 国产日本在线| 精品成人一区二区三区免费视频| 中文在线观看视频| 92国产在线视频| 白浆爆出在线观看| 午夜免费福利在线观看| 最近中文字幕mv免费高清电影| 国产精品理人伦一区二区三区| 国产野外战在线播放| 国产区在线观看| 天天艹天天操| 国产亚洲精品久久久久久青梅 | 九九视频在线播放| 日本中文字幕视频在线| av高清在线| 国产精品一区二区资源| 2018狠狠干| 免费看的av| 97视频在线| √天堂资源地址在线官网| 天天插天天操| 精品美女在线观看视频在线观看 | 国产国语**毛片高清视频 | 国产免费黄视频在线观看| 中文字幕麻豆| 男人天堂亚洲| 香蕉视频网站在线观看| 国产美女视频一区二区二三区| 国产叼嘿网站免费观看不用充会员| 在线a人片免费观看视频| 国自产拍在线网站网址视频| 国产日本视频| 国产精品一区二区三区高清在线| 另类视频在线| av小说在线| 一区二区精品区| 精品美女调教视频| 国产黄色小视频| 国产精品ⅴa有声小说| 国产香蕉视频在线观看| 福利视频网站导航| 午夜视频免费在线观看| 国产蜜臀av在线播放| 免费99热在线观看| 超碰在线中文| 中文字幕麻豆| 2019天天操夜夜操| 在线视频观看亚洲| 99在线免费观看| 天天艹天天操| 丁香花高清在线观看完整版 | 在线观看av的网站| 九九热在线观看视频| 狠狠狠狠狠狠操| 国产午夜三区视频在线| 国产wwww| 欧美艹逼视频| 国产人成高清视频观看| 国产98在线| 日本免费不卡| 尤物在线视频| 精品视频一二区| 青娱乐在线视频观看| 福利视频在线看| 国产黄网站在线观看| 亚洲综合色视频在线观看 | 91久久精品国产性色| 精品美女在线观看视频在线观看| 中文一区在线观看| av三级在线观看| 成年人在线观看| 中文在线视频观看| 老鸭窝av在线| 在线视频观看亚洲| 国产视频中文字幕在线观看| av网址在线免费观看| 黄色免费av| 永久免费网站在线| 国产一卡二卡3卡4卡四卡在线| 精品日韩av| 美女免费视频黄| 精品推荐蜜桃传媒| 国产乱子伦三级在线播放| 91精品专区| 国产一级片在线| 九九在线视频| 爱福利在线视频| 亚洲欧美国产另类首页| 国产粉嫩一区二区三区在线观看| 女人色在线免费视频| 国产高清在线视频| 国产丝袜精品丝袜| 国产美女极品在线| 四虎网站在线观看| 国产99在线|亚洲| 中文字幕亚洲精品视频| 九九视频精品在线| 精品中文字幕不卡在线视频| 天天插天天射| 天天干天天摸| www.狠狠操.com| 久草.com| 最近中文字幕av免费高清| 2018av男人天堂| 国产亚洲精品自在线观看| 天堂资源最新版在线视频观看免费网| av在线网页| av在线资源网| 免费高清av| 99视频免费| 国产精品偷乱一区二区三区| 黄色国产网站在线播放| 国精一区二区三区| 午夜av在线免费观看| 久久亚洲国产成人亚| 黄色国产网站在线观看| 天堂中文在线视频| 2019年中文字幕| www在线视频观看| 国产另类图片| 中文字幕2019第三页| 免费精品国产自产拍观看| 国产在线小视频| 国产精品久久精品牛牛影视| 国产导航在线| 午夜在线视频| 国产在线小视频| 国产成人夜间影院在线观看| 亚洲欧美综合乱码精品成人网| 欧美日韩亚洲国内综合网| 九九热视频在线| 国产黄色av免费看| 在线观看的av| 国产美女福利在线| 在线一二三区| 中文字幕网站视频在线| 四虎在线免费视频| 国产黄色片在线播放| 国产在线观看网站|