国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

別再說你不會分布式了,面試官能問的都在這了

共 25140字,需瀏覽 51分鐘

 ·

2021-09-19 12:34

1 概念


1.1 模型


節(jié)點


在具體的工程項目中,一個節(jié)點往往是一個操作系統(tǒng)上的進程。在本文的模型中,認為節(jié)點是一個完整的、不可分的整體,如果某個程序進程實際上由若干相對獨立部分構(gòu)成,則在模型中可以將一個進程劃分為多個節(jié)點。


異常


  1. 機器宕機:機器宕機是最常見的異常之一。在大型集群中每日宕機發(fā)生的概率為千分之一左右,在實踐中,一臺宕機的機器恢復(fù)的時間通常認為是24 小時,一般需要人工介入重啟機器。

  2. 網(wǎng)絡(luò)異常:消息丟失,兩片節(jié)點之間彼此完全無法通信,即出現(xiàn)了“網(wǎng)絡(luò)分化”;消息亂序,有一定的概率不是按照發(fā)送時的順序依次到達目的節(jié)點,考慮使用序列號等機制處理網(wǎng)絡(luò)消息的亂序問題,使得無效的、過期的網(wǎng)絡(luò)消息不影響系統(tǒng)的正確性;數(shù)據(jù)錯誤;不可靠的TCP,TCP 協(xié)議為應(yīng)用層提供了可靠的、面向連接的傳輸服務(wù),但在分布式系統(tǒng)的協(xié)議設(shè)計中不能認為所有網(wǎng)絡(luò)通信都基于TCP 協(xié)議則通信就是可靠的。TCP協(xié)議只能保證同一個TCP 鏈接內(nèi)的網(wǎng)絡(luò)消息不亂序,TCP 鏈接之間的網(wǎng)絡(luò)消息順序則無法保證。

  3. 分布式三態(tài):如果某個節(jié)點向另一個節(jié)點發(fā)起RPC(Remote procedure call)調(diào)用,即某個節(jié)點A 向另一個節(jié)點B 發(fā)送一個消息,節(jié)點B 根據(jù)收到的消息內(nèi)容完成某些操作,并將操作的結(jié)果通過另一個消息返回給節(jié)點A,那么這個RPC 執(zhí)行的結(jié)果有三種狀態(tài):“成功”、“失敗”、“超時(未知)”,稱之為分布式系統(tǒng)的三態(tài)。

  4. 存儲數(shù)據(jù)丟失:對于有狀態(tài)節(jié)點來說,數(shù)據(jù)丟失意味著狀態(tài)丟失,通常只能從其他節(jié)點讀取、恢復(fù)存儲的狀態(tài)。

  5. 異常處理原則:被大量工程實踐所檢驗過的異常處理黃金原則是:任何在設(shè)計階段考慮到的異常情況一定會在系統(tǒng)實際運行中發(fā)生,但在系統(tǒng)實際運行遇到的異常卻很有可能在設(shè)計時未能考慮,所以,除非需求指標(biāo)允許,在系統(tǒng)設(shè)計時不能放過任何異常情況。


1.2 副本


副本(replica/copy)指在分布式系統(tǒng)中為數(shù)據(jù)或服務(wù)提供的冗余。對于數(shù)據(jù)副本指在不同的節(jié)點上持久化同一份數(shù)據(jù),當(dāng)出現(xiàn)某一個節(jié)點的存儲的數(shù)據(jù)丟失時,可以從副本上讀到數(shù)據(jù)。數(shù)據(jù)副本是分布式系統(tǒng)解決數(shù)據(jù)丟失異常的唯一手段。另一類副本是服務(wù)副本,指數(shù)個節(jié)點提供某種相同的服務(wù),這種服務(wù)一般并不依賴于節(jié)點的本地存儲,其所需數(shù)據(jù)一般來自其他節(jié)點。


副本協(xié)議是貫穿整個分布式系統(tǒng)的理論核心。


副本一致性


分布式系統(tǒng)通過副本控制協(xié)議,使得從系統(tǒng)外部讀取系統(tǒng)內(nèi)部各個副本的數(shù)據(jù)在一定的約束條件下相同,稱之為副本一致性(consistency)。副本一致性是針對分布式系統(tǒng)而言的,不是針對某一個副本而言。


  1. 強一致性(strong consistency):任何時刻任何用戶或節(jié)點都可以讀到最近一次成功更新的副本數(shù)據(jù)。強一致性是程度最高的一致性要求,也是實踐中最難以實現(xiàn)的一致性。

  2. 單調(diào)一致性(monotonic consistency):任何時刻,任何用戶一旦讀到某個數(shù)據(jù)在某次更新后的值,這個用戶不會再讀到比這個值更舊的值。單調(diào)一致性是弱于強一致性卻非常實用的一種一致性級別。因為通常來說,用戶只關(guān)心從己方視角觀察到的一致性,而不會關(guān)注其他用戶的一致性情況。

  3. 會話一致性(session consistency):任何用戶在某一次會話內(nèi)一旦讀到某個數(shù)據(jù)在某次更新后的值,這個用戶在這次會話過程中不會再讀到比這個值更舊的值。會話一致性通過引入會話的概念,在單調(diào)一致性的基礎(chǔ)上進一步放松約束,會話一致性只保證單個用戶單次會話內(nèi)數(shù)據(jù)的單調(diào)修改,對于不同用戶間的一致性和同一用戶不同會話間的一致性沒有保障。實踐中有許多機制正好對應(yīng)會話的概念,例如php 中的session 概念。

  4. 最終一致性(eventual consistency):最終一致性要求一旦更新成功,各個副本上的數(shù)據(jù)最終將達 到完全一致的狀態(tài),但達到完全一致狀態(tài)所需要的時間不能保障。對于最終一致性系統(tǒng)而言,一個用戶只要始終讀取某一個副本的數(shù)據(jù),則可以實現(xiàn)類似單調(diào)一致性的效果,但一旦用戶更換讀取的副本,則無法保障任何一致性。

  5. 弱一致性(week consistency):一旦某個更新成功,用戶無法在一個確定時間內(nèi)讀到這次更新的值,且即使在某個副本上讀到了新的值,也不能保證在其他副本上可以讀到新的值。弱一致性系統(tǒng)一般很難在實際中使用,使用弱一致性系統(tǒng)需要應(yīng)用方做更多的工作從而使得系統(tǒng)可用。


1.3 衡量分布式系統(tǒng)的指標(biāo)


  1. 性能:系統(tǒng)的吞吐能力,指系統(tǒng)在某一時間可以處理的數(shù)據(jù)總量,通常可以用系統(tǒng)每秒處理的總的數(shù)據(jù)量來衡量;系統(tǒng)的響應(yīng)延遲,指系統(tǒng)完成某一功能需要使用的時間;系統(tǒng)的并發(fā)能力,指系統(tǒng)可以同時完成某一功能的能力,通常也用QPS(query per second)來衡量。上述三個性能指標(biāo)往往會相互制約,追求高吞吐的系統(tǒng),往往很難做到低延遲;系統(tǒng)平均響應(yīng)時間較長時,也很難提高QPS。

  2. 可用性:系統(tǒng)的可用性(availability)指系統(tǒng)在面對各種異常時可以正確提供服務(wù)的能力。系統(tǒng)的可用性可以用系統(tǒng)停服務(wù)的時間與正常服務(wù)的時間的比例來衡量,也可以用某功能的失敗次數(shù)與成功次數(shù)的比例來衡量。可用性是分布式的重要指標(biāo),衡量了系統(tǒng)的魯棒性,是系統(tǒng)容錯能力的體現(xiàn)。

  3. 可擴展性:系統(tǒng)的可擴展性(scalability)指分布式系統(tǒng)通過擴展集群機器規(guī)模提高系統(tǒng)性能(吞吐、延遲、并發(fā))、存儲容量、計算能力的特性。好的分布式系統(tǒng)總在追求“線性擴展性”,也就是使得系統(tǒng)的某一指標(biāo)可以隨著集群中的機器數(shù)量線性增長。

  4. 一致性:分布式系統(tǒng)為了提高可用性,總是不可避免的使用副本的機制,從而引發(fā)副本一致性的問題。越是強的一致的性模型,對于用戶使用來說使用起來越簡單。


2 分布式系統(tǒng)原理


2.1 數(shù)據(jù)分布方式


所謂分布式系統(tǒng)顧名思義就是利用多臺計算機協(xié)同解決單臺計算機所不能解決的計算、存儲等問題。單機系統(tǒng)與分布式系統(tǒng)的最大的區(qū)別在于問題的規(guī)模,即計算、存儲的數(shù)據(jù)量的區(qū)別。將一個單機問題使用分布式解決,首先要解決的就是如何將問題拆解為可以使用多機分布式解決,使得分布式系統(tǒng)中的每臺機器負責(zé)原問題的一個子集。由于無論是計算還是存儲,其問題輸入對象都是數(shù)據(jù),所以如何拆解分布式系統(tǒng)的輸入數(shù)據(jù)成為分布式系統(tǒng)的基本問題。


哈希方式


哈希分布數(shù)據(jù)的缺點同樣明顯,突出表現(xiàn)為可擴展性不高,一旦集群規(guī)模需要擴展,則幾乎所有的數(shù)據(jù)需要被遷移并重新分布。工程中,擴展哈希分布數(shù)據(jù)的系統(tǒng)時,往往使得集群規(guī)模成倍擴展,按照數(shù)據(jù)重新計算哈希,這樣原本一臺機器上的數(shù)據(jù)只需遷移一半到另一臺對應(yīng)的機器上即可完成擴展。


針對哈希方式擴展性差的問題,一種思路是不再簡單的將哈希值與機器做除法取模映射,而是將對應(yīng)關(guān)系作為元數(shù)據(jù)由專門的元數(shù)據(jù)服務(wù)器管理.同時,哈希值取模個數(shù)往往大于機器個數(shù),這樣同一臺機器上需要負責(zé)多個哈希取模的余數(shù)。但需要以較復(fù)雜的機制維護大量的元數(shù)據(jù)。哈希分布數(shù)據(jù)的另一個缺點是,一旦某數(shù)據(jù)特征值的數(shù)據(jù)嚴(yán)重不均,容易出現(xiàn)“數(shù)據(jù)傾斜”(data skew)問題。


哈希分布數(shù)據(jù)的另一個缺點是,一旦某數(shù)據(jù)特征值的數(shù)據(jù)嚴(yán)重不均,容易出現(xiàn)“數(shù)據(jù)傾斜”(data skew)問題


按數(shù)據(jù)范圍分布


按數(shù)據(jù)范圍分布是另一個常見的數(shù)據(jù)分布式,將數(shù)據(jù)按特征值的值域范圍劃分為不同的區(qū)間,使得集群中每臺(組)服務(wù)器處理不同區(qū)間的數(shù)據(jù)。

工程中,為了數(shù)據(jù)遷移等負載均衡操作的方便,往往利用動態(tài)劃分區(qū)間的技術(shù),使得每個區(qū)間中服務(wù)的數(shù)據(jù)量盡量的一樣多。當(dāng)某個區(qū)間的數(shù)據(jù)量較大時,通過將區(qū)間“分裂”的方式拆分為兩個區(qū)間,使得每個數(shù)據(jù)區(qū)間中的數(shù)據(jù)量都盡量維持在一個較為固定的閾值之下。



一般的,往往需要使用專門的服務(wù)器在內(nèi)存中維護數(shù)據(jù)分布信息,稱這種數(shù)據(jù)的分布信息為一種元信息。甚至對于大規(guī)模的集群,由于元信息的規(guī)模非常龐大,單臺 計算機無法獨立維護,需要使用多臺機器作為元信息服務(wù)器。


按數(shù)據(jù)量分布


數(shù)據(jù)量分布數(shù)據(jù)與具體的數(shù)據(jù)特征無關(guān),而是將數(shù)據(jù)視為一個順序增長的文件,并將這個文件按照某一較為固定的大小劃分為若干數(shù)據(jù)塊(chunk),不同的數(shù)據(jù)塊分布到不同的服務(wù)器上。與按數(shù)據(jù)范圍分布數(shù)據(jù)的方式類似的是,按數(shù)據(jù)量分布數(shù)據(jù)也需要記錄數(shù)據(jù)塊的具體分布情況,并將該分布信息作為元數(shù)據(jù)使用元數(shù)據(jù)服務(wù)器管理。


由于與具體的數(shù)據(jù)內(nèi)容無關(guān),按數(shù)據(jù)量分布數(shù)據(jù)的方式一般沒有數(shù)據(jù)傾斜的問題,數(shù)據(jù)總是被均勻切分并分布到集群中。當(dāng)集群需要重新負載均衡時,只需通過遷移數(shù)據(jù)塊即可完成。集群擴容也沒有太大的限制,只需將部分數(shù)據(jù)庫遷移到新加入的機器上即可以完成擴容。按數(shù)據(jù)量劃分數(shù)據(jù)的缺點是需要管理較為復(fù)雜的元信息,與按范圍分布數(shù)據(jù)的方式類似,當(dāng)集群規(guī)模較大時,元信息的數(shù)據(jù)量也變得很大,高效的管理元信息成為新的課題。


一致性哈希


一致性哈希(consistent hashing)是另一個種在工程中使用較為廣泛的數(shù)據(jù)分布方式。一致性哈希最初在P2P 網(wǎng)絡(luò)中作為分布式哈希表(DHT)的常用數(shù)據(jù)分布算法。一致性哈希的基本方式是使用一個哈希函數(shù)計算數(shù)據(jù)或數(shù)據(jù)特征的哈希值,令該哈希函數(shù)的輸出值域為一個封閉的環(huán),即哈希函數(shù)輸出的最大值是最小值的前序。將節(jié)點隨機分布到這個環(huán)上,每個節(jié)點負責(zé)處理從自己開始順時針至下一個節(jié)點的全部哈希值域上的數(shù)據(jù)。

使用一致性哈希的方式需要將節(jié)點在一致性哈希環(huán)上的位置作為元信息加以管理,這點比直接使用哈希分布數(shù)據(jù)的方式要復(fù)雜。然而,節(jié)點的位置信息只于集群中的機器規(guī)模相關(guān),其元信息的量通常比按數(shù)據(jù)范圍分布數(shù)據(jù)和按數(shù)據(jù)量分布數(shù)據(jù)的元信息量要小很多。


為此一種常見的改進算法是引入虛節(jié)點(virtual node)的概念,系統(tǒng)初始時就創(chuàng)建許多虛節(jié)點,虛節(jié)點的個數(shù)一般遠大于未來集群中機器的個數(shù),將虛節(jié)點均勻分布到一致性哈希值域環(huán)上,其功能與基本一致性哈希算法中的節(jié)點相同。為每個節(jié)點分配若干虛節(jié)點。操作數(shù)據(jù)時,首先通過數(shù)據(jù)的哈希值在環(huán)上找到對應(yīng)的虛節(jié)點,進而查找元數(shù)據(jù)找到對應(yīng)的真實節(jié)點。使用虛節(jié)點改進有多個優(yōu)點。首先,一旦某個節(jié)點不可用,該節(jié)點將使得多個虛節(jié)點不可用,從而使得多個相鄰的真實節(jié)點負載失效節(jié)點的壓里。同理,一旦加入一個新節(jié)點,可以分配多個虛節(jié)點,從而使得新節(jié)點可以 負載多個原有節(jié)點的壓力,從全局看,較容易實現(xiàn)擴容時的負載均衡。


副本與數(shù)據(jù)分布


分布式系統(tǒng)容錯、提高可用性的基本手段就是使用副本。對于數(shù)據(jù)副本的分布方式主要影響系統(tǒng)的可擴展性。一種基本的數(shù)據(jù)副本策略是以機器為單位,若干機器互為副本,副本機器之間的數(shù)據(jù)完全相同。這種策略適用于上述各種數(shù)據(jù)分布方式。其優(yōu)點是非常簡單,其缺點是恢復(fù)數(shù)據(jù)的效率不高、可擴展性也不高。


更合適的做法不是以機器作為副本單位,而是將數(shù)據(jù)拆為較合理的數(shù)據(jù)段,以數(shù)據(jù)段為單位作為副本。實踐中,常常使得每個數(shù)據(jù)段的大小盡量相等且控制在一定的大小以內(nèi)。數(shù)據(jù)段有很多不同的稱謂,segment,fragment,chunk,partition 等等。數(shù)據(jù)段的選擇與數(shù)據(jù)分布方式直接相關(guān)。對于哈希分數(shù)據(jù)的方式,每個哈希分桶后的余數(shù)可以作為一個數(shù)據(jù)段,為了控制數(shù)據(jù)段的大小,常常使得分桶個數(shù)大于集群規(guī)模。一旦將數(shù)據(jù)分為數(shù)據(jù)段,則可以以數(shù)據(jù)段為單位管理副本,從而副本與機器不再硬相關(guān),每臺機器都可以負責(zé)一定數(shù)據(jù)段的副本。



一旦副本分布與機器無關(guān),數(shù)據(jù)丟失后的恢復(fù)效率將非常高。這是因為,一旦某臺機器的數(shù)據(jù)丟失,其上數(shù)據(jù)段的副本將分布在整個集群的所有機器中,而不是僅在幾個副本機器中,從而可以從整個集群同時拷貝恢復(fù)數(shù)據(jù),而集群中每臺數(shù)據(jù)源機器都可以以非常低的資源做拷貝。作為恢復(fù)數(shù)據(jù)源的機器即使都限速1MB/s,若有100 臺機器參與恢復(fù),恢復(fù)速度也能達到100MB/s。再者,副本分布與機器無關(guān)也利于集群容錯。如果出現(xiàn)機器宕機,由于宕機機器上的副本分散于整個集群,其壓力也自然分散到整個集群。最后,副本分布與機器無關(guān)也利于集群擴展。理論上,設(shè)集群規(guī)模 為N 臺機器,當(dāng)加入一臺新的機器時,只需從各臺機器上遷移1/N – 1/N+1 比例的數(shù)據(jù)段到新機器即實現(xiàn)了新的負載均衡。由于是從集群中各機器遷移數(shù)據(jù),與數(shù)據(jù)恢復(fù)同理,效率也較高。工程中,完全按照數(shù)據(jù)段建立副本會引起需要管理的元數(shù)據(jù)的開銷增大,副本維護的難度也相應(yīng)增大。一種折中的做法是將某些數(shù)據(jù)段組成一個數(shù)據(jù)段分組,按數(shù)據(jù)段分組為粒度進行副本管理。這樣做可以將副本粒度控制在一個較為合適的范圍內(nèi)。



本地化計算


在分布式系統(tǒng)中,數(shù)據(jù)的分布方式也深深影響著計算的分布方式。在分布式系統(tǒng)中計算節(jié)點和保存計算數(shù)據(jù)的存儲節(jié)點可以在同一臺物理機器上,也可以位于不同的物理機器。如果計算節(jié)點和存儲節(jié)點位于不同的物理機器則計算的數(shù)據(jù)需要通過網(wǎng)絡(luò)傳輸,此種方式的開銷很大,甚至網(wǎng)絡(luò)帶寬會成為系統(tǒng)的總體瓶頸。另一種思路是,將計算盡量調(diào)度到與存儲節(jié)點在同一臺物理機器上的計算節(jié)點上進行,這稱之為本地化計算。本地化計算是計算調(diào)度的一種重要優(yōu)化,其體現(xiàn)了一種重要的分布式調(diào)度思想:“移動數(shù)據(jù)不如移動計算”。


數(shù)據(jù)分布方式的選擇


在實際工程實踐中,可以根據(jù)需求及實施復(fù)雜度合理選擇數(shù)據(jù)分布方式。另外,數(shù)據(jù)分布方式是可以靈活組合使用的,往往可以兼?zhèn)涓鞣N方式的優(yōu)點,收到較好的綜合效果。


例:數(shù)據(jù)傾斜問題,在按哈希分數(shù)據(jù)的基礎(chǔ)上引入按數(shù)據(jù)量分布數(shù)據(jù)的方式,解決該數(shù)據(jù)傾斜問題。按用戶id 的哈希值分數(shù)據(jù),當(dāng)某個用戶id 的數(shù)據(jù)量特別大時,該用戶的數(shù)據(jù)始終落在某一臺機器上。此時,引入按數(shù)據(jù)量分布數(shù)據(jù)的方式,統(tǒng)計用戶的數(shù)據(jù)量,并按某一閾值將用戶的數(shù)據(jù)切為多個均勻的數(shù)據(jù)段,將這些數(shù)據(jù)段分布到集群中去。由于大部分用戶的數(shù)據(jù)量不會超過閾值,所以元數(shù)據(jù)中僅僅保存超過閾值的用戶的數(shù)據(jù)段分布信息,從而可以控制元數(shù)據(jù)的規(guī)模。這種哈希分布數(shù)據(jù)方式與按數(shù)據(jù)量分布數(shù)據(jù)方式組合使用的方案,在某真實系統(tǒng)中使用,取得了較好的效果。


2.2 基本副本協(xié)議


副本控制協(xié)議指按特定的協(xié)議流程控制副本數(shù)據(jù)的讀寫行為,使得副本滿足一定的可用性和一致性要求的分布式協(xié)議。副本控制協(xié)議要具有一定的對抗異常狀態(tài)的容錯能力,從而使得系統(tǒng)具有一定的可用性,同時副本控制協(xié)議要能提供一定一致性級別。由CAP 原理(在2.9 節(jié)詳細分析)可知,要設(shè)計一種滿足強一致性,且在出現(xiàn)任何網(wǎng)絡(luò)異常時都可用的副本協(xié)議是不可能的。為此,實際中的副本控制協(xié)議總是在可用性、一致性與性能等各要素之間按照具體需求折中。


副本控制協(xié)議可以分為兩大類:“中心化(centralized)副本控制協(xié)議”和“去中心化(decentralized)副本控制協(xié)議”。


中心化副本控制協(xié)議


中心化副本控制協(xié)議的基本思路是由一個中心節(jié)點協(xié)調(diào)副本數(shù)據(jù)的更新、維護副本之間的一致性。圖給出了中心化副本協(xié)議的通用架構(gòu)。中心化副本控制協(xié)議的優(yōu)點是協(xié)議相對較為簡單,所有的副本相關(guān)的控制交由中心節(jié)點完成。并發(fā)控制將由中心節(jié)點完成,從而使得一個分布式并發(fā)控制問題,簡化為一個單機并發(fā)控制問題。所謂并發(fā)控制,即多個節(jié)點同時需要修改副本數(shù)據(jù)時,需要解決“寫寫”、“讀寫”等并發(fā)沖突。單機系統(tǒng)上常用加鎖等方式進行并發(fā)控制。對于分布式并發(fā)控制,加鎖也是一個常用的方法,但如果沒有中心節(jié)點統(tǒng)一進行鎖管理,就需要完全分布式化的鎖系統(tǒng),會使得協(xié)議非常復(fù)雜。中心化副本控制協(xié)議的缺點是系統(tǒng)的可用性依賴于中心化節(jié)點,當(dāng)中心節(jié)點異?;蚺c中心節(jié)點通信中斷時,系統(tǒng)將失去某些服務(wù)(通常至少失去更新服務(wù)),所以中心化副本控制協(xié)議的缺點正是存在一定的停服務(wù)時間。

primary-secondary 協(xié)議


在primary-secondary 類型的協(xié)議中,副本被分為兩大類,其中有且僅有一個副本作為primary 副本,除primary 以外的副本都作為secondary 副本。維護primary 副本的節(jié)點作為中心節(jié)點,中心節(jié)點負責(zé)維護數(shù)據(jù)的更新、并發(fā)控制、協(xié)調(diào)副本的一致性。


Primary-secondary 類型的協(xié)議一般要解決四大類問題:數(shù)據(jù)更新流程、數(shù)據(jù)讀取方式、Primary 副本的確定和切換、數(shù)據(jù)同步(reconcile)。


數(shù)據(jù)更新基本流程
  1. 數(shù)據(jù)更新都由primary 節(jié)點協(xié)調(diào)完成。

  2. 外部節(jié)點將更新操作發(fā)給primary 節(jié)點

  3. primary 節(jié)點進行并發(fā)控制即確定并發(fā)更新操作的先后順序

  4. primary 節(jié)點將更新操作發(fā)送給secondary 節(jié)點

  5. primary 根據(jù)secondary 節(jié)點的完成情況決定更新是否成功并將結(jié)果返回外部節(jié)點



在工程實踐中,如果由primary 直接同時發(fā)送給其他N 個副本發(fā)送數(shù)據(jù),則每個 secondary 的更新吞吐受限于primary 總的出口網(wǎng)絡(luò)帶寬,最大為primary 網(wǎng)絡(luò)出口帶寬的1/N。為了解決這個問題,有些系統(tǒng)(例如,GFS),使用接力的方式同步數(shù)據(jù),即primary 將更新發(fā)送給第一 個secondary 副本,第一個secondary 副本發(fā)送給第二secondary 副本,依次類推。


數(shù)據(jù)讀取方式


數(shù)據(jù)讀取方式也與一致性高度相關(guān)。如果只需要最終一致性,則讀取任何副本都可以滿足需求。如果需要會話一致性,則可以為副本設(shè)置版本號,每次更新后遞增版本號,用戶讀取副本時驗證版本號,從而保證用戶讀到的數(shù)據(jù)在會話范圍內(nèi)單調(diào)遞增。使用primary-secondary 比較困難的是實現(xiàn)強一致性。


  1. 由于數(shù)據(jù)的更新流程都是由primary 控制的,primary 副本上的數(shù)據(jù)一定是最新的,所以 如果始終只讀primary 副本的數(shù)據(jù),可以實現(xiàn)強一致性。如果只讀primary 副本,則secondary 副本將不提供讀服務(wù)。實踐中,如果副本不與機器綁定,而是按照數(shù)據(jù)段為單位維護副本,僅有primary 副本提供讀服務(wù)在很多場景下并不會造出機器資源浪費。


將副本分散到集群中個,假設(shè)primary 也是隨機的確定的,那么每臺機器上都有一些數(shù)據(jù)的primary 副本,也有另一些數(shù)據(jù)段的secondary 副本。從而某臺服務(wù)器實際都提供讀寫服務(wù)。


  1. 由primary 控制節(jié)點secondary 節(jié)點的可用性。當(dāng)primary 更新某個secondary 副本不成功時,primary 將該secondary 副本標(biāo)記為不可用,從而用戶不再讀取該不可用的副本。不可用的 secondary 副本可以繼續(xù)嘗試與primary 同步數(shù)據(jù),當(dāng)與primary 完成數(shù)據(jù)同步后,primary 可以副本標(biāo)記為可用。這種方式使得所有的可用的副本,無論是primary 還是secondary 都是可讀的,且在一個確定的時間內(nèi),某secondary 副本要么更新到與primary 一致的最新狀態(tài),要么被標(biāo)記為不可用,從而符合較高的一致性要求。這種方式依賴于一個中心元數(shù)據(jù)管理系統(tǒng),用于記錄哪些副本可用,哪些副本不可用。某種意義上,該方式通過降低系統(tǒng)的可用性來提高系統(tǒng)的一致性。


primary 副本的確定與切換


在primary-secondary 類型的協(xié)議中,另一個核心的問題是如何確定primary 副本,尤其是在原primary 副本所在機器出現(xiàn)宕機等異常時,需要有某種機制切換primary 副本,使得某個secondary 副本成為新的primary 副本。


通常的,在primary-secondary 類型的分布式系統(tǒng)中,哪個副本是primary 這一信息都屬于元信息,由專門的元數(shù)據(jù)服務(wù)器維護。執(zhí)行更新操作時,首先查詢元數(shù)據(jù)服務(wù)器獲取副本的primary 信息,從而進一步執(zhí)行數(shù)據(jù)更新流程。


由于分布式系統(tǒng)中可靠的發(fā)現(xiàn)節(jié)點異常是需要一定的探測時間的,這樣的探測時間通常是10 秒級別,這也意味著一旦primary 異常,最多需要10 秒級別的發(fā)現(xiàn)時間,系統(tǒng)才能開始primary 的切換,在這10 秒時間內(nèi),由于沒有primary,系統(tǒng)不能提供更 新服務(wù),如果系統(tǒng)只能讀primary 副本,則這段時間內(nèi)甚至不能提供讀服務(wù)。從這里可以看到,primary-backup 類副本協(xié)議的最大缺點就是由于primary 切換帶來的一定的停服務(wù)時間。


數(shù)據(jù)同步


不一致的secondary 副本需要與primary 進行同步(reconcile)。


通常不一致的形式有三種:一、由于網(wǎng)絡(luò)分化等異常,secondary 上的數(shù)據(jù)落后于primary 上的數(shù)據(jù)。二、在某些協(xié)議下,secondary 上的數(shù)據(jù)有可能是臟數(shù)據(jù),需要被丟棄。所謂臟數(shù)據(jù)是由于primary 副本沒有進行某一更新操作,而secondary 副本上反而進行的多余的修改操作,從而造成secondary 副本數(shù)據(jù)錯誤。三、secondary 是一個新增加的副本,完全沒有數(shù)據(jù),需要從其他副本上拷貝數(shù)據(jù)。


對于第一種secondary 數(shù)據(jù)落后的情況,常見的同步方式是回放primary 上的操作日志(通常是redo 日志),從而追上primary 的更新進度。對于臟數(shù)據(jù)的情況,較好的做法是設(shè)計的分布式協(xié)議不產(chǎn)生臟數(shù)據(jù)。如果協(xié)議一定有產(chǎn)生臟數(shù)據(jù)的可能,則也應(yīng)該使得產(chǎn)生臟數(shù)據(jù)的概率降到非常低得情況,從而一旦發(fā)生臟數(shù)據(jù)的情況可以簡單的直接丟棄有臟數(shù)據(jù)的副本,這樣相當(dāng)于副本沒有數(shù)據(jù)。另外,也可以設(shè)計一些基于undo 日志的方式從而可以刪除臟數(shù)據(jù)。如果secondary 副本完全沒有數(shù)據(jù),則常見的做法是直接拷貝primary 副本的數(shù)據(jù),這種方法往往比回放日志追更新進度的方法快很多。但拷貝數(shù)據(jù)時primary 副本需要能夠繼續(xù)提供更新服務(wù),這就要求primary 副本支持快照(snapshot)功能。即對某一刻的副本數(shù)據(jù)形成快照,然后拷貝快照,拷貝完成后使用回放日志的方式追快照形成后的更新操作。


去中心化副本控制協(xié)議


去中心化副本控制協(xié)議沒有中心節(jié)點,協(xié)議中所有的節(jié)點都是完全對等的,節(jié)點之間通過平等協(xié)商達到一致。從而去中心化協(xié)議沒有因為中心化節(jié)點異常而帶來的停服務(wù)等問題。

去中心化協(xié)議的最大的缺點是協(xié)議過程通常比較復(fù)雜。尤其當(dāng)去中心化協(xié)議需要實現(xiàn)強一致性時,協(xié)議流程變得復(fù)雜且不容易理解。由于流程的復(fù)雜,去中心化協(xié)議的效率或者性能一般也較中心化協(xié)議低。一個不恰當(dāng)?shù)谋确骄褪?,中心化副本控制協(xié)議類似專制制度,系統(tǒng)效率高但高度依賴于中心節(jié)點,一旦中心節(jié)點異常,系統(tǒng)受到的影響較大;去中心化副本控制協(xié)議類似民主制度,節(jié)點集體協(xié)商,效率低下,但個別節(jié)點的異常不會對系統(tǒng)總體造成太大影響。


2.3 Lease 機制


Lease 機制是最重要的分布式協(xié)議,廣泛應(yīng)用于各種實際的分布式系統(tǒng)中。


基于lease 的分布式cache 系統(tǒng)


基本的問題背景如下:在一個分布式系統(tǒng)中,有一個中心服務(wù)器節(jié)點,中心服務(wù)器存儲、維護著一些數(shù)據(jù),這些數(shù)據(jù)是系統(tǒng)的元數(shù)據(jù)。系統(tǒng)中其他的節(jié)點通過訪問中心服務(wù)器節(jié)點讀取、修改其上的元數(shù)據(jù)。由于系統(tǒng)中各種操作都依賴于元數(shù)據(jù),如果每次讀取元數(shù)據(jù)的操作都訪問中心服務(wù)器 節(jié)點,那么中心服務(wù)器節(jié)點的性能成為系統(tǒng)的瓶頸。為此,設(shè)計一種元數(shù)據(jù)cache,在各個節(jié)點上 cache 元數(shù)據(jù)信息,從而減少對中心服務(wù)器節(jié)點的訪問,提高性能。另一方面,系統(tǒng)的正確運行嚴(yán)格依賴于元數(shù)據(jù)的正確,這就要求各個節(jié)點上cache 的數(shù)據(jù)始終與中心服務(wù)器上的數(shù)據(jù)一致,cache 中的數(shù)據(jù)不能是舊的臟數(shù)據(jù)。最后,設(shè)計的cache 系統(tǒng)要能最大可能的處理節(jié)點宕機、網(wǎng)絡(luò)中斷等異常,最大程度的提高系統(tǒng)的可用性。


為此,利用lease 機制設(shè)計一套cache 系統(tǒng),其基本原理為如下。中心服務(wù)器在向各節(jié)點發(fā)送數(shù)據(jù)時同時向節(jié)點頒發(fā)一個lease。每個lease 具有一個有效期,和信用卡上的有效期類似,lease 上的 有效期通常是一個明確的時間點,例如12:00:10,一旦真實時間超過這個時間點,則lease 過期失效。這樣lease 的有效期與節(jié)點收到lease 的時間無關(guān),節(jié)點可能收到lease 時該lease 就已經(jīng)過期失效。這里首先假設(shè)中心服務(wù)器與各節(jié)點的時鐘是同步的,在下節(jié)中討論時鐘不同步對lease 的影響。中心服務(wù)器發(fā)出的lease 的含義為:在lease 的有效期內(nèi),中心服務(wù)器保證不會修改對應(yīng)數(shù)據(jù)的值。因此,節(jié)點收到數(shù)據(jù)和lease 后,將數(shù)據(jù)加入本地Cache,一旦對應(yīng)的lease 超時,節(jié)點將對應(yīng)的本地cache 數(shù)據(jù)刪除。中心服務(wù)器在修改數(shù)據(jù)時,首先阻塞所有新的讀請求,并等待之前為該數(shù)據(jù)發(fā)出的所有l(wèi)ease 超時過期,然后修改數(shù)據(jù)的值。


基于lease 的cache,客戶端節(jié)點讀取元數(shù)據(jù)


  1. 判斷元數(shù)據(jù)是否已經(jīng)處于本地cache 且lease 處于有效期內(nèi)1.1 是:直接返回cache 中的元數(shù)據(jù)1.2 否:向中心服務(wù)器節(jié)點請求讀取元數(shù)據(jù)信息1.2.1 服務(wù)器收到讀取請求后,返回元數(shù)據(jù)及一個對應(yīng)的lease 1.2.2 客戶端是否成功收到服務(wù)器返回的數(shù)據(jù)   1.2.2.1 失敗或超時:退出流程,讀取失敗,可重試1.2.2.2 成功:將元數(shù)據(jù)與該元數(shù)據(jù)的lease 記錄到內(nèi)存中,返回元數(shù)據(jù)

  2. 基于lease 的cache,客戶端節(jié)點修改元數(shù)據(jù)流程2.1 節(jié)點向服務(wù)器發(fā)起修改元數(shù)據(jù)請求。2.2 服務(wù)器收到修改請求后,阻塞所有新的讀數(shù)據(jù)請求,即接收讀請求,但不返回數(shù)據(jù)。2.3 服務(wù)器等待所有與該元數(shù)據(jù)相關(guān)的lease 超時。2.4 服務(wù)器修改元數(shù)據(jù)并向客戶端節(jié)點返回修改成功。


上述機制可以保證各個節(jié)點上的cache 與中心服務(wù)器上的中心始終一致。這是因為中心服務(wù)器節(jié)點在發(fā)送數(shù)據(jù)的同時授予了節(jié)點對應(yīng)的lease,在lease 有效期內(nèi),服務(wù)器不會修改數(shù)據(jù),從而客戶端節(jié)點可以放心的在lease 有效期內(nèi)cache 數(shù)據(jù)。上述lease 機制可以容錯的關(guān)鍵是:服務(wù)器一旦 發(fā)出數(shù)據(jù)及l(fā)ease,無論客戶端是否收到,也無論后續(xù)客戶端是否宕機,也無論后續(xù)網(wǎng)絡(luò)是否正常,服務(wù)器只要等待lease 超時,就可以保證對應(yīng)的客戶端節(jié)點不會再繼續(xù)cache 數(shù)據(jù),從而可以放心的修改數(shù)據(jù)而不會破壞cache 的一致性。


上述基礎(chǔ)流程有一些性能和可用性上的問題,但可以很容易就優(yōu)化改性。優(yōu)化點一:服務(wù)器在修改元數(shù)據(jù)時首先要阻塞所有新的讀請求,造成沒有讀服務(wù)。這是為了防止發(fā)出新的lease 從而引起不斷有新客戶端節(jié)點持有l(wèi)ease 并緩存著數(shù)據(jù),形成“活鎖”。優(yōu)化的方法很簡單,服務(wù)器在進入修改數(shù)據(jù)流程后,一旦收到讀請求則只返回數(shù)據(jù)但不頒發(fā)lease。從而造成在修改流程執(zhí)行的過程中,客戶端可以讀到元數(shù)據(jù),只是不能緩存元數(shù)據(jù)。進一步的優(yōu)化是,當(dāng)進入修改流程,服務(wù)器頒發(fā)的lease 有效期限選擇為已發(fā)出的lease 的最大有效期限。這樣做,客戶端可以繼續(xù)在服務(wù)器進入修改流程后繼續(xù)緩存元數(shù)據(jù),但服務(wù)器的等待所有l(wèi)ease 過期的時間也不會因為頒發(fā)新的lease 而不斷延長。


最后,=cache 機制與多副本機制的區(qū)別。Cache 機制與多副本機制的相似之處都 是將一份數(shù)據(jù)保存在多個節(jié)點上。但Cache 機制卻要簡單許多,對于cache 的數(shù)據(jù),可以隨時刪除丟棄,并命中cache 的后果僅僅是需要訪問數(shù)據(jù)源讀取數(shù)據(jù);然而副本機制卻不一樣,副本是不能隨意丟棄的,每失去一個副本,服務(wù)質(zhì)量都在下降,一旦副本數(shù)下降到一定程度,則往往服務(wù)將不再可用。


lease 機制的分析


lease 的定義:Lease 是由頒發(fā)者授予的在某一有效期內(nèi)的承諾。頒發(fā)者一旦發(fā)出lease,則無論接受方是否收到,也無論后續(xù)接收方處于何種狀態(tài),只要lease 不過期,頒發(fā)者一定嚴(yán)守承諾;另一方面,接收方在lease 的有效期內(nèi)可以使用頒發(fā)者的承諾,但一旦lease 過期,接收方一定不能繼續(xù)使用頒發(fā)者的承諾。


Lease 機制具有很高的容錯能力。首先,通過引入有效期,Lease 機制能否非常好的容錯網(wǎng)絡(luò)異常。Lease 頒發(fā)過程只依賴于網(wǎng)絡(luò)可以單向通信,即使接收方無法向頒發(fā)者發(fā)送消息,也不影響lease 的頒發(fā)。由于lease 的有效期是一個確定的時間點,lease 的語義與發(fā)送lease 的具體時間無關(guān),所以 同一個lease 可以被頒發(fā)者不斷重復(fù)向接受方發(fā)送。即使頒發(fā)者偶爾發(fā)送lease 失敗,頒發(fā)者也可以 簡單的通過重發(fā)的辦法解決。一旦lease 被接收方成功接受,后續(xù)lease 機制不再依賴于網(wǎng)絡(luò)通信,即使網(wǎng)絡(luò)完全中斷l(xiāng)ease 機制也不受影響。再者,Lease 機制能較好的容錯節(jié)點宕機。如果頒發(fā)者宕機,則宕機的頒發(fā)者通常無法改變之前的承諾,不會影響lease 的正確性。在頒發(fā)者機恢復(fù)后,如果頒發(fā)者恢復(fù)出了之前的lease 信息,頒發(fā)者可以繼續(xù)遵守lease 的承諾。如果頒發(fā)者無法恢復(fù)lease 信息,則只需等待一個最大的lease 超時時間就可以使得所有的lease 都失效,從而不破壞lease機制。


例如上節(jié)中的cache 系統(tǒng)的例子中,一旦服務(wù)器宕機,肯定不會修改元數(shù)據(jù),重新恢復(fù)后,只需等待一個最大的lease 超時時間,所有節(jié)點上的緩存信息都將被清空。對于接受方宕機的情況,頒發(fā)者 不需要做更多的容錯處理,只需等待lease 過期失效,就可以收回承諾,實踐中也就是收回之前賦予的權(quán)限、身份等。最后,lease 機制不依賴于存儲。頒發(fā)者可以持久化頒發(fā)過的lease 信息,從而在 宕機恢復(fù)后可以使得在有效期的lease 繼續(xù)有效。但這對于lease 機制只是一個優(yōu)化,如之前的分析,即使頒發(fā)者沒有持久化lease 信息,也可以通過等待一個最大的lease 時間的方式使得之前所有頒發(fā) 的lease 失效,從而保證機制繼續(xù)有效。


Lease 機制依賴于有效期,這就要求頒發(fā)者和接收者的時鐘是同步的。一方面,如果頒發(fā)者的 時鐘比接收者的時鐘慢,則當(dāng)接收者認為lease 已經(jīng)過期的時候,頒發(fā)者依舊認為lease 有效。接收者可以用在lease 到期前申請新的lease 的方式解決這個問題。另一方面,如果頒發(fā)者的時鐘比接收 者的時鐘快,則當(dāng)頒發(fā)者認為lease 已經(jīng)過期的時候,接收者依舊認為lease 有效,頒發(fā)者可能將lease 頒發(fā)給其他節(jié)點,造成承諾失效,影響系統(tǒng)的正確性。對于這種時鐘不同步,實踐中的通常做法是將頒發(fā)者的有效期設(shè)置得比接收者的略大,只需大過時鐘誤差就可以避免對lease 的有效性的影響。


基于lease 機制確定節(jié)點狀態(tài)


分布式協(xié)議依賴于對節(jié)點狀態(tài)認知的全局一致性,即一旦節(jié)點Q 認為某個節(jié)點 A 異常,則節(jié)點A 也必須認為自己異常,從而節(jié)點A 停止作為primary,避免“雙主”問題的出現(xiàn)。解決這種問題有兩種思路,第一、設(shè)計的分布式協(xié)議可以容忍“雙主”錯誤,即不依賴于對節(jié)點狀 態(tài)的全局一致性認識,或者全局一致性狀態(tài)是全體協(xié)商后的結(jié)果;第二、利用lease 機制。對于第一 種思路即放棄使用中心化的設(shè)計,而改用去中心化設(shè)計,超過本節(jié)的討論范疇。下面著重討論利用 lease 機制確定節(jié)點狀態(tài)。


由中心節(jié)點向其他節(jié)點發(fā)送lease,若某個節(jié)點持有有效的lease,則認為該節(jié)點正??梢蕴峁┓?務(wù)。用于例2.3.1 中,節(jié)點A、B、C 依然周期性的發(fā)送heart beat 報告自身狀態(tài),節(jié)點Q 收到heart beat 后發(fā)送一個lease,表示節(jié)點Q 確認了節(jié)點A、B、C 的狀態(tài),并允許節(jié)點在lease 有效期內(nèi)正常工 作。節(jié)點Q 可以給primary 節(jié)點一個特殊的lease,表示節(jié)點可以作為primary 工作。一旦節(jié)點Q 希望切換新的primary,則只需等前一個primary 的lease 過期,則就可以安全的頒發(fā)新的lease 給新的 primary 節(jié)點,而不會出現(xiàn)“雙主”問題。


在實際系統(tǒng)中,若用一個中心節(jié)點發(fā)送lease 也有很大的風(fēng)險,一旦該中心節(jié)點宕機或網(wǎng)絡(luò)異常,則所有的節(jié)點沒有l(wèi)ease,從而造成系統(tǒng)高度不可用。為此,實際系統(tǒng)總是使用多個中心節(jié)點互為副本,成為一個小的集群,該小集群具有高可用性,對外提供頒發(fā)lease 的功能。chubby 和zookeeper 都是基于這樣的設(shè)計。


lease 的有效期時間選擇


工程中,常選擇的lease 時長是10 秒級別,這是一個經(jīng)過驗證的經(jīng)驗值,實踐中可以作為參考并綜合選擇合適的時長。


2.4 Quorum 機制


先做這樣的約定:更新操作(write)是一系列順序的過程,通過其他機制確定更新操作的順序(例如primary-secondary 架構(gòu)中由primary 決定順序),每個更新操作記為wi, i 為更新操作單調(diào)遞增的序號,每個wi 執(zhí)行成功后副本數(shù)據(jù)都發(fā)生變化,稱為不同的數(shù)據(jù)版本,記 作vi。假設(shè)每個副本都保存了歷史上所有版本的數(shù)據(jù)。


write-all-read-one


Write-all-read-one(簡稱WARO)是一種最簡單的副本控制規(guī)則,顧名思義即在更新時寫所有的副本,只有在所有的副本上更新成功,才認為更新成功,從而保證所有的副本一致,這樣在讀取數(shù)據(jù)時可以讀任一副本上的數(shù)據(jù)。


由于更新操作需要在所有的N 個副本上都成功,更新操作才能成 功,所以一旦有一個副本異常,更新操作失敗,更新服務(wù)不可用。對于更新服務(wù),雖然有N 個副本, 但系統(tǒng)無法容忍任何一個副本異常。另一方面,N 個副本中只要有一個副本正常,系統(tǒng)就可以提供讀服務(wù)。對于讀服務(wù)而言,當(dāng)有N 個副本時,系統(tǒng)可以容忍N-1 個副本異常。從上述分析可以發(fā)現(xiàn)WARO 讀服務(wù)的可用性較高,但更新服務(wù)的可用性不高,甚至雖然使用了副本,但更新服務(wù)的可用性等效于沒有副本。


Quorum 定義


在Quorum 機制下,當(dāng)某次更新操作wi 一旦在所有N 個副本中的W 個副本上都成功,則就稱 該更新操作為“成功提交的更新操作”,稱對應(yīng)的數(shù)據(jù)為“成功提交的數(shù)據(jù)”。令R>N-W,由于更新 操作wi 僅在W 個副本上成功,所以在讀取數(shù)據(jù)時,最多需要讀取R 個副本則一定能讀到wi 更新后 的數(shù)據(jù)vi 。如果某次更新wi 在W 個副本上成功,由于W+R>N,任意R 個副本組成的集合一定與 成功的W個副本組成的集合有交集,所以讀取R 個副本一定能讀到wi 更新后的數(shù)據(jù)vi。如圖 2-10, Quorum 機制的原理可以文森圖表示。

某系統(tǒng)有5 個副本,W=3,R=3,最初5 個副本的數(shù)據(jù)一致,都是v1,某次更新操作 w2 在前3 副本上成功,副本情況變成(v2 v2 v2 v1 v1)。此時,任意3 個副本組成的集合中一定包括 v2。在上述定義中,令W=N,R=1,就得到WARO,即WARO 是Quorum 機制的一種特例。與分析WARO 相似,分析Quorum 機制的可用性。限制Quorum 參數(shù)為W+R=N+1。由于更新 操作需要在W 個副本上都成功,更新操作才能成功,所以一旦N-W+1 個副本異常,更新操作始終無法在W 個副本上成功,更新服務(wù)不可用。另一方面,一旦N-R+1 個副本異常,則無法保證一定可以讀到與W 個副本有交集的副本集合,則讀服務(wù)的一致性下降。


再次強調(diào):僅僅依賴quorum 機制是無法保證強一致性的。因為僅有quorum 機制時無法確定最新已成功提交的版本號,除非將最新已提交的版本號作為元數(shù)據(jù)由特定的元數(shù)據(jù)服務(wù)器或元數(shù)據(jù)集群管理,否則很難確定最新成功提交的版本號。在下一節(jié)中,將討論在哪些情況下,可以僅僅 通過quorum 機制來確定最新成功提交的版本號。


Quorum 機制的三個系統(tǒng)參數(shù)N、W、R 控制了系統(tǒng)的可用性,也是系統(tǒng)對用戶的服務(wù)承諾:數(shù)據(jù)最多有N 個副本,但數(shù)據(jù)更新成功W 個副本即返回用戶成功。對于一致性要求較高的Quorum 系統(tǒng),系統(tǒng)還應(yīng)該承諾任何時候不讀取未成功提交的數(shù)據(jù),即讀取到的數(shù)據(jù)都是曾經(jīng)在W 個副本上成功的數(shù)據(jù)。


讀取最新成功提交的數(shù)據(jù)


Quorum 機制只需成功更新N 個副本中的W 個,在讀取R 個副本時,一定可以讀到最新的成功提交的數(shù)據(jù)。但由于有不成功的更新情況存在,僅僅讀取R 個副本卻不一定能確定哪個版本的數(shù)據(jù) 是最新的已提交的數(shù)據(jù)。對于一個強一致性Quorum 系統(tǒng),若存在個數(shù)據(jù)少于W 個,假設(shè)為X 個,則繼續(xù)讀取其他副本,直若成功讀取到W 個 該版本的副本,則該數(shù)據(jù)為最新的成功提交的數(shù)據(jù);如果在所有副本中該數(shù)據(jù)的個數(shù)肯定不滿 足W 個,則R 中版本號第二大的為最新的成功提交的副本。例:在讀取到(v2 v1 v1)時,繼續(xù)讀取剩余的副本,若讀到剩余兩個副本 為(v2 v2)則v2 是最新的已提交的副本;若讀到剩余的兩個副本為(v2 v1)或(v1 v1)則v1 是最新成功提交的版本;若讀取后續(xù)兩個副本有任一超時或失敗,則無法判斷哪個版本是最新的成功提交的版本。



可以看出,在單純使用Quorum 機制時,若要確定最新的成功提交的版本,最多需要讀取R+ (W-R-1)=N 個副本,當(dāng)出現(xiàn)任一副本異常時,讀最新的成功提交的版本這一功能都有可能不可用。實際工程中,應(yīng)該盡量通過其他技術(shù)手段,回避通過Quorum 機制讀取最新的成功提交的版本。例如,當(dāng)quorum 機制與primary-secondary 控制協(xié)議結(jié)合使用時,可以通過讀取primary 的方式讀取到最新的已提交的數(shù)據(jù)。


基于Quorum 機制選擇primary副本


讀取數(shù)據(jù)時依照一致性要求的不同可以有不同的做法:如果需要強一致性的立刻讀取到最新的成功提交的數(shù)據(jù),則可以簡單的只讀取primary 副本上的數(shù)據(jù)即可,也可以通過上節(jié)的方式讀??;如果需要會話一致性,則可以根據(jù)之前已經(jīng)讀到的數(shù)據(jù)版本號在各個副本上進行選擇性讀?。蝗绻恍枰跻恢滦?,則可以選擇任意副本讀取。


在primary-secondary 協(xié)議中,當(dāng)primary 異常時,需要選擇出一個新的primary,之后secondary 副本與primary 同步數(shù)據(jù)。通常情況下,選擇新的primary 的工作是由某一中心節(jié)點完成的,在引入 quorum 機制后,常用的primary 選擇方式與讀取數(shù)據(jù)的方式類似,即中心節(jié)點讀取R 個副本,選擇 R 個副本中版本號最高的副本作為新的primary。新primary 與至少W 個副本完成數(shù)據(jù)同步后作為新的primary 提供讀寫服務(wù)。首先,R 個副本中版本號最高的副本一定蘊含了最新的成功提交的數(shù)據(jù)。再者,雖然不能確定最高版本號的數(shù)是一個成功提交的數(shù)據(jù),但新的primary 在隨后與secondary 同 步數(shù)據(jù),使得該版本的副本個數(shù)達到W,從而使得該版本的數(shù)據(jù)成為成功提交的數(shù)據(jù)。


例:在N=5,W=3,R=3 的系統(tǒng)中,某時刻副本最大版本號為(v2 v2 v1 v1 v1),此時v1 是系統(tǒng)的最新的成功提交的數(shù)據(jù),v2 是一個處于中間狀態(tài)的未成功提交的數(shù)據(jù)。假設(shè)此刻原primary 副本異常,中心節(jié)點進行primary 切換工作。這類“中間態(tài)”數(shù)據(jù)究竟作為“臟數(shù)據(jù)”被刪除,還是作為新的數(shù)據(jù)被同步后成為生效的數(shù)據(jù),完全取決于這個數(shù)據(jù)能否參與新primary 的選舉。下面分別分析這兩種情況。

第一、如圖 2-12,若中心節(jié)點與其中3 個副本通信成功,讀取到的版本號為(v1 v1 v1),則任 選一個副本作為primary,新primary 以v1 作為最新的成功提交的版本并與其他副本同步,當(dāng)與第1、第2 個副本同步數(shù)據(jù)時,由于第1、第2 個副本版本號大于primary,屬于臟數(shù)據(jù),可以按照2.2.2.4 節(jié)中介紹的處理臟數(shù)據(jù)的方式解決。實踐中,新primary 也有可能與后兩個副本完成同步后就提供數(shù)據(jù)服務(wù),隨后自身版本號也更新到v2,如果系統(tǒng)不能保證之后的v2 與之前的v2 完全一樣,則新 primary 在與第1、2 個副本同步數(shù)據(jù)時不但要比較數(shù)據(jù)版本號還需要比較更新操作的具體內(nèi)容是否一樣。

第二、若中心節(jié)點與其他3 個副本通信成功,讀取到的版本號為(v2 v1 v1),則選取版本號為 v2 的副本作為新的primary,之后,一旦新primary 與其他2 個副本完成數(shù)據(jù)同步,則符合v2 的副 本個數(shù)達到W 個,成為最新的成功提交的副本,新primary 可以提供正常的讀寫服務(wù)。


2.5 日志技術(shù)


日志技術(shù)是宕機恢復(fù)的主要技術(shù)之一。日志技術(shù)最初使用在數(shù)據(jù)庫系統(tǒng)中。嚴(yán)格來說日志技術(shù)不是一種分布式系統(tǒng)的技術(shù),但在分布式系統(tǒng)的實踐中,卻廣泛使用了日志技術(shù)做宕機恢復(fù),甚 至如BigTable 等系統(tǒng)將日志保存到一個分布式系統(tǒng)中進一步增強了系統(tǒng)容錯能力。


Redo Log 與Check point


設(shè)計一個高速的單機查詢系統(tǒng),將數(shù)據(jù)全部存放在內(nèi)存中以實現(xiàn)高速的數(shù)據(jù)查詢,每次更新操作更新一小部分數(shù)據(jù)(例如 key-value 中的某一個key)?,F(xiàn)在問題為利用日志技術(shù)實現(xiàn)該內(nèi)存查詢系統(tǒng)的宕機恢復(fù)。與數(shù)據(jù)庫的事務(wù)不同的是,這個問題模型中的每個成功的更新操作都會生效。這也等效為數(shù)據(jù)庫的每個事務(wù)只有一個更新操作,且每次更新操作都可以也必須立即提交(Auto commit)。


  • Redo Log


  1. 將更新操作的結(jié)果(例如Set K1=1,則記錄K1=1)以追加寫(append)的方式寫入磁盤的 日志文件

  2. 按更新操作修改內(nèi)存中的數(shù)據(jù)

  3. 返回更新成功


從Redo Log 的流程可以看出,Redo 寫入日志的是更新操作完成后的結(jié)果(雖然本文不討論Undo Log,這點是與Undo Log 的區(qū)別之一),且由于是順序追加寫日志文件,在磁盤等對順序?qū)懹辛Φ?存儲設(shè)備上效率較高。


用Redo Log 進行宕機恢復(fù)非常簡單,只需要“回放”日志即可。


流程2.5.2:Redo Log 的宕機恢復(fù)


  1. 從頭讀取日志文件中的每次更新操作的結(jié)果,用這些結(jié)果修改內(nèi)存中的數(shù)據(jù)。


從Redo Log 的宕機恢復(fù)流程也可以看出,只有寫入日志文件的更新結(jié)果才能在宕機后恢復(fù)。這也是為什么在Redo Log 流程中需要先更新日志文件再更新內(nèi)存中的數(shù)據(jù)的原因。假如先更新內(nèi)存中的數(shù)據(jù),那么用戶立刻就能讀到更新后的數(shù)據(jù),一旦在完成內(nèi)存修改與寫入日志之間發(fā)生宕機,那么最后一次更新操作無法恢復(fù),但之前用戶可能已經(jīng)讀取到了更新后的數(shù)據(jù),從而引起不一致的問題。


  • Check point


。在簡化的模型下,check point 技術(shù)的過程即將內(nèi)存中的數(shù)據(jù)以某種易于重新加載的數(shù)據(jù)組織方式完整的dump 到磁盤,從而減少宕機恢復(fù)時需要回放的日志數(shù)據(jù)。


流程:check point


  1. 向日志文件中記錄“Begin Check Point”

  2. 將內(nèi)存中的數(shù)據(jù)以某種易于重新加載的數(shù)據(jù)組織方式dump 到磁盤上

  3. 向日志文件中記錄“End Check Point” 在check point 流程中,數(shù)據(jù)可以繼續(xù)按照流程2.5.1 被更新,這段過程中新更新的數(shù)據(jù)可以dump 到磁盤也可以不dump 到磁盤,具體取決于實現(xiàn)。例如,check point 開始時k1=v1,check point 過程 中某次更新為k1 = v2,那么dump 到磁盤上的k1 的值可以是v1 也可以是v2。


流程:基于check point 的宕機恢復(fù)流程


  1. 將dump 到磁盤的數(shù)據(jù)加載到內(nèi)存。

  2. 從后向前掃描日志文件,尋找最后一個“End Check Point”日志。

  3. 從最后一個“End Check Point”日志向前找到最近的一個“Begin Check Point”日志,并回 放該日志之后的所有更新操作日志。

  • No Undo/No Redo log


若數(shù)據(jù)維護在磁盤中,某批更新由若干個更新操作組成,這些更新操作需要原子生效,即要么同時生效,要么都不生效。




0/1 目錄技術(shù)中有兩個目錄結(jié)構(gòu),稱為目錄0(Directory 0)和目錄1(Directory 1)。另有一個結(jié)構(gòu)稱為主記錄(Master record)記錄當(dāng)前正在使用的目錄稱為活動目錄。主記錄中要么記錄使用目錄0,要么記錄使用目錄1。目錄0 或目錄1 中記錄了各個數(shù)據(jù)的在日志文件中的位置。0/1 目錄的數(shù)據(jù)更新過程始終在非活動目錄上進行,只是在數(shù)據(jù)生效前,將主記錄中的0、1 值反轉(zhuǎn),從而切換主記錄。



流程:0/1 目錄數(shù)據(jù)更新流程


  1. 將活動目錄完整拷貝到非活動目錄。

  2. 對于每個更新操作,新建一個日志項紀(jì)錄操作后的值,并在非活動目錄中將相應(yīng)數(shù)據(jù)的位置修改為新建的日志項的位置。

  3. 原子性修改主記錄:反轉(zhuǎn)主記錄中的值,使得非活動目錄生效。



0/1 目錄的更新流程非常簡單,通過0、1 目錄的主記錄切換使得一批修改的生效是原子的。0/1 目錄將批量事務(wù)操作的原子性通過目錄手段歸結(jié)到主記錄的原子切換。由于多條記錄的原子修改一般較難實現(xiàn)而單條記錄的原子修改往往可以實現(xiàn),從而降低了問題實現(xiàn)的難度。在工程中0/1 目錄的思想運用非常廣泛,其形式也不局限在上述流程中,可以是內(nèi)存中的兩個數(shù)據(jù)結(jié)構(gòu)來回切換,也可以是磁盤上的兩個文件目錄來回生效切換。


2.6 兩階段提交協(xié)議


兩階段提交協(xié)議是一種經(jīng)典的強一致性中心化副本控制協(xié)議。雖然在工程中該協(xié)議有較多的問題,但研究該協(xié)議能很好的理解分布式系統(tǒng)的幾個典型問題。


流程描述


兩階段提交協(xié)議是一種典型的“中心化副本控制”協(xié)議。在該協(xié)議中,參與的節(jié)點分為兩類:一個中心化協(xié)調(diào)者節(jié)點(coordinator)和N 個參與者節(jié)點(participant)。每個參與者節(jié)點即上文背景介紹中的管理數(shù)據(jù)庫副本的節(jié)點。


兩階段提交的思路比較簡單,在第一階段,協(xié)調(diào)者詢問所有的參與者是否可以提交事務(wù)(請參與者投票),所有參與者向協(xié)調(diào)者投票。在第二階段,協(xié)調(diào)者根據(jù)所有參與者的投票結(jié)果做出是否事務(wù)可以全局提交的決定,并通知所有的參與者執(zhí)行該決定。在一個兩階段提交流程中,參與者不能改變自己的投票結(jié)果。兩階段提交協(xié)議的可以全局提交的前提是所有的參與者都同意提交事務(wù),只要有一個參與者投票選擇放棄(abort)事務(wù),則事務(wù)必須被放棄。


流程:兩階段提交協(xié)調(diào)者流程


  1. 寫本地日志“begin_commit”,并進入WAIT 狀態(tài);

  2. 向所有參與者發(fā)送“prepare 消息”;

  3. 等待并接收參與者發(fā)送的對“prepare 消息”的響應(yīng);3.1 若收到任何一個參與者發(fā)送的“vote-abort 消息”;3.1.1 寫本地“global-abort”日志,進入ABORT;3.1.2 向所有的參與者發(fā)送“global-abort 消息”;3.1.3 進入ABORT 狀態(tài);3.2 若收到所有參與者發(fā)送的“vote-commit”消息;3.2.1 寫本地“global-commit”日志,進入COMMIT 狀態(tài);3.1.2 向所有的參與者發(fā)送“global-commit 消息”;

  4. 等待并接收參與者發(fā)送的對“global-abort 消息”或“global-commit 消息”的確認響應(yīng)消息,一旦收到所有參與者的確認消息,寫本地“end_transaction” 日志流程結(jié)束。


流程:兩階段提交協(xié)調(diào)者流程


  1. 寫本地日志“init”記錄,進入INIT 狀態(tài)

  2. 等待并接受協(xié)調(diào)者發(fā)送的“prepare 消息”,收到后  2.1 若參與者可以提交本次事務(wù) 2.1.1 寫本地日志“ready”,進入READY 狀態(tài) 2.1.2 向協(xié)調(diào)者發(fā)送“vote-commit”消息 2.1.4 等待協(xié)調(diào)者的消息2.1.4.1 若收到協(xié)調(diào)者的“global-abort”消息2.1.4.1.1 寫本地日志“abort”,進入ABORT 狀態(tài)2.1.4.1.2 向協(xié)調(diào)者發(fā)送對“global-abort”的確認消息   2.1.4.2 若收到協(xié)調(diào)者的“global-commit”消息2.1.4.1.1 寫本地日志“commit”,進入COMMIT 狀態(tài)     2.1.4.1.2 向協(xié)調(diào)者發(fā)送對“global-commit”的確認消息  2.2 若參與者無法提交本次事務(wù) 2.2.1 寫本地日志“abort”,進入ABORT 狀態(tài) 2.2.2 向協(xié)調(diào)者發(fā)送“vote-abort”消息 2.2.3 流程對該參與者結(jié)束 2.2.4 若后續(xù)收到協(xié)調(diào)者的“global-abort”消息可以響應(yīng)

  3. 即使流程結(jié)束,但任何時候收到協(xié)調(diào)者發(fā)送的“global-abort”消息或“global-commit”消息也都要發(fā)送一個對應(yīng)的確認消息。



異常處理


宕機恢復(fù)


  1. 協(xié)調(diào)者宕機恢復(fù) 協(xié)調(diào)者宕機恢復(fù)后,首先通過日志查找到宕機前的狀態(tài)。如果日志中最后是“begin_commit”記錄,說明宕機前協(xié)調(diào)者處于WAIT 狀態(tài),協(xié)調(diào)者可能已經(jīng)發(fā)送過“prepare 消息”也可能還沒發(fā)送,但協(xié)調(diào)者一定還沒有發(fā)送過“global-commit 消息”或“global-abort 消息”,即事務(wù)的全局狀態(tài)還沒有確定。此時,協(xié)調(diào)者可以重新發(fā)送“prepare 消息” 繼續(xù)兩階段提交流程,即使參與者已經(jīng)發(fā)送過對“prepare 消息”的響應(yīng),也不過是再次重傳之前的響應(yīng)而不會影響協(xié)議的一致性。如果日志中最后是“global-commit”或“global-abort”記錄,說明宕機前協(xié)調(diào)者處于COMMIT 或ABORT 狀態(tài)。此時協(xié)調(diào)者只需重新向所有的參與者發(fā)送“global-commit 消息”或“global-abort 消息”就可以繼續(xù)兩階段提交流程。

  2. 參與者宕機恢復(fù)參與者宕機恢復(fù)后,首先通過日志查找宕機前的狀態(tài)。如果日志中最后是“init”記錄,說明參與者處于INIT 狀態(tài),還沒有對本次事務(wù)做出投票選擇,參與者可以繼續(xù)流程等待協(xié)調(diào)者發(fā)送的“prepare 消息”。如果日志中最后是“ready”記錄,說明參與者處于REDAY 狀態(tài),此時說明參與者已經(jīng)就本次 事務(wù)做出了投票選擇,但宕機前參與者是否已經(jīng)向協(xié)調(diào)者發(fā)送“vote-commit”消息并不可知。所以此時參與者可以向協(xié)調(diào)者重發(fā)“vote-commit”,并繼續(xù)協(xié)議流程。如果日志中最后是“commit”或“abort”記錄,說明參與者已經(jīng)收到過協(xié)調(diào)者的“global-commit 消息”(處于COMMIT 狀態(tài))或者“global-abort 消息”(處于ABORT 狀態(tài))。至于是否向協(xié)調(diào)者發(fā) 送過對“global-commit”或“global-abort”的確認消息則未知。但即使沒有發(fā)送過確認消息,由于協(xié)調(diào)者會不斷重發(fā)“global-commit”或“global-abort”,只需在收到這些消息時發(fā)送確認消息既可,不影響協(xié)議的全局一致性。

協(xié)議分析


兩階段提交協(xié)議在工程實踐中真正使用的較少,主要原因有以下幾點:


  1. 兩階段提交協(xié)議的容錯能力較差。從上文的分析可以看出,兩階段提交協(xié)議在某些情況下存在流程無法執(zhí)行下去的情況,且也無法判斷流程狀態(tài)。在工程中好的分布式協(xié)議往往總是可以在即使發(fā)生異常的情況下也能執(zhí)行下去。例如,回憶Lease 機制(2.3 ),一旦lease 發(fā)出,無論出現(xiàn)任何異常,Lease 服務(wù)器節(jié)點總是可以通過時間判定出Lease 是否有效,也可以用等待Lease 超時的方法收回Lease 權(quán)限,整個Lease 協(xié)議的流程不存在任何流程被阻塞而無法執(zhí)行下去的情況。與Lease 機制的簡單有效相比,兩階段提交的協(xié)議顯得較為復(fù)雜且容錯能力差。

  2. 兩階段提交協(xié)議的性能較差。一次成功的兩階段提交協(xié)議流程中,協(xié)調(diào)者與每個參與者 之間至少需要兩輪交互4 個消息“prepare”、“vote-commit”、“global-commit”、“確認global-commit”。過多的交互次數(shù)會降低性能。另一方面,協(xié)調(diào)者需要等待所有的參與者的投票結(jié)果,一旦存在較慢的參與者,會影響全局流程執(zhí)行速度。


雖然存在一些改進的兩階段提交協(xié)議可以提高容錯能力和性能,然而這類協(xié)議依舊是在工程中使用較少的一類協(xié)議,其理論價值大于實踐意義。


2.7 MVCC


MVCC(Multi-version Cocurrent Control,多版本并發(fā)控制)技術(shù)。MVCC 技術(shù)最初也是在數(shù)據(jù)庫系統(tǒng)中被提出,但這種思想并不局限于單機的分布式系統(tǒng),在分布式系統(tǒng)中同樣有效。


MVCC 即多個不同版本的數(shù)據(jù)實現(xiàn)并發(fā)控制的技術(shù),其基本思想是為每次事務(wù)生成 一個新版本的數(shù)據(jù),在讀數(shù)據(jù)時選擇不同版本的數(shù)據(jù)即可以實現(xiàn)對事務(wù)結(jié)果的完整性讀取。在使用MVCC 時,每個事務(wù)都是基于一個已生效的基礎(chǔ)版本進行更新,事務(wù)可以并行進行,從而可以產(chǎn)生一種圖狀結(jié)構(gòu)。

基礎(chǔ)數(shù)據(jù)的版本為1,同時產(chǎn)生了兩個事務(wù):事務(wù)A 與事務(wù)B。這兩個事務(wù)都各自對數(shù)據(jù)進行了一些本地修改(這些修改只有事務(wù)自己可見,不影響真正的數(shù)據(jù)),之后事務(wù)A 首先提交,生成數(shù)據(jù)版本2;基于數(shù)據(jù)版本2,又發(fā)起了事務(wù)C,事務(wù)C 繼續(xù)提交,生成了數(shù)據(jù)版 本3;最后事務(wù)B 提交,此時事務(wù)B 的結(jié)果需要與事務(wù)C 的結(jié)果合并,如果數(shù)據(jù)沒有沖突,即事務(wù) B 沒有修改事務(wù)A 與事務(wù)C 修改過的變量,那么事務(wù)B 可以提交,否則事務(wù)B 提交失敗。MVCC 的流程過程非常類似于SVN 等版本控制系統(tǒng)的流程,或者說SVN 等版本控制系統(tǒng)就是 使用的MVCC 思想。事務(wù)在基于基礎(chǔ)數(shù)據(jù)版本做本地修改時,為了不影響真正的數(shù)據(jù),通常有兩種做法,一是將基礎(chǔ)數(shù)據(jù)版本中的數(shù)據(jù)完全拷貝出來再修改,SVN 即使用了這種方法,SVN check out 即是拷貝的過程;二是每個事務(wù)中只記錄更新操作,而不記錄完整的數(shù)據(jù),讀取數(shù)據(jù)時再將更新操作應(yīng)用到用基礎(chǔ)版本的數(shù)據(jù)從而計算出結(jié)果,這個過程也類似SVN 的增量提交。


2.8 Paxos協(xié)議


Paxos 協(xié)議是少數(shù)在工程實踐中證實的強一致性、高可用的去中心化分布式協(xié)議。Paxos 協(xié)議的流程較為復(fù)雜,但其基本思想?yún)s不難理解,類似于人類社會的投票過程。Paxos 協(xié)議中,有一組完全對等的參與節(jié)點(稱為accpetor),這組節(jié)點各自就某一事件做出決議,如果某個決議獲得了超過半數(shù)節(jié)點的同意則生效。Paxos 協(xié)議中只要有超過一半的節(jié)點正常,就可以工作,能很好對抗宕機、網(wǎng)絡(luò)分化等異常情況。


角色


Proposer:提案者。Proposer 可以有多個,Proposer 提出議案(value)。所謂value,在工程中可以是任何操作,例如“修改某個變量的值為某個值”、“設(shè)置當(dāng)前primary 為某個節(jié)點”等等。Paxos 協(xié)議中統(tǒng)一將這些操作抽象為value。不同的Proposer 可以提出不同的甚至矛盾的value,例如某個Proposer 提議“將變量X 設(shè)置為1”,另一個Proposer 提議“將變量X 設(shè)置為2”,但對同一輪Paxos 過程,最多只有一個value 被批準(zhǔn)。Acceptor:批準(zhǔn)者。Acceptor 有N 個,Proposer 提出的value 必須獲得超過半數(shù)(N/2+1)的Acceptor 批準(zhǔn)后才能通過。Acceptor 之間完全對等獨立。Learner:學(xué)習(xí)者。Learner 學(xué)習(xí)被批準(zhǔn)的value。所謂學(xué)習(xí)就是通過讀取各個Proposer 對value 的選擇結(jié)果,如果某個value 被超過半數(shù)Proposer 通過,則Learner 學(xué)習(xí)到了這個value?;貞洠?.4 ) 不難理解,這里類似Quorum 機制,某個value 需要獲得W=N/2 + 1 的Acceptor 批準(zhǔn),從而學(xué)習(xí)者需要至少讀取N/2+1 個Accpetor,至多讀取N 個Acceptor 的結(jié)果后,能學(xué)習(xí)到一個通過的value。上述三類角色只是邏輯上的劃分,實踐中一個節(jié)點可以同時充當(dāng)這三類角色。


流程


Paxos 協(xié)議一輪一輪的進行,每輪都有一個編號。每輪Paxos 協(xié)議可能會批準(zhǔn)一個value,也可 能無法批準(zhǔn)一個value。如果某一輪Paxos 協(xié)議批準(zhǔn)了某個value,則以后各輪Paxos 只能批準(zhǔn)這個 value。上述各輪協(xié)議流程組成了一個Paxos 協(xié)議實例,即一次Paxos 協(xié)議實例只能批準(zhǔn)一個value,這也是Paxos 協(xié)議強一致性的重要體現(xiàn)。每輪Paxos 協(xié)議分為階段,準(zhǔn)備階段和批準(zhǔn)階段,在這兩個階段Proposer 和Acceptor 有各自的處理流程。


流程:Proposer 的流程 (準(zhǔn)備階段)


  1. 向所有的Acceptor 發(fā)送消息“Prepare(b)”;這里b 是Paxos 的輪數(shù),每輪遞增

  2. 如果收到任何一個Acceptor 發(fā)送的消息“Reject(B)”,則對于這個Proposer 而言本輪Paxos 失敗,將輪數(shù)b 設(shè)置為B+1 后重新步驟1;(批準(zhǔn)階段,根據(jù)收到的Acceptor 的消息作出不同選擇)

  3. 如果接收到的Acceptor 的“Promise(b, v_i)”消息達到N/2+1 個(N 為Acceptor 總數(shù),除法取整, 下同);v_i 表示Acceptor 最近一次在i 輪批準(zhǔn)過value v。3.1 如果收到的“Promise(b, v)”消息中,v 都為空,Proposer 選擇一個value v,向所有Acceptor 廣播Accept(b, v);3.2 否則,在所有收到的“Promise(b, v_i)”消息中,選擇i 最大的value v,向所有Acceptor 廣播消息Accept(b,v);

  4. 如果收到Nack(B),將輪數(shù)b 設(shè)置為B+1 后重新步驟1;


流程:Accpetor 流程 (準(zhǔn)備階段)


  1. 接受某個Propeser 的消息Prepare(b)。參數(shù)B 是該Acceptor 收到的最大Paxos 輪數(shù)編號;V 是Acceptor 批準(zhǔn)的value,可以為空 1.1 如果b>B,回復(fù)Promise(b, V_B),設(shè)置B=b; 表示保證不再接受編號小于b 的提案。1.2 否則,回復(fù)Reject(B) (批準(zhǔn)階段)

  2. 接收Accept(b, v), 2.1 如果b < B, 回復(fù)Nack(B),暗示proposer 有一個更大編號的提案被這個Acceptor 接收了 2.2 否則設(shè)置V=v。表示這個Acceptor 批準(zhǔn)的Value 是v。廣播Accepted 消息。

例子


基本例子里有5 個Acceptor,1 個Proposer,不存在任何網(wǎng)絡(luò)、宕機異常。我們著重考察各個Accpetor 上變量B 和變量V 的變化,及Proposer 上變量b 的變化。



  1. 初始狀態(tài)

  2. Proposer 向所有Accpetor 發(fā)送“Prepare(1)”,所有Acceptor 正確處理,并回復(fù)Promise(1, NULL

  3. Proposer 收到5 個Promise(1, NULL),滿足多余半數(shù)的Promise 的value 為空,此時發(fā)送 Accept(1, v1),其中v1 是Proposer 選擇的Value。

  4. 此時,v1 被超過半數(shù)的Acceptor 批準(zhǔn),v1 即是本次Paxos 協(xié)議實例批準(zhǔn)的Value。如果Learner 學(xué)習(xí)value,學(xué)到的只能是v1



在同一個Paxos 實例中,批準(zhǔn)的Value 是無法改變的,即使后續(xù)Proposer 以更高的序號發(fā)起Paxos 協(xié)議也無法改變value。Paxos 協(xié)議的核心就在于“批準(zhǔn)的value 無法改變”,這也是整個協(xié)議正確性的基礎(chǔ)。


Paxos 協(xié)議是被人為設(shè)計出來,其設(shè)計過程也是協(xié)議的推導(dǎo)過程。Paxos 協(xié)議利用了Quorom 機 制,選擇的W=R=N/2+1。簡單而言,協(xié)議就是Proposer 更新Acceptor 的過程,一旦某個Acceptor 成功更新了超過半數(shù)的Acceptor,則更新成功。Learner 按Quorum 去讀取Acceptor,一旦某個value 在超過半數(shù)的Proposer 上被成功讀取,則說明這是一個被批準(zhǔn)的value。協(xié)議通過引入輪次,使得高輪次的提議搶占低輪次的提議來避免死鎖。協(xié)議設(shè)計關(guān)鍵點是如何滿足“在一次Paxos 算法實例過程中只批準(zhǔn)一個Value”這一約束條件。


2.9 CAP


CAP 理論的定義很簡單,CAP 三個字母分別代表了分布式系統(tǒng)中三個相互矛盾的屬性:


  • Consistency (一致性):CAP 理論中的副本一致性特指強一致性(1.3.4 );

  • Availiablity(可用性):指系統(tǒng)在出現(xiàn)異常時已經(jīng)可以提供服務(wù);

  • Tolerance to the partition of network (分區(qū)容忍):指系統(tǒng)可以對網(wǎng)絡(luò)分區(qū)(1.1.4.2 )這種異常情 況進行容錯處理;



CAP 理論指出:無法設(shè)計一種分布式協(xié)議,使得同時完全具備CAP 三個屬性,即1)該種協(xié)議下的副本始終是強一致性,2)服務(wù)始終是可用的,3)協(xié)議可以容忍任何網(wǎng)絡(luò)分區(qū)異常;分布式系統(tǒng)協(xié)議只能在CAP 這三者間所有折中。


熱力學(xué)第二定律說明了永動機是不可能存在的,不要去妄圖設(shè)計永動機。與之類似,CAP 理論的意義就在于明確提出了不要去妄圖設(shè)計一種對CAP 三大屬性都完全擁有的完美系統(tǒng),因為這種系統(tǒng)在理論上就已經(jīng)被證明不存在。


  • Lease 機制: Lease 機制犧牲了部分異常情況下的A,從而獲得了完全的C 與很好的P。

  • Quorum 機制: Quorum 機制,在CAP 三大因素中都各做了折中,有一定的C,有較好 的A,也有較好的P,是一種較為平衡的分布式協(xié)議。

  • 兩階段提交協(xié)議: 兩階段提交系統(tǒng)具有完全的C,很糟糕的A,很糟糕的P。

  • Paxos 協(xié)議:同樣是強一致性協(xié)議,Paxos 在CAP 三方面較之兩階段提交協(xié)議要優(yōu)秀得多。Paxos 協(xié)議具有 完全的C,較好的A,較好的P。Paxos 的A 與P 的屬性與Quorum 機制類似,因為Paxos 的協(xié)議本 身就具有Quorum 機制的因素。


瀏覽 50
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 国产一级a毛一级a爰片| 91老熟| 青青草免费在线视频| 69AV在线视频| 人人上人人干| 亚洲中文字幕在线视频观看| 丁香五月中文| 亚洲免费小黄片| 中文字幕无码精品三级在线欧美| 国产手机AV在线| 91人人| 免费一级黄色视频| 亚洲天堂男人| 91狠狠综| 欧一美一婬一伦一区二区三区自慰,| 69av网站| 人人舔人人爱| 国产欧美精品一区二区三区| 日本欧洲三级| 少妇人妻偷人精品无码视频新浪| 国产黄色免费看| 亚洲中文字幕在线免费观看视频| 亚洲欧美精品在线| 免费操逼视频在线观看| 91超碰久久在线| 九草在线| 爆操网站| 成人777777免费视频色 | 熟女人妻一区二区| 翔田千里无码AV在线观看| 梁祝艳谭A级毛片| 超碰日日夜夜| 呦呦av| 亚洲综合免费观看高清完整版在线 | 爱五月| 欧美爱| 国产精品视频一区二区三| 韩国av在线| 久久97| 操逼视频免费在线观看| 色婷婷色99国产综合精品| 国产免费看片| 国内自拍无码| 熟女少妇一区二区三区| 五月天婷婷激情视频| 免费无码毛片一区二区A片| 亚洲视频在线观看网站| 热re99久久精品国产99热 | 日韩无码AV电影| 国产AV黄色| 亚洲精品成人视频| 91精品免费| 人人摸人人插| 可以免费观看的av| 久久久久久久97| 精品www| 黄色视频免费国产| yw视频在线观看| a无码视频在线观看| 久久四区| 啊啊啊啊啊靠逼| 九九精品免费视频| 中文字幕国产在线观看| 国产精品999999| 久久免费看| 东北奇淫老老妇| 91大神在线免费观看| 婷婷色吧| 中文字幕精品三区无码| 99精品网站| 久久久久久久久久久国产精品 | 成人午夜福利视频| 大香蕉在线75| 91九色91蝌蚪91成人| 国产AV无码高清| 大荫蒂视频另类XX| 在线内射| 麻豆亚洲AV成人无码久久精品 | 国产操逼网站| 逼逼75大秀| 伊人五月在线| 草逼美女| 午夜福利av在线| 亚洲无码操逼视频| 99久久精品一区二区成人| 999国产精品视频| 大鸡巴视频在线| 在线高清无码不卡| 鲁鲁鲁鲁鲁鲁鲁777777| 午夜亚洲视频| 天天日天天操天天爽| 中文字幕无码播放| 草逼毛片| 无码在线免费播放| 免费A片在线播放| 精品美女视频在线观看免费软件| 国产v视频| 中文无码一区二区三区| 天天爽夜夜爽人人爽| 欧美成人三级在线观看| 九九九在线| 国产精品成人AV片| 欧美色图第一页| 日韩Av无码一区二区三区不卡 | 操B图| 爱爱视频免费网站| 99自拍网| 日本高清视频免费观看| 69国产精品成人无码视频色| 大香蕉精品在线视频| 亚洲最大的成人网站| 人妻大屁股-91Porn| 狠狠撸在线视频| 九色91视频| 中文字幕综合网| 天天影视综合网免费观看电视剧国产| 国产精品久久久久久久免牛肉蒲| 亚洲激情精品| 国产成人久久精品麻豆二区| 日本在线一级| 天堂网亚洲| 欧美va在线| 久久永久视频| 91成人一区二区三区| 自拍偷拍国产| www.天天干| 国产91人| 人妻无码精品久久人妻成人| 操逼网123首页| 亚洲二区视频| 91AV免费在线观看| 日韩激情AV| 欧美三级精品| 国产精品毛片久久久久久久| 黑人av| 黄色免费在线观看网站| 大学生18一19GAY169| 亚洲中文中出| h片在线免费观看视频| 国产8区| 成人无码区免费| 这里都是精品| 肏逼网| 黑人Av在线| 影音先锋av网| 在线观看一区二区三区四区| 黄色视频毛片| 微拍福利一区| 五月综合色| 婷婷色网| 毛片av在线| 国产免费观看AV| 国产性猛交╳XXX乱大交| 国产卡一卡二| 小黄片免费在线观看| 日本色色| 国产做爱导航| 日韩v欧美v日本v亚洲v国产v| av网站导航| 热久久在线观看| 91视频www| 内射极品美女| 日韩av在线免费观看| 五月伊人婷婷| 狼人综合视频| 精品动漫一区二区三区| av天堂中文在线| 四虎黄色网| 精品九九| 九色av| 成人在线激情| 亚洲AV无码国产综合专区| 日韩免费无码视频| 午夜嘿嘿| 性欧美一区二区| 综合伊人大香蕉| 豆花天天吃最新视频| 三级麻豆| 色色婷婷五月天| 色五月婷婷丁香五月| 二区视频在线| 中文字幕日本精品5| 久操视频免费| 乱伦视频网| 操一操干一干| 乱伦激情视频| 9l视频自拍蝌蚪9l成人蝌蚪| 影音先锋亚洲资源| 色94色.欧美.setu| 91无码一区二区| 坏男人内射老太太| 中文字幕人妻互换av久久| 在线成人网站| 国产a一级a毛一级视频| 亚洲二区视频| 亚洲va中文字幕| 亚洲天堂网在线观看| 久久亚洲福利视频| 中文字幕乱码中文乱码图片| 亚洲精品人人| 日韩一级网站| 成人一二区| 国产色婷婷精品综合在线播放| 一级片a片| 婷婷无码视频| 一本大道香蕉av久久精东影业| 无码人妻av一区| www污| 亚洲性爱无码| 巨乳国产一区| 亚洲AV无码成人精品区h麻豆| 97亚洲综合| 影音先锋色AV| 日日骚av一区二区三区| 国产在线视频你懂的| 日韩女人性爱| 337p粉嫩噜噜噜| 内射免费网站| 国产成人99久久亚洲综合精品| 日韩在线欧美在线| 欧美操逼电影| 亚洲乱伦中文字幕| 中文字幕无码不卡| 九月婷婷综合| 想要xx在线观看| 婷婷一区二区三区| 国产无码一| 国产无码AV成在线| 黄色视频在线免费播放| 日韩无码中文字幕| 久久久极品| 久草精品视频| 亚洲骚妇| 国产日韩欧美成人| 人人插人人爽| 91在线资源| 国产精品色呦呦| 亚洲无码人妻视频| 91在线导航| brazzers疯狂作爱| jizz免费在线观看| 一级在线| 一区二区三区精品婷婷| 国产又爽又黄免费观看| 2025AV天堂网| 久久91| 中文无码AV在线| 奇米一区| 黄色一级A片| 特黄特色免费视频| 久久久久精| 中文字幕视频一区| 亚洲天堂在线免费观看视频| 91人妻最真实刺激绿帽| 国产精品久久久久久久久久乐趣播| 97爱爱视频| 人人妻人人玩人人澡人人爽| 精品小视频| 成人综合激情| 成人无码免费一区二区中文| 成人黄色毛片| 91白丝喷水自慰网站| 中文在线字幕免费观看| 欧美精品久久久久久久多人混战| 91成人电影院| 国产成人精品123区免费视频 | 粉嫩av懂色av蜜臀av熟妇| 五月激情视频| 国产成人三级片在线观看| 一级Aa视频免费看| 丁香五月婷婷五月| 99无码精品| 日本熟妇一区二区三区| 成人国产欧美日韩在线视频| AV乱伦网站| 蜜桃传媒一区| 欧美后门菊门交4| 狠狠色色| 波多野结衣视频在线播放| 婷婷亚洲国产| 精品码一区二在线观看| 瘦精品无码一区二区三区四区五区六区七区八区 | 亚洲第一黄片| 国产A级毛片| 国产大屌| 三级AV在线| 国产免费av在线观看| 99久久精品国产一区二区成人| 影音先锋成人AV| 国产精品女人777777| 无码成人av| 久久成人A片| 东方av在线免费观看| 色天堂影院| 一区二区免费在线观看| 2025AV天堂| 18成人毛片| 草草视频在线观看| 北条麻妃视频在线| 在线观看亚洲中文字幕| 无码A区| 爆操视频| 五月丁香999| 色人阁人妻中文字幕| 日韩人妻无码电影| 亚洲十八禁| 91免费观看网站| 999久久久| 国产精品午夜在线观看| 欧美性性生交XXXXX无码| 永井玛丽亚av无码中出流出| 无码人妻在线播放| 亚洲影音| 精品无码一区二区三区在线| 免费看黃色AAAAAA片| 西西888WWW大胆视频| 51精品国产| 操干视频| 午夜福利大香蕉| 日韩熟妇无码中文字幕| 成人午夜精品福利免费| 国产成人无码Av片在线公司| 伊人色五月| 搡BBB搡BBBB搡BBBB-百度| 蜜桃91精品| 一级A片60分钟免费看| 日韩三区在线| 黄色一级片网站| 未满十八18禁止免费无码网站| 四虎成人精品无码永久在线的客服| 伊人三区| 永久免费无码中文字幕| 激情AV在线观看| 亚洲乱码中文字幕| 亚洲中文字幕在线观看视频网站| 国产成人午夜精品无码区久久麻豆| 亚洲第一黄色| 日比视频网站| 国产xxxxx| 欧美精产国品一二三产品价格 | 日韩高清无码成人| 国产aⅴ激情无码久久久无码| 仙踪林777777野大粗| 97日日| 中文字幕网在线| 亚洲日韩欧美在线观看| 男女网站在线观看| 91在线成人| 天堂亚洲精品| 欧美日韩国内| 成人免费无码A片免费| 黄片网站在线看| 日本黄色精品| 亚洲成人精品在线| 亚洲中文字幕第一| 国产一级片免费观看| 啪啪成人视频| 污网站免费在线观看| 人人舔人人爱| 囯产精品宾馆在线精品酒店 | 国产高清无码18| 国产日本在线视频| 亚洲成人观看| 久久中文字幕无码| 91人妻论坛| 成人三级视频| AV在线四季综合网站| 日日精品| 日本午夜无码| 老骚老B老太太BBW| 亚洲视频天堂| 小小拗女BBw搡BBBB搡| 91AV| 欧美日韩视频在线| 免费内射| 人妻少妇av中文字幕乱码牛牛| 二区三区免费视频| 九九九九精品视频| 99久久久国产精品无码| 国产精品一区二区AV日韩在线| 少妇搡BBBB搡BBB搡视频一级| 四虎亚洲无码| 懂色aV| 影音先锋av在线资源| 黄色一级电影| AV午夜| 99这里只有精品视频| 精品国产999久久久免费| 无码一区二区三区四| 无码网址| 无码精品一区二区在线| 青草五月天| 久操视频免费| 国产亚洲精品久久久波多野结衣| 成人黄色A片| 777三级| 国产中文字幕AV在线播放| 久久精品夜色噜噜亚洲A∨| 亚洲日韩欧美国产| 日韩乱伦电影| 国精产品一二三区| 日韩AV在线免费观看| 成人区人妻精品一| 欧美在线一区二区| 欧美国产中文| 韩日一级片| 亚洲一级二级片| 99热99精品| 国产乱码精品一品二品| 91日韩在线| 五月婷婷丁香在线| 成人在线视频一区| 国产精品99久久久久的广告情况 | 俺去吔| A黄色片| 波多野结衣视频免费在线观看| 亚洲综合五月天婷婷丁香| 在线日韩AV| 69亚洲视频| 91免费小视频| 色综合久久久| 日韩在线欧美在线| 五月婷婷六月天| 特黄无码| 成人做爰100片免费看| 男女拍拍免费视频| 久久免费9| 激情亚洲五月天| 国产色呦呦| 影音先锋乱伦电影| 日本中文视频| 无套进入无套内谢| 午夜高清无码视频| 日韩欧美视频在线播放| 久久永久免费精品人妻专区| 国产精品1区| 丁香五月综合啪啪| 高清无码免费| 九九福利视频| 综合AV在线| 亚洲精品一区二区二区的游戏情况| 亚洲精品黄色电影| 91视频一区二区| 91丨九色丨国产在线| 天天想天天干| 日韩欧美爱爱| 成人黄色录像| 另类老妇性BBBWBBW| 国产精品久久久久久久久夜色| 国产人成视频| 久久伊人草| 精品人妻在线| 又a又黄高清无码视频| 狼人狠狠干| 免费看无码| 欧美精品日韩在线观看| 91精品国产乱码久久久久| 操中国老女人| aV无码av天天aV天天爽第一| 婷婷国产亚洲精品网站| 国产91精品久久久天天| 黄色毛片在线播放| 操逼在线观看| 一本色道久久综合狠狠躁的推荐 | 国产AV资源网| 日韩一区二区在线观看| 亚洲黄色在线免费观看| 水蜜桃视频网站| 亚洲爱爱网| 特黄一级片| 精品无码久久久久久久久app| 91成人福利| 国产av资源网| 午夜福利免费在线观看| 2025精品偷拍视频| 视频一区二区三区在线观看| 国产中文自拍| 操逼电影免费| 91蜜桃视频| 丁香五月天在线视频| 欧美色女人| 欧美不卡在线播放| 欧美性猛交XXXX乱大交3| 欧美成人视频网| 国产伦精品一区二区三区色大师| 亚洲AV无码成人精品国产五月天| 波多野59部无码喷潮| 91黄在线观看| 亚洲黄色电影网站| 大香蕉做爱| 加勒比一区二区三区| 欧美成人精品无| 国产无码片| 69国产精品成人无码视频色| 男女啪啪啪网站| 狼人香蕉在线视频| 欧美一级内射| 久热福利视频| 91久久午夜无码鲁丝片久久人妻| 女同三区| 秋霞午夜福利| 成人性爱免费视频| 东京热黄色电影| 特一级黄A片| 三级网站在线| 高清无码电影| 91热久久| 亚洲色图五月天| 很色很黄的A片一| 亚洲免费一级| 欧美亚洲日韩一区| 成人小说视频在线社区| 97A片在线观看播放| 国产一级黄色毛片| 有码中文字幕| 天天操免费视频| 丁香六月综合激情| 木下凛凛子AV888AV在线观看| 亚洲av播放| 亚洲社区在线观看| 日本wwwwww| 欧美色色影院| 超碰免费97| 国产精品无码成人AV在线播放| 日韩区在线| www.毛片| 欧美成人性色欲影院| 国产69精品久久久久久久久久久久| 91人人妻人人澡人人爽| 无码日韩人妻精品久久蜜桃| 日本无码视频在线| 鸡巴在线观看| 影音先锋一区| 大香蕉三级片| 国产熟妇毛多久久久久一区| 亚洲精品国产成人AV在线| 欧美成人性爱影院| 日韩精品你懂的| 无码一区二区三区四区五区| 六月丁香激情| 欧美黄片一区| 黄色视频毛片一一| 欧美国产另类| 岛国无码在线| 99一区| 97人妻精品一区二区三区免| 色色在线观看| 日韩无码人妻一区二区三区| 欧美在线天堂| 午夜无码人妻AV| 亚洲Av无码成人专区擼| 熟女一区二区三区| 国产美女操逼| 嗯啊av| 一级片免费观看视频| 国产AV无码区亚洲| 欧美操比视频| 91探花国产综合在线精品| 亚洲AV小说| 97色色婷婷| 人妻HDHDHD96XXXX| 亚洲av二区| 成人国产精品在线观看| 少妇一区二区三区| 翔田千里无码XXXXXX| 91网站免费观看| 日产精品久久久久| 伊人婷婷大香蕉| 国产精品嫩草久久久久yw193| 小黃片秘嗯嗯啊| 日韩免费视频| 91av电影| 婷婷视频在线观看| 欧美性猛交XXXX乱大交| 美女极度色诱图片www视频| 青娱乐精品在线视频| 先锋成人电影| 中文字幕免费中文| 日韩无码砖区| 96精品| 热久久亚洲中文字幕| 亚洲人妻系列| 停停六综合| 四虎在线免费视频| 18精品爽视频| 青青草国产在线视频| 国外成人在线视频老鸭窝| 亚洲性爱在线| 伊人网成人| 成人黄片18| 蜜桃精品在线观看| ppypp电影频道| 五月婷婷六月丁香综合| 9热在线视频| 先锋影音一区二区三区| 日韩精品无码一区二区| 黄色小视频在线观看| 日韩欧美午夜成人无码| 久久不射| 欧美伦妇AAAAAA片| 五月婷婷色色色| 亚洲无码av在线观看| 亚洲色图欧美在线| 久久香蕉网| 麻豆国产| 六月丁香激情| 国产精品色综合| 少妇搡BBBB搡BBB搡造水多,| 北条麻妃精品视频| 成人在线一区二区| 亚洲最大的成人网站| 午夜久久久久久久久久久久91| 一区二区三区四区精品视频| 免费无码一级A片大黄在线观看 | 中文字幕成人在线| 天天操网| 一区二区三区电影高清电影免费观看| www.18禁| 国产理论电影在线观看| 人妻丰满熟妇av无码区| 91香蕉视频在线| 国精品91无码一区二区三区在线 | 操BBB操BBB| 国产精品一卡二卡三卡| 美女网站色| 国内自拍激情视频| 夜夜骑婷婷91| 久久国产精品视频| 91人妻人人操| 亚洲婷婷在线| 操B视频网站| 国产精品一区二区三| 亚洲狼人综合| 欧美成人三区性价比| 水蜜桃在线观看视频| 亚洲小说欧美激情另类A片小说| 777.av| 小视频你懂的| 大香蕉综合视频| www.日韩一区| 国产剧情一区二区三区| 亚洲欧洲精品视频| 日韩一区二区高清无码| 啪啪免费| 清清草在线视频| 久久伊人在| 国产福利在线导航| 97人操| 亚洲AV久久无码| 日皮视频在线观看免费| 120分钟婬片免费看| 天堂无码视频在线播放| va色婷婷亚洲在线| 国产精品无码激情视频| 国产精品久久久久国产A级| 午夜久操| 欧美精品一区二区少妇免费A片| 国产欧美日韩综合| 一区二区三区操逼| 亚洲第一免费视频| 超碰女人| 国产毛片一区二区| 女人18片毛片60分钟黃菲菲 | 山西真实国产乱子伦| 欧美老女人性爱视频| 国产午夜成人免费看片无遮挡| 大香蕉尹人在线观看| 蜜桃成人无码区免费视频网站| 中字无码制服| 欧美亚洲成人电影| ww免费视频| 91精品在线观看视频| 97无码精品人妻一区二区三区| 国产乱伦中文字幕| 久艹在线观看视频| 成人免费无码毛片| 白丝自慰网站| 免费无码婬片A片AA片| 91AV免费看| 大鸡巴操小逼视频| 高清免费在线中文Av| 熟妇偷拍| 国产99久久| 人妻精品综合码| 在线亚洲一区| 18精品爽国产冫绿帽社| 中文字幕av免费观看| 亚洲黄色三级| 囯产精品99久久久久久WWW| 成人精品一区二区三区中文字幕| 91麻豆福利视频| 一级片视频在线观看| 特逼视频| 亚洲黄视频| 四虎AV| 97干干| 日韩成人免费视频| 婷婷丁香五月激情一区综合网 | 欧美黄色小说| 亚洲Japanese办公室制服| 国产色秘乱码一区二区三区| 黄色视频网站日本| 欧美性生活视频| 一本色道久久综合亚洲怎么玩| 国产成人h| 一区视频免费观看| 无码水蜜桃一区二区| 俺来操| 无码白浆| 97人妻视频| 操逼一区二区| 日韩Av无码一区二区三区不卡 | 国产一二三四| 特黄无码| 精品国产va久久久久久久| 水蜜桃网站在线观看| AV在线影院| 91视频久久久| 日韩综合精品中文字幕66| 国产成人视频在线观看| 天天色天天日| 少妇高潮av久久久久久| 91香蕉国产成人App| 在线中文AV| 一级二级三级毛片| 夜色视频网| 国产秘精品一区二区三区免费| 波多野结衣在线网站| 在线国产小视频| 人人爱人人草| 2025最新国产精品每日更新 | 在线观看视频黄| 青青草99| 大香蕉国产视频| 91熊猫视频| 蜜桃视频免费网站| 色色免费| 国产香蕉在线视频| 先锋影音成人| 97国产超碰| 色婷婷综合在线| 国产三四区久久| 五十路義母| 亚洲高清毛片一区二区| 51精品日本| 亚洲激情在线观看| AV黄色在线观看| 熟女人妻人蜜桃视频| 久操影视| 日韩成人黄色视频| 日韩免费看片| 国内精品久久久久久久久98| 牛牛精品一区二区| 中文字幕久久人妻无码精品蜜桃| 首页-91n| 骚小姨子无码| 国产精品无码一区二区三| 国产一级婬乱片免费| 亚洲家庭乱伦| 五月在线视频| 国产成人免费在线观看| 97精品人妻| 黄色免费在线观看网站| 伊大香蕉在线| 蜜臀久久久99久久久久久久| 日本三区| 毛片毛片毛片毛片| 黄色视频免费看| 99热精品久久| 婷婷五月天色综合| 成人欧美在线观看| www.17c嫩嫩草色蜜桃网站| 日本成人电影| 色狠狠网| 成人H视频| 一级日逼视频| 人人草人人操| 蝌蚪窝视频在线观看| 日韩无任何视频在线观看| 乱伦AV网| 操女人大逼| 丰满熟妇| 中文字幕在线观看亚洲| 精品国产乱码一区二区| 日韩三区在线| 黄色视频免费国产| 91成人电影在线| 人人插人人| 人妻公日日澡久久久| 色999亚洲人成色| 91国产乱伦| 99爱在线观看| 伊人在线视频| 精国产品一区二区三区A片| 另类国产| 亚洲理论视频| 九九超碰| 在线免费看AV片| 高清无码视频免费版本在线观看| 大香蕉老师| 日韩欧美中文| 日韩小视频| 午夜操B| 小明成人免费视频| 欧美女人操逼| 亚洲精品三级| 91蝌蚪视频在线| 日韩欧美视频在线播放| 91视频免费播放| 亚洲人成在线观看| 亚洲欧美精品AAAAAA片| 99热精品免费观看| 黄页网址在线观看| 五月天无码视频| 日韩无码高清免费视频| 无码蜜桃一区二区| 深爱激情网五月天| 久久爆乳一区二区三区| 人妻少妇91精品一区黑人 | 国产三级片在线观看视频| 成人无码免费| 久久人操| 动漫一区二区三区| 国产91网| 亚洲天天操| 91久久久久久久91| 久久成人福利| 日韩成人A片| 豆花视频在线观看| 欧美男女交配视频| 亚洲日韩三级片| 伊人自拍| 日本中出视频| 激情丁香五月婷婷| 国产乱妇乱子伦视频免费观看让女人 | 手机毛片在线播放| 97超碰碰碰| 一级a片免费观看| 亚洲精品91| 黄色不卡视频| 在线观看的av网站| 国产精品成人无码免费| 伊人操逼网| 国产avwww| 丰满人妻一区二区三区不卡二| 国产777| 久久影院av| 91精品人妻少妇无码影院| 免费黄色A片| 狠狠精品| 国产成人影视在线观看| 国产欧美一区二区三区四区| 丁香色综合人妻| 亚洲色图88| 成人无码区免费A片久久| 成人电影一区二区三区| 男人的天堂色琪琪| 青娱乐亚洲精品| 成人免费无遮挡无码黄漫视频| 一级黄色影院| 大骚逼影院| 亚洲AV免费在线| 国产精品爽爽久久久| а中文在线天堂精品| 超碰人人操人人爱| 色老板免费精品无码免费视频| 91在线永久| 人人操人人操人人操| 欧美又粗又大AAA片| 另类老妇性BBwBBw图片| 亚洲中文字幕码mv| 国产主播精品在线| 亚洲成人不卡| 麻豆专区| 永久免费不卡在线观看黄网站| 无码人妻少妇| 久久国产劲爆∧v内射| 亚洲人成免费网站| 日韩三级片在线视频| 大香蕉三级片| 手机看片福利视频| 日本无码成人| 91精品久久久久久久| 亚洲播播在线视频| 91精品电影| 午夜亚洲| 成人一区二区在线观看| 亚洲精品第一页| 性爱网站免费看| 九七精品| 一级A片60分钟免费看| 国产精品国产三级片| 中文在线免费看视频| 免费激情网站| 亚洲视频天天射| www.一区二区| www.爆操| 国产videos| 青娱乐成人| 综合天堂|