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

一致性協(xié)議算法-2PC、3PC、Paxos、Raft、ZAB、NWR超詳細(xì)解析

共 18133字,需瀏覽 37分鐘

 ·

2021-01-07 22:50

背景

在常見的分布式系統(tǒng)中,總會發(fā)生諸如機(jī)器宕機(jī)或網(wǎng)絡(luò)異常(包括消息的延遲、丟失、重復(fù)、亂序,還有網(wǎng)絡(luò)分區(qū))等情況。

一致性算法需要解決的問題就是如何在一個可能發(fā)生上述異常的分布式系統(tǒng)中,快速且正確地在集群內(nèi)部對某個數(shù)據(jù)的值達(dá)成一致,并且保證不論發(fā)生以上任何異常,都不會破壞整個系統(tǒng)的一致性。


CAP 定理

CAP 理論告訴我們,一個分布式系統(tǒng)不可能同時滿足一致性(C:Consistency),可用性(A: Availability)和分區(qū)容錯性(P:Partition tolerance)這三個基本需求,最多只能同時滿足其中的2個。

Base 理論

BASE:全稱:Basically Available(基本可用),Soft state(軟狀態(tài)),和 Eventually consistent(最終一致性)。

Base 理論是對 CAP 中一致性和可用性權(quán)衡的結(jié)果,其來源于對大型互聯(lián)網(wǎng)分布式實踐的總結(jié),是基于 CAP 定理逐步演化而來的。其核心思想是:既是無法做到強(qiáng)一致性(Strong consistency),但每個應(yīng)用都可以根據(jù)自身的業(yè)務(wù)特點(diǎn),采用適當(dāng)?shù)姆绞絹硎瓜到y(tǒng)達(dá)到最終一致性(Eventual consistency)。

解釋一下:什么是軟狀態(tài)呢?相對于原子性而言,要求多個節(jié)點(diǎn)的數(shù)據(jù)副本都是一致的,這是一種 “硬狀態(tài)”。軟狀態(tài)指的是:允許系統(tǒng)中的數(shù)據(jù)存在中間狀態(tài),并認(rèn)為該狀態(tài)不影響系統(tǒng)的整體可用性,即允許系統(tǒng)在多個不同節(jié)點(diǎn)的數(shù)據(jù)副本存在數(shù)據(jù)延時。

2PC

Two-Phase Commit,事務(wù)的提交過程分成了兩個階段來進(jìn)行處理。

2PC 階段一

1.事務(wù)詢問

協(xié)調(diào)者向所有的參與者詢問,是否準(zhǔn)備好了執(zhí)行事務(wù),并開始等待各參與者的響應(yīng)。

1.執(zhí)行事務(wù)

各參與者節(jié)點(diǎn)執(zhí)行事務(wù)操作,并將 Undo 和 Redo 信息記入事務(wù)日志中

1.各參與者向協(xié)調(diào)者反饋事務(wù)詢問的響應(yīng)

如果參與者成功執(zhí)行了事務(wù)操作,那么就反饋給協(xié)調(diào)者 Yes 響應(yīng),表示事務(wù)可以執(zhí)行;如果參與者沒有成功執(zhí)行事務(wù),就返回 No 給協(xié)調(diào)者,表示事務(wù)不可以執(zhí)行。

2PC 階段二

在階段二中,會根據(jù)階段一的投票結(jié)果執(zhí)行 2 種操作:執(zhí)行事務(wù)提交,中斷事務(wù)。

執(zhí)行事務(wù)提交步驟如下:

?發(fā)送提交請求:協(xié)調(diào)者向所有參與者發(fā)出 commit 請求。?事務(wù)提交:參與者收到 commit 請求后,會正式執(zhí)行事務(wù)提交操作,并在完成提交之后釋放整個事務(wù)執(zhí)行期間占用的事務(wù)資源。?反饋事務(wù)提交結(jié)果:參與者在完成事務(wù)提交之后,向協(xié)調(diào)者發(fā)送 Ack 信息。?協(xié)調(diào)者接收到所有參與者反饋的 Ack 信息后,完成事務(wù)。

中斷事務(wù)步驟如下:

?發(fā)送回滾請求:協(xié)調(diào)者向所有參與者發(fā)出 Rollback 請求。?事務(wù)回滾:參與者接收到 Rollback 請求后,會利用其在階段一種記錄的 Undo 信息來執(zhí)行事務(wù)回滾操作,并在完成回滾之后釋放在整個事務(wù)執(zhí)行期間占用的資源。?反饋事務(wù)回滾結(jié)果:參與者在完成事務(wù)回滾之后,想?yún)f(xié)調(diào)者發(fā)送 Ack 信息。?中斷事務(wù):協(xié)調(diào)者接收到所有參與者反饋的 Ack 信息后,完成事務(wù)中斷。

從上面的邏輯可以看出,二階段提交就做了2個事情:投票,執(zhí)行。

舉個例子:

二階段提交看起來確實能夠提供原子性的操作,但是不幸的事,二階段提交還是有幾個缺點(diǎn)的:

1、同步阻塞問題。執(zhí)行過程中,所有參與節(jié)點(diǎn)都是事務(wù)阻塞型的。當(dāng)參與者占有公共資源時,其他第三方節(jié)點(diǎn)訪問公共資源不得不處于阻塞狀態(tài)。

2、單點(diǎn)故障。由于協(xié)調(diào)者的重要性,一旦協(xié)調(diào)者發(fā)生故障。參與者會一直阻塞下去。尤其在第二階段,協(xié)調(diào)者發(fā)生故障,那么所有的參與者還都處于鎖定事務(wù)資源的狀態(tài)中,而無法繼續(xù)完成事務(wù)操作。(如果是協(xié)調(diào)者掛掉,可以重新選舉一個協(xié)調(diào)者,但是無法解決因為協(xié)調(diào)者宕機(jī)導(dǎo)致的參與者處于阻塞狀態(tài)的問題)

3、數(shù)據(jù)不一致。在二階段提交的階段二中,當(dāng)協(xié)調(diào)者向參與者發(fā)送commit請求之后,發(fā)生了局部網(wǎng)絡(luò)異?;蛘咴诎l(fā)送commit請求過程中協(xié)調(diào)者發(fā)生了故障,這回導(dǎo)致只有一部分參與者接受到了commit請求。而在這部分參與者接到commit請求之后就會執(zhí)行commit操作。但是其他部分未接到commit請求的機(jī)器則無法執(zhí)行事務(wù)提交。于是整個分布式系統(tǒng)便出現(xiàn)了數(shù)據(jù)部一致性的現(xiàn)象。

4、二階段無法解決的問題:協(xié)調(diào)者再發(fā)出commit消息之后宕機(jī),而唯一接收到這條消息的參與者同時也宕機(jī)了。那么即使協(xié)調(diào)者通過選舉協(xié)議產(chǎn)生了新的協(xié)調(diào)者,這條事務(wù)的狀態(tài)也是不確定的,沒人知道事務(wù)是否被已經(jīng)提交。

由于二階段提交存在著諸如同步阻塞、單點(diǎn)問題、腦裂等缺陷,所以,研究者們在二階段提交的基礎(chǔ)上做了改進(jìn),提出了三階段提交。

3PC

三階段提交(Three-phase commit),也叫三階段提交協(xié)議(Three-phase commit protocol),是二階段提交(2PC)的改進(jìn)版本。

與兩階段提交不同的是,三階段提交有兩個改動點(diǎn)。

?引入超時機(jī)制。同時在協(xié)調(diào)者和參與者中都引入超時機(jī)制。?在第一階段和第二階段中插入一個準(zhǔn)備階段。保證了在最后提交階段之前各參與節(jié)點(diǎn)的狀態(tài)是一致的。

也就是說,除了引入超時機(jī)制之外,3PC把2PC的準(zhǔn)備階段再次一分為二,這樣三階段提交就有CanCommit、PreCommit、DoCommit三個階段。

CanCommit階段

3PC的CanCommit階段其實和2PC的準(zhǔn)備階段很像。協(xié)調(diào)者向參與者發(fā)送commit請求,參與者如果可以提交就返回Yes響應(yīng),否則返回No響應(yīng)。

1.事務(wù)詢問 協(xié)調(diào)者向參與者發(fā)送CanCommit請求。詢問是否可以執(zhí)行事務(wù)提交操作。然后開始等待參與者的響應(yīng)。2.響應(yīng)反饋 參與者接到CanCommit請求之后,正常情況下,如果其自身認(rèn)為可以順利執(zhí)行事務(wù),則返回Yes響應(yīng),并進(jìn)入預(yù)備狀態(tài)。否則反饋No

PreCommit階段

協(xié)調(diào)者根據(jù)canCommit階段參與者的反應(yīng)情況來決定是否可以繼續(xù)事務(wù)的PreCommit操作。根據(jù)響應(yīng)情況,有以下兩種可能。

假如協(xié)調(diào)者在CanCommit階段從所有的參與者獲得的反饋都是Yes響應(yīng),那么就會執(zhí)行事務(wù)的預(yù)執(zhí)行。

1.發(fā)送預(yù)提交請求?協(xié)調(diào)者向參與者發(fā)送PreCommit請求,并進(jìn)入Prepared階段。2.事務(wù)預(yù)提交?參與者接收到PreCommit請求后,會執(zhí)行事務(wù)操作,并將undo和redo信息記錄到事務(wù)日志中。3.響應(yīng)反饋?如果參與者成功的執(zhí)行了事務(wù)操作,則返回ACK響應(yīng),同時開始等待最終指令。

假如canCommit階段有任何一個參與者向協(xié)調(diào)者發(fā)送了No響應(yīng),或者等待超時之后,協(xié)調(diào)者都沒有接到參與者的響應(yīng),那么就執(zhí)行事務(wù)的中斷。

1.發(fā)送中斷請求?協(xié)調(diào)者向所有參與者發(fā)送abort請求。2.中斷事務(wù)?參與者收到來自協(xié)調(diào)者的abort請求之后(或超時之后,仍未收到協(xié)調(diào)者的請求),執(zhí)行事務(wù)的中斷。

doCommit階段

該階段進(jìn)行真正的事務(wù)提交,也可以分為以下兩種情況。

執(zhí)行提交

1.發(fā)送提交請求?協(xié)調(diào)接在preCommit階段收到參與者發(fā)送的ACK響應(yīng),那么他將從預(yù)提交狀態(tài)進(jìn)入到提交狀態(tài)。并向所有參與者發(fā)送doCommit請求。2.事務(wù)提交?參與者接收到doCommit請求之后,執(zhí)行正式的事務(wù)提交。并在完成事務(wù)提交之后釋放所有事務(wù)資源。3.響應(yīng)反饋?事務(wù)提交完之后,向協(xié)調(diào)者發(fā)送Ack響應(yīng)。4.完成事務(wù)?協(xié)調(diào)者接收到所有參與者的ack響應(yīng)之后,完成事務(wù)。

中斷事務(wù)協(xié)調(diào)者在preCommit階段沒有接收到參與者發(fā)送的ACK響應(yīng)(可能是接受者發(fā)送的不是ACK響應(yīng),也可能響應(yīng)超時),那么就會執(zhí)行中斷事務(wù)。

1.發(fā)送中斷請求 協(xié)調(diào)者向所有參與者發(fā)送abort請求2.事務(wù)回滾 參與者接收到abort請求之后,利用其在階段二記錄的undo信息來執(zhí)行事務(wù)的回滾操作,并在完成回滾之后釋放所有的事務(wù)資源。3.反饋結(jié)果 參與者完成事務(wù)回滾之后,向協(xié)調(diào)者發(fā)送ACK消息4.中斷事務(wù) 協(xié)調(diào)者接收到參與者反饋的ACK消息之后,執(zhí)行事務(wù)的中斷。

在doCommit階段,如果參與者無法及時接收到來自協(xié)調(diào)者的doCommit或者abort請求時,會在等待超時之后,會繼續(xù)進(jìn)行事務(wù)的提交。(其實這個應(yīng)該是基于概率來決定的,當(dāng)進(jìn)入第三階段時,說明參與者在第二階段已經(jīng)收到了PreCommit請求,那么協(xié)調(diào)者產(chǎn)生PreCommit請求的前提條件是他在第二階段開始之前,收到所有參與者的CanCommit響應(yīng)都是Yes。(一旦參與者收到了PreCommit,意味他知道大家其實都同意修改了)所以,一句話概括就是,當(dāng)進(jìn)入第三階段時,由于網(wǎng)絡(luò)超時等原因,雖然參與者沒有收到commit或者abort響應(yīng),但是他有理由相信:成功提交的幾率很大。)

小結(jié)

沒有任何事情是完美的。特別是在分布式的情況下。事實上,分布式在某個程度上其實是人類社會發(fā)展的一個極佳寫真。因為人類社會中個體的可靠性顯然比分布式系統(tǒng)節(jié)點(diǎn)的可靠性要低很多。

三階段提交也不完美。但是它比兩階段好。

兩階段的問題可以這樣分解:

?協(xié)調(diào)者出錯,參與者也出錯;?協(xié)調(diào)者出錯,參與者不出錯;?協(xié)調(diào)者不出錯,參與者出錯;?協(xié)調(diào)者不出錯,參與者也不出錯。

顯然第4種不是問題。所以實際上只有3個問題。而問題2可以通過簡單地NEW一個新的協(xié)調(diào)者來解決。問題3的錯則顯然正是兩階段提交協(xié)議的解決目標(biāo),所以也沒有問題。有問題的只有協(xié)調(diào)者出錯,參與者也出錯的問題。

無論2pc還是3pc只有在以下的情況才會出現(xiàn)數(shù)據(jù)不一致性:協(xié)調(diào)者掛了,備份協(xié)調(diào)者恢復(fù)協(xié)議時,某個參與者掛了,在剩下參與者都是“YES”的狀態(tài)下, 備份協(xié)調(diào)者沒法分辨掛了的參與者狀態(tài)。(此處掛了可理解為宕機(jī)或者時網(wǎng)絡(luò)連不上)

接下來將對上面段落使用一些替代詞:協(xié)調(diào)者A,備份協(xié)調(diào)者B,掛了參與者C

?在2pc中,B需要分辨兩種情形:1是C提交了事務(wù)(phase 2),2是C在原始投票是abort(phase 1)。如果B決定abort,會違反情形1,如果決定commit,則違背C在表決時的意愿,這個時候需要blocking 。(上面的"YES", 在這里可認(rèn)為剩下的參與者在原始投票都是yes。)?在3pc中,B需要分辨兩種情形:1是C提交了事務(wù)(phase 3),2是B不知道C有沒有收到prepare commit(phase 2),在這種情況下,因為我們已經(jīng)phase 1對大家的意愿進(jìn)行了收集,得到的都是commit,所以此處會用比較激進(jìn)做法,非blocking,所以才有上面的腦裂容錯策略,這樣也會降低阻塞范圍。

Paxos算法

Google Chubby的作者M(jìn)ike Burrows說過這個世界上只有一種一致性算法,那就是Paxos,其它的算法都是殘次品。

Paxos在原作者的《Paxos Made Simple》中內(nèi)容是比較精簡的:

第一階段

(a) 提議者選擇一個提議編號n,并向大多數(shù)接受者發(fā)送一個編號n的準(zhǔn)備請求。

(b) 如果承兌人收到的準(zhǔn)備請求的編號n大于其已答復(fù)的任何準(zhǔn)備請求的編號,則承兌人對該請求作出答復(fù),并承諾不接受任何編號小于n且其已接受的編號最高的提案(如有)。

第二階段

(a) 如果提案人從大多數(shù)接受人處收到對其準(zhǔn)備請求(編號n)的響應(yīng),則它向這些接受人中的每一個發(fā)送一個接受請求,請求編號n的提案,其值為v,其中v是響應(yīng)中編號最高的提案的值,或者如果響應(yīng)報告沒有提案,則v是任何值。

(b) 如果承兌人收到編號為n的提案的接受請求,則除非承兌人已對編號大于n的準(zhǔn)備請求作出響應(yīng),否則接受該提案。

翻譯一下:

Paxos問題指分布式系統(tǒng)中存在故障fault,但不存在惡意corrupt節(jié)點(diǎn)場景(消息可能丟失但不會造假)下的共識達(dá)成(Consensus)問題。

Paxos是第一個被證明的共識算法,原理基于兩階段提交并進(jìn)行擴(kuò)展。算法中將節(jié)點(diǎn)分為三種類型:

?倡議者proposer:提交一個提案,等待大家批準(zhǔn)為結(jié)案,往往是客戶端擔(dān)任。?接受者acceptor:負(fù)責(zé)對提案進(jìn)行投票,往往服務(wù)器擔(dān)任。提議超過半數(shù)的接受者投票及被選中。?學(xué)習(xí)者learner:被告知提案結(jié)果,并與之統(tǒng)一,不參與投票過程。客戶端和服務(wù)端都可擔(dān)任。

每個節(jié)點(diǎn)在協(xié)議中可以擔(dān)任多個角色。

Paxos的特點(diǎn):

?一個或多個節(jié)點(diǎn)可以提出提議。?系統(tǒng)針對所有提案中的某個提案必須達(dá)成一致。?最多只能對一個確定的提案達(dá)成一致。?只要超過半數(shù)的節(jié)點(diǎn)存活且可互相通信,整個系統(tǒng)一定能達(dá)成一致狀態(tài)。

第一階段A

Proposer選擇一個提議編號n,向所有的Acceptor廣播Prepare(n)請求。

第一階段B

Acceptor接收到Prepare(n)請求,若提議編號n比之前接收的Prepare請求都要大,則承諾將不會接收提議編號比n小的提議,并且?guī)现癆ccept的提議中編號小于n的最大的提議,否則不予理會。

第二階段A

Proposer得到了多數(shù)Acceptor的承諾后,如果沒有發(fā)現(xiàn)有一個Acceptor接受過一個值,那么向所有的Acceptor發(fā)起自己的值和提議編號n,否則,從所有接受過的值中選擇對應(yīng)的提議編號最大的,作為提議的值,提議編號仍然為n。

第二階段B

Acceptor接收到提議后,如果該提議編號不違反自己做過的承諾,則接受該提議。

Paxos 例子說明

樓主這個例子來自中文維基百科,但樓主為了形象化,輔以圖片解釋,但愿不會讓人更迷糊。

例子:

在 Paxos 島上,有A1, A2, A3, A4, A5 5位議員,就稅率問題進(jìn)行決議。我們假設(shè)幾個場景來解釋:

場景 1:

假設(shè) A1 說:稅率應(yīng)該是 10%。而此時只有他一個人提這個建議。如下圖:

很完美,沒有任何人和他競爭提案,他的這個提案毫無阻撓的通過了。A2 - A5 都會回應(yīng)他:我們收到了你的提案,等待最終的批準(zhǔn)。而 A1 在收到 2 份回復(fù)后,就可以發(fā)布最終的決議:稅率定位 10%,不用再討論了。

這里有個注意的地方就是:為什么收到了 2 份回復(fù)就可以確定提案了呢?答:因為包括他自己,就達(dá)到 3 個人了,少數(shù)服從多數(shù)。如果各位聽說過鴿籠原理/抽屜原理,就明白個大概了。有人說,鴿籠原理/抽屜原理就是 Paxos 的核心思想。

場景 2:

現(xiàn)在我們假設(shè)在 A1 提出 10% 稅率提案的同時, A5 決定將稅率定為 20%,如果這個提案要通過侍從送到其他議員的案頭,A1 的草案將由 4 位侍從送到 A2-A5 那里。但是侍從不靠譜(代表分布式環(huán)境不靠譜),負(fù)責(zé) A2 和 A3 的侍從順利送達(dá),而負(fù)責(zé) A4 和 A5 的侍從則開溜了!

而 A5 的草案則送到了 A4 和 A3 的手中。

現(xiàn)在,A1 ,A2,A3 收到了 A1 的提案,A3,A4, A5 收到 A5 的提案,按照 Paxos 的協(xié)議,A1,A2,A4,A5 4個侍從將接受他們的提案,侍從拿著回復(fù):我已收到你的提案,等待最終批準(zhǔn) 回到提案者那里。

而 A3 的行為將決定批準(zhǔn)哪一個。

當(dāng) A3 同時收到了 A1 和 A5 的請求,該如何抉擇呢?不同的抉擇將會導(dǎo)致不同的結(jié)果。

有 3 種情況,我們分析一下:

場景2:情況一

假設(shè) A1 的提案先送到 A3 那里,并且 A3 接受了該提案并回復(fù)了侍從。這樣,A1 加上 A2 加上 A3,構(gòu)成了多數(shù)派,成功確定了稅率為 10%。而 A5 的侍從由于路上喝酒喝多了,晚到了一天,等他到了,稅率已經(jīng)確定了,A3 回復(fù) A5:兄弟,你來的太晚了,稅率已經(jīng)定好了,不用折騰了,聽 A1 的吧。

如下圖:

場景2:情況二

依然假設(shè) A1 的提案先送到 A3 處,但是這次 A5 的侍從不是放假了,只是中途耽擱了一會。這次, A3 依然會將"接受"回復(fù)給 A1 .但是在決議成型之前它又收到了 A5 的提案。這時協(xié)議根據(jù) A5 的身份地位有兩種處理方式,但結(jié)果相同。

?當(dāng) A5 地位很高,例如 CEO,就回復(fù) A5:我已收到您的提案,等待最終批準(zhǔn),但是您之前有人提出將稅率定為10%,請明察。?當(dāng) A5 沒地位,普通碼農(nóng)一個,直接不回復(fù)。等待 A1 廣播:稅率定為 10% 啦?。。?/span>

如下圖:

場景2:情況三

在這個情況中,我們將看見,根據(jù)提案的時間及提案者的權(quán)勢決定是否應(yīng)答是有意義的。在這里,時間和提案者的權(quán)勢就構(gòu)成了給提案編號的依據(jù)。這樣的編號符合"任何兩個提案之間構(gòu)成偏序"的要求。

A1 和 A5 同樣提出上述提案,這時 A1 可以正常聯(lián)系 A2 和 A3,A5 也可以正常聯(lián)系這兩個人。這次 A2 先收到 A1 的提案; A3 則先收到 A5 的提案。而 A5 更有地位。

在這種情況下,已經(jīng)回答 A1 的 A2 發(fā)現(xiàn)有比 A1 更有權(quán)勢的 A5 提出了稅率 20% 的新提案,于是回復(fù)A5說:我已收到您的提案,等待最終批準(zhǔn)。

而回復(fù) A5 的 A3 發(fā)現(xiàn)新的提案者A1是個小人物,沒地位不予應(yīng)答。

此時,A5 得到了 A2,A3 的回復(fù),于是 A5 說:稅率定為 20%,別再討論了。

那 A4 呢?A4 由于睡過頭了,迷迷糊糊的說:現(xiàn)有的稅率是什么? 如果沒有決定,則建議將其定為 15%.

這個時候,其他的議員就告訴他:哥們,已經(jīng)定為 20% 了,別折騰了。洗洗繼續(xù)睡吧。

整個過程如下圖:

Paxos的死鎖情況

“活鎖”的根本原因在于兩個proposer交替提案,避免“活鎖”的方式為,如果一個proposer通過accpter返回的消息知道此時有更高編號的提案被提出時,該proposer靜默一段時間,而不是馬上提出更高的方案,靜默期長短為一個提案從提出到被接受的大概時間長度即可,靜默期過后,proposer重新提案。系統(tǒng)中之所以要有主proposer的原因在于,如果每次數(shù)據(jù)更改都用paxos,那實在是太慢了,還是通過主節(jié)點(diǎn)下發(fā)請求這樣來的快,因為省去了不必要的paxos時間。所以選擇主proposer用paxos算法,因為選主的頻率要比更改數(shù)據(jù)頻率低太多。但是主proposer掛了咋整,整個集群就一直處于不可用狀態(tài),所以一般都用租約的方式,如果proposer掛了,則租約會過期,其它proposer就可以再重新選主,如果不掛,則主proposer自己續(xù)租。

小結(jié):

Paxos協(xié)議最終解決什么問題?

當(dāng)一個提議被多數(shù)派接受后,這個提議對應(yīng)的值被Chosen(選定),一旦有一個值被Chosen,那么只要按照協(xié)議的規(guī)則繼續(xù)交互,后續(xù)被Chosen的值都是同一個值,也就是這個Chosen值的一致性問題。

Paxos 的目標(biāo):保證最終有一個提案會被選定,當(dāng)提案被選定后,其他議員最終也能獲取到被選定的提案。

Paxos 協(xié)議用來解決的問題可以用一句話來簡化:將所有節(jié)點(diǎn)都寫入同一個值,且被寫入后不再更改。

Raft一致性算法

Raft算法是Paxos算法的一種簡化實現(xiàn)。

包括三種角色:leader,candidate和follower。

?follow:所有節(jié)點(diǎn)都以follower的狀態(tài)開始,如果沒有收到leader消息則會變成candidate狀態(tài)。?candidate:會向其他節(jié)點(diǎn)拉選票,如果得到大部分的票則成為leader,這個過程是Leader選舉。?leader:所有對系統(tǒng)的修改都會先經(jīng)過leader。

其有兩個基本過程:

?Leader選舉:每個candidate隨機(jī)經(jīng)過一定時間都會提出選舉方案,最近階段中的票最多者被選為leader。?同步log:leader會找到系統(tǒng)中l(wèi)og(各種事件的發(fā)生記錄)最新的記錄,并強(qiáng)制所有的follow來刷新到這個記錄。

Raft一致性算法是通過選出一個leader來簡化日志副本的管理,例如日志項(log entry)只允許從leader流向follower。

下面是動畫演示Raft,清晰理解Raft共識如何達(dá)成。

http://thesecretlivesofdata.com/raft/

1.針對簡化版拜占庭將軍問題,Raft 解決方案

假設(shè)將軍中沒有叛軍,信使的信息可靠但有可能被暗殺的情況下,將軍們?nèi)绾芜_(dá)成一致性決定?

Raft 的解決方案大概可以理解成 先在所有將軍中選出一個大將軍,所有的決定由大將軍來做。選舉環(huán)節(jié):比如說現(xiàn)在一共有3個將軍 A, B, C,每個將軍都有一個隨機(jī)時間的倒計時器,倒計時一結(jié)束,這個將軍就會把自己當(dāng)成大將軍候選人,然后派信使去問其他幾個將軍,能不能選我為總將軍?假設(shè)現(xiàn)在將軍A倒計時結(jié)束了,他派信使傳遞選舉投票的信息給將軍B和C,如果將軍B和C還沒把自己當(dāng)成候選人(倒計時還沒有結(jié)束),并且沒有把選舉票投給其他,他們把票投給將軍A,信使在回到將軍A時,將軍A知道自己收到了足夠的票數(shù),成為了大將軍。在這之后,是否要進(jìn)攻就由大將軍決定,然后派信使去通知另外兩個將軍,如果在一段時間后還沒有收到回復(fù)(可能信使被暗殺),那就再重派一個信使,直到收到回復(fù)。

1.選主 Leader Election

2.1 正常情況下選主

假設(shè)現(xiàn)在有如圖5個節(jié)點(diǎn),5個節(jié)點(diǎn)一開始的狀態(tài)都是 Follower。

在一個節(jié)點(diǎn)倒計時結(jié)束 (Timeout) 后,這個節(jié)點(diǎn)的狀態(tài)變成 Candidate 開始選舉,它給其他幾個節(jié)點(diǎn)發(fā)送選舉請求 (RequestVote)

其他四個節(jié)點(diǎn)都返回成功,這個節(jié)點(diǎn)的狀態(tài)由 Candidate 變成了 Leader,并在每個一小段時間后,就給所有的 Follower 發(fā)送一個 Heartbeat 以保持所有節(jié)點(diǎn)的狀態(tài),F(xiàn)ollower 收到 Leader 的 Heartbeat 后重設(shè) Timeout。

這是最簡單的選主情況,只要有超過一半的節(jié)點(diǎn)投支持票了,Candidate 才會被選舉為 Leader,5個節(jié)點(diǎn)的情況下,3個節(jié)點(diǎn) (包括 Candidate 本身) 投了支持就行。

2.2 Leader 出故障情況下的選主

一開始已經(jīng)有一個 Leader,所有節(jié)點(diǎn)正常運(yùn)行。

Leader 出故障掛掉了,其他四個 Follower 將進(jìn)行重新選主。

4個節(jié)點(diǎn)的選主過程和5個節(jié)點(diǎn)的類似,在選出一個新的 Leader 后,原來的 Leader 恢復(fù)了又重新加入了,這個時候怎么處理?在 Raft 里,第幾輪選舉是有記錄的,重新加入的 Leader 是第一輪選舉 (Term 1) 選出來的,而現(xiàn)在的 Leader 則是 Term 2,所有原來的 Leader 會自覺降級為 Follower

2.3 多個 Candidate 情況下的選主

假設(shè)一開始有4個節(jié)點(diǎn),都還是 Follower。

有兩個 Follower 同時 Timeout,都變成了 Candidate 開始選舉,分別給一個 Follower 發(fā)送了投票請求。

兩個 Follower 分別返回了ok,這時兩個 Candidate 都只有2票,要3票才能被選成 Leader。

兩個 Candidate 會分別給另外一個還沒有給自己投票的 Follower 發(fā)送投票請求。

但是因為 Follower 在這一輪選舉中,都已經(jīng)投完票了,所以都拒絕了他們的請求。所以在 Term 2 沒有 Leader 被選出來。

這時,兩個節(jié)點(diǎn)的狀態(tài)是 Candidate,兩個是 Follower,但是他們的倒計時器仍然在運(yùn)行,最先 Timeout 的那個節(jié)點(diǎn)會進(jìn)行發(fā)起新一輪 Term 3 的投票。

兩個 Follower 在 Term 3 還沒投過票,所以返回 OK,這時 Candidate 一共有三票,被選為了 Leader。

如果 Leader Heartbeat 的時間晚于另外一個 Candidate timeout 的時間,另外一個 Candidate 仍然會發(fā)送選舉請求。

兩個 Follower 已經(jīng)投完票了,拒絕了這個 Candidate 的投票請求。

Leader 進(jìn)行 Heartbeat, Candidate 收到后狀態(tài)自動轉(zhuǎn)為 Follower,完成選主。

以上是 Raft 最重要活動之一選主的介紹,以及在不同情況下如何進(jìn)行選主。

3. 復(fù)制日志 Log Replication

3.1 正常情況下復(fù)制日志

Raft 在實際應(yīng)用場景中的一致性更多的是體現(xiàn)在不同節(jié)點(diǎn)之間的數(shù)據(jù)一致性,客戶端發(fā)送請求到任何一個節(jié)點(diǎn)都能收到一致的返回,當(dāng)一個節(jié)點(diǎn)出故障后,其他節(jié)點(diǎn)仍然能以已有的數(shù)據(jù)正常進(jìn)行。在選主之后的復(fù)制日志就是為了達(dá)到這個目的。

一開始,Leader 和 兩個 Follower 都沒有任何數(shù)據(jù)。

客戶端發(fā)送請求給 Leader,儲存數(shù)據(jù) “sally”,Leader 先將數(shù)據(jù)寫在本地日志,這時候數(shù)據(jù)還是 Uncommitted (還沒最終確認(rèn),紅色表示)

Leader 給兩個 Follower 發(fā)送 AppendEntries 請求,數(shù)據(jù)在 Follower 上沒有沖突,則將數(shù)據(jù)暫時寫在本地日志,F(xiàn)ollower 的數(shù)據(jù)也還是 Uncommitted。

Follower 將數(shù)據(jù)寫到本地后,返回 OK。Leader 收到后成功返回,只要收到的成功的返回數(shù)量超過半數(shù) (包含Leader),Leader 將數(shù)據(jù) “sally” 的狀態(tài)改成 Committed。( 這個時候 Leader 就可以返回給客戶端了)

Leader 再次給 Follower 發(fā)送 AppendEntries 請求,收到請求后,F(xiàn)ollower 將本地日志里 Uncommitted 數(shù)據(jù)改成 Committed。這樣就完成了一整個復(fù)制日志的過程,三個節(jié)點(diǎn)的數(shù)據(jù)是一致的,

3.2 Network Partition 情況下進(jìn)行復(fù)制日志

在 Network Partition 的情況下,部分節(jié)點(diǎn)之間沒辦法互相通信,Raft 也能保證在這種情況下數(shù)據(jù)的一致性。

一開始有 5 個節(jié)點(diǎn)處于同一網(wǎng)絡(luò)狀態(tài)下。

Network Partition 將節(jié)點(diǎn)分成兩邊,一邊有兩個節(jié)點(diǎn),一邊三個節(jié)點(diǎn)。

兩個節(jié)點(diǎn)這邊已經(jīng)有 Leader 了,來自客戶端的數(shù)據(jù) “bob” 通過 Leader 同步到 Follower。

因為只有兩個節(jié)點(diǎn),少于3個節(jié)點(diǎn),所以 “bob” 的狀態(tài)仍是 Uncommitted。所以在這里,服務(wù)器會返回錯誤給客戶端

另外一個 Partition 有三個節(jié)點(diǎn),進(jìn)行重新選主。客戶端數(shù)據(jù) “tom” 發(fā)到新的 Leader,通過和上節(jié)網(wǎng)絡(luò)狀態(tài)下相似的過程,同步到另外兩個 Follower。

因為這個 Partition 有3個節(jié)點(diǎn),超過半數(shù),所以數(shù)據(jù) “tom” 都 Commit 了。

網(wǎng)絡(luò)狀態(tài)恢復(fù),5個節(jié)點(diǎn)再次處于同一個網(wǎng)絡(luò)狀態(tài)下。但是這里出現(xiàn)了數(shù)據(jù)沖突 “bob" 和 “tom"

三個節(jié)點(diǎn)的 Leader 廣播 AppendEntries

兩個節(jié)點(diǎn) Partition 的 Leader 自動降級為 Follower,因為這個 Partition 的數(shù)據(jù) “bob” 沒有 Commit,返回給客戶端的是錯誤,客戶端知道請求沒有成功,所以 Follower 在收到 AppendEntries 請求時,可以把 “bob“ 刪除,然后同步 ”tom”,通過這么一個過程,就完成了在 Network Partition 情況下的復(fù)制日志,保證了數(shù)據(jù)的一致性。

小結(jié)

Raft 是能夠?qū)崿F(xiàn)分布式系統(tǒng)強(qiáng)一致性的算法,每個系統(tǒng)節(jié)點(diǎn)有三種狀態(tài) Follower,Candidate,Leader。實現(xiàn) Raft 算法兩個最重要的事是:選主和復(fù)制日志。

一致性協(xié)議之 ZAB

什么是 ZAB 協(xié)議?ZAB 協(xié)議介紹

ZAB 協(xié)議全稱:Zookeeper Atomic Broadcast(Zookeeper 原子廣播協(xié)議)。

ZAB 協(xié)議是為分布式協(xié)調(diào)服務(wù) Zookeeper 專門設(shè)計的一種支持 崩潰恢復(fù) 和 原子廣播 協(xié)議。

整個 Zookeeper 就是在這兩個模式之間切換。簡而言之,當(dāng) Leader 服務(wù)可以正常使用,就進(jìn)入消息廣播模式,當(dāng) Leader 不可用時,則進(jìn)入崩潰恢復(fù)模式。

基于該協(xié)議,Zookeeper 實現(xiàn)了一種 主備模式 的系統(tǒng)架構(gòu)來保持集群中各個副本之間數(shù)據(jù)一致性。其中所有客戶端寫入數(shù)據(jù)都是寫入到 主進(jìn)程(稱為 Leader)中,然后,由 Leader 復(fù)制到備份進(jìn)程(稱為 Follower)中。【涉及到2PC單點(diǎn)問題的解決,崩潰恢復(fù)】

選擇機(jī)制中的概念

1、Serverid:服務(wù)器ID

比如有三臺服務(wù)器,編號分別是1,2,3。

編號越大在選擇算法中的權(quán)重越大。

2、Zxid:數(shù)據(jù)ID

服務(wù)器中存放的最大數(shù)據(jù)ID。【zxid實際上是一個64位的數(shù)字,高32位是epoch(時期; 紀(jì)元; 世; 新時代)用來標(biāo)識leader是否發(fā)生改變,如果有新的leader產(chǎn)生出來,epoch會自增,低32位用來遞增計數(shù)。】

值越大說明數(shù)據(jù)越新,在選舉算法中數(shù)據(jù)越新權(quán)重越大。

3、Epoch:邏輯時鐘

或者叫投票的次數(shù),同一輪投票過程中的邏輯時鐘值是相同的。每投完一次票這個數(shù)據(jù)就會增加,然后與接收到的其它服務(wù)器返回的投票信息中的數(shù)值相比,根據(jù)不同的值做出不同的判斷。

4、Server狀態(tài):選舉狀態(tài)

LOOKING,競選狀態(tài)。

FOLLOWING,隨從狀態(tài),同步leader狀態(tài),參與投票。

OBSERVING,觀察狀態(tài),同步leader狀態(tài),不參與投票。

LEADING,領(lǐng)導(dǎo)者狀態(tài)。

選舉消息內(nèi)容

在投票完成后,需要將投票信息發(fā)送給集群中的所有服務(wù)器,它包含如下內(nèi)容:服務(wù)器ID、數(shù)據(jù)ID、邏輯時鐘、選舉狀態(tài)。

zookeeper是如何保證事務(wù)的順序一致性的(保證消息有序) 在整個消息廣播中,Leader會將每一個事務(wù)請求轉(zhuǎn)換成對應(yīng)的 proposal 來進(jìn)行廣播,并且在廣播 事務(wù)Proposal 之前,Leader服務(wù)器會首先為這個事務(wù)Proposal分配一個全局單遞增的唯一ID,稱之為事務(wù)ID(即zxid),由于Zab協(xié)議需要保證每一個消息的嚴(yán)格的順序關(guān)系,因此必須將每一個proposal按照其zxid的先后順序進(jìn)行排序和處理。

消息廣播

1)在zookeeper集群中,數(shù)據(jù)副本的傳遞策略就是采用消息廣播模式。zookeeper中農(nóng)數(shù)據(jù)副本的同步方式與二段提交相似,但是卻又不同。二段提交要求協(xié)調(diào)者必須等到所有的參與者全部反饋ACK確認(rèn)消息后,再發(fā)送commit消息。要求所有的參與者要么全部成功,要么全部失敗。二段提交會產(chǎn)生嚴(yán)重的阻塞問題。

2)Zab協(xié)議中 Leader 等待 Follower 的ACK反饋消息是指“只要半數(shù)以上的Follower成功反饋即可,不需要收到全部Follower反饋”。

消息廣播具體步驟

1)客戶端發(fā)起一個寫操作請求。

2)Leader 服務(wù)器將客戶端的請求轉(zhuǎn)化為事務(wù) Proposal 提案,同時為每個 Proposal 分配一個全局的ID,即zxid。

3)Leader 服務(wù)器為每個 Follower 服務(wù)器分配一個單獨(dú)的隊列,然后將需要廣播的 Proposal 依次放到隊列中取,并且根據(jù) FIFO 策略進(jìn)行消息發(fā)送。

4)Follower 接收到 Proposal 后,會首先將其以事務(wù)日志的方式寫入本地磁盤中,寫入成功后向 Leader 反饋一個 Ack 響應(yīng)消息。

5)Leader 接收到超過半數(shù)以上 Follower 的 Ack 響應(yīng)消息后,即認(rèn)為消息發(fā)送成功,可以發(fā)送 commit 消息。

6)Leader 向所有 Follower 廣播 commit 消息,同時自身也會完成事務(wù)提交。Follower 接收到 commit 消息后,會將上一條事務(wù)提交。

zookeeper 采用 Zab 協(xié)議的核心,就是只要有一臺服務(wù)器提交了 Proposal,就要確保所有的服務(wù)器最終都能正確提交 Proposal。這也是 CAP/BASE 實現(xiàn)最終一致性的一個體現(xiàn)。

Leader 服務(wù)器與每一個 Follower 服務(wù)器之間都維護(hù)了一個單獨(dú)的 FIFO 消息隊列進(jìn)行收發(fā)消息,使用隊列消息可以做到異步解耦。Leader 和 Follower 之間只需要往隊列中發(fā)消息即可。如果使用同步的方式會引起阻塞,性能要下降很多。

崩潰恢復(fù)

崩潰恢復(fù)主要包括兩部分:Leader選舉 和 數(shù)據(jù)恢復(fù)

zookeeper是如何選取主leader的?

當(dāng)leader崩潰或者leader失去大多數(shù)的follower,這時zk進(jìn)入恢復(fù)模式,恢復(fù)模式需要重新選舉出一個新的leader,讓所有的Server都恢復(fù)到一個正確的狀態(tài)。

Zookeeper選主流程 選舉流程詳述

一、首先開始選舉階段,每個Server讀取自身的zxid。

二、發(fā)送投票信息

a、首先,每個Server第一輪都會投票給自己。

b、投票信息包含 :所選舉leader的Serverid,Zxid,Epoch。Epoch會隨著選舉輪數(shù)的增加而遞增。

三、接收投票信息

1、如果服務(wù)器B接收到服務(wù)器A的數(shù)據(jù)(服務(wù)器A處于選舉狀態(tài)(LOOKING 狀態(tài))

1)首先,判斷邏輯時鐘值:

a)如果發(fā)送過來的邏輯時鐘Epoch大于目前的邏輯時鐘。首先,更新本邏輯時鐘Epoch,同時清空本輪邏輯時鐘收集到的來自其他server的選舉數(shù)據(jù)。然后,判斷是否需要更新當(dāng)前自己的選舉leader Serverid。判斷規(guī)則rules judging:保存的zxid最大值和leader Serverid來進(jìn)行判斷的。先看數(shù)據(jù)zxid,數(shù)據(jù)zxid大者勝出;其次再判斷l(xiāng)eader Serverid,leader Serverid大者勝出;然后再將自身最新的選舉結(jié)果(也就是上面提到的三種數(shù)據(jù)(leader Serverid,Zxid,Epoch)廣播給其他server)

b)如果發(fā)送過來的邏輯時鐘Epoch小于目前的邏輯時鐘。說明對方server在一個相對較早的Epoch中,這里只需要將本機(jī)的三種數(shù)據(jù)(leader Serverid,Zxid,Epoch)發(fā)送過去就行。

c)如果發(fā)送過來的邏輯時鐘Epoch等于目前的邏輯時鐘。再根據(jù)上述判斷規(guī)則rules judging來選舉leader ,然后再將自身最新的選舉結(jié)果(也就是上面提到的三種數(shù)據(jù)(leader Serverid,Zxid,Epoch)廣播給其他server)。

2)其次,判斷服務(wù)器是不是已經(jīng)收集到了所有服務(wù)器的選舉狀態(tài):若是,根據(jù)選舉結(jié)果設(shè)置自己的角色(FOLLOWING還是LEADER),退出選舉過程就是了。

最后,若沒有收集到所有服務(wù)器的選舉狀態(tài):也可以判斷一下根據(jù)以上過程之后最新的選舉leader是不是得到了超過半數(shù)以上服務(wù)器的支持,如果是,那么嘗試在200ms內(nèi)接收一下數(shù)據(jù),如果沒有新的數(shù)據(jù)到來,說明大家都已經(jīng)默認(rèn)了這個結(jié)果,同樣也設(shè)置角色退出選舉過程。

2、 如果所接收服務(wù)器A處在其它狀態(tài)(FOLLOWING或者LEADING)。

a)邏輯時鐘Epoch等于目前的邏輯時鐘,將該數(shù)據(jù)保存到recvset。此時Server已經(jīng)處于LEADING狀態(tài),說明此時這個server已經(jīng)投票選出結(jié)果。若此時這個接收服務(wù)器宣稱自己是leader, 那么將判斷是不是有半數(shù)以上的服務(wù)器選舉它,如果是則設(shè)置選舉狀態(tài)退出選舉過程。

b) 否則這是一條與當(dāng)前邏輯時鐘不符合的消息,那么說明在另一個選舉過程中已經(jīng)有了選舉結(jié)果,于是將該選舉結(jié)果加入到outofelection集合中,再根據(jù)outofelection來判斷是否可以結(jié)束選舉,如果可以也是保存邏輯時鐘,設(shè)置選舉狀態(tài),退出選舉過程?!緍ecvset:用來記錄選票信息,以方便后續(xù)統(tǒng)計;outofelection:用來記錄選舉邏輯之外的選票,例如當(dāng)一個服務(wù)器加入zookeeper集群時,因為集群已經(jīng)存在,不用重新選舉,只需要在滿足一定條件下加入集群即可?!?/p>

描述Leader選擇過程中的狀態(tài)變化,這是假設(shè)全部實例中均沒有數(shù)據(jù),假設(shè)服務(wù)器啟動順序分別為:A,B,C。

Zab 協(xié)議如何保證數(shù)據(jù)一致性

假設(shè)兩種異常情況:1、一個事務(wù)在 Leader 上提交了,并且過半的 Folower 都響應(yīng) Ack 了,但是 Leader 在 Commit 消息發(fā)出之前掛了。2、假設(shè)一個事務(wù)在 Leader 提出之后,Leader 掛了。

要確保如果發(fā)生上述兩種情況,數(shù)據(jù)還能保持一致性,那么 Zab 協(xié)議選舉算法必須滿足以下要求:

Zab 協(xié)議崩潰恢復(fù)要求滿足以下兩個要求:1)確保已經(jīng)被 Leader 提交的 Proposal 必須最終被所有的 Follower 服務(wù)器提交。2)確保丟棄已經(jīng)被 Leader 提出的但是沒有被提交的 Proposal。

根據(jù)上述要求 Zab協(xié)議需要保證選舉出來的Leader需要滿足以下條件:1)新選舉出來的 Leader 不能包含未提交的 Proposal 。即新選舉的 Leader 必須都是已經(jīng)提交了 Proposal 的 Follower 服務(wù)器節(jié)點(diǎn)。2)新選舉的 Leader 節(jié)點(diǎn)中含有最大的 zxid 。這樣做的好處是可以避免 Leader 服務(wù)器檢查 Proposal 的提交和丟棄工作。

Zab 如何數(shù)據(jù)同步

1)完成 Leader 選舉后(新的 Leader 具有最高的zxid),在正式開始工作之前(接收事務(wù)請求,然后提出新的 Proposal),Leader 服務(wù)器會首先確認(rèn)事務(wù)日志中的所有的 Proposal 是否已經(jīng)被集群中過半的服務(wù)器 Commit。

2)Leader 服務(wù)器需要確保所有的 Follower 服務(wù)器能夠接收到每一條事務(wù)的 Proposal ,并且能將所有已經(jīng)提交的事務(wù) Proposal 應(yīng)用到內(nèi)存數(shù)據(jù)中。等到 Follower 將所有尚未同步的事務(wù) Proposal 都從 Leader 服務(wù)器上同步過啦并且應(yīng)用到內(nèi)存數(shù)據(jù)中以后,Leader 才會把該 Follower 加入到真正可用的 Follower 列表中。

Zab 數(shù)據(jù)同步過程中,如何處理需要丟棄的 Proposal

在 Zab 的事務(wù)編號 zxid 設(shè)計中,zxid是一個64位的數(shù)字。

其中低32位可以看成一個簡單的單增計數(shù)器,針對客戶端每一個事務(wù)請求,Leader 在產(chǎn)生新的 Proposal 事務(wù)時,都會對該計數(shù)器加1。而高32位則代表了 Leader 周期的 epoch 編號。

epoch 編號可以理解為當(dāng)前集群所處的年代,或者周期。每次Leader變更之后都會在 epoch 的基礎(chǔ)上加1,這樣舊的 Leader 崩潰恢復(fù)之后,其他Follower 也不會聽它的了,因為 Follower 只服從epoch最高的 Leader 命令。

每當(dāng)選舉產(chǎn)生一個新的 Leader ,就會從這個 Leader 服務(wù)器上取出本地事務(wù)日志充最大編號 Proposal 的 zxid,并從 zxid 中解析得到對應(yīng)的 epoch 編號,然后再對其加1,之后該編號就作為新的 epoch 值,并將低32位數(shù)字歸零,由0開始重新生成zxid。

Zab 協(xié)議通過 epoch 編號來區(qū)分 Leader 變化周期,能夠有效避免不同的 Leader 錯誤的使用了相同的 zxid 編號提出了不一樣的 Proposal 的異常情況。

基于以上策略:

當(dāng)一個包含了上一個 Leader 周期中尚未提交過的事務(wù) Proposal 的服務(wù)器啟動時,當(dāng)這臺機(jī)器加入集群中,以 Follower 角色連上 Leader 服務(wù)器后,Leader 服務(wù)器會根據(jù)自己服務(wù)器上最后提交的 Proposal 來和 Follower 服務(wù)器的 Proposal 進(jìn)行比對,比對的結(jié)果肯定是 Leader 要求 Follower 進(jìn)行一個回退操作,回退到一個確實已經(jīng)被集群中過半機(jī)器 Commit 的最新 Proposal。

小結(jié)

ZAB 協(xié)議和我們之前看的 Raft 協(xié)議實際上是有相似之處的,比如都有一個 Leader,用來保證一致性(Paxos 并沒有使用 Leader 機(jī)制保證一致性)。再有采取過半即成功的機(jī)制保證服務(wù)可用(實際上 Paxos 和 Raft 都是這么做的)。

ZAB 讓整個 Zookeeper 集群在兩個模式之間轉(zhuǎn)換,消息廣播和崩潰恢復(fù),消息廣播可以說是一個簡化版本的 2PC,通過崩潰恢復(fù)解決了 2PC 的單點(diǎn)問題,通過隊列解決了 2PC 的同步阻塞問題。

而支持崩潰恢復(fù)后數(shù)據(jù)準(zhǔn)確性的就是數(shù)據(jù)同步了,數(shù)據(jù)同步基于事務(wù)的 ZXID 的唯一性來保證。通過 + 1 操作可以辨別事務(wù)的先后順序。

NWR模型

Amazon Dynamo的NWR模型。NWR模型把CAP的選擇權(quán)交給了用戶,讓用戶自己的選擇你的CAP中的哪兩個。

所謂NWR模型。N代表N個備份,W代表要寫入至少W份才認(rèn)為成功,R表示至少讀取R個備份。配置的時候要求W+R > N。因為W+R > N, 所以 R > N-W 這個是什么意思呢?就是讀取的份數(shù)一定要比總備份數(shù)減去確保寫成功的倍數(shù)的差值要大。

也就是說,每次讀取,都至少讀取到一個最新的版本。從而不會讀到一份舊數(shù)據(jù)。當(dāng)我們需要高可寫的環(huán)境的時候,我們可以配置W = 1 如果N=3 那么R = 3。這個時候只要寫任何節(jié)點(diǎn)成功就認(rèn)為成功,但是讀的時候必須從所有的節(jié)點(diǎn)都讀出數(shù)據(jù)。如果我們要求讀的高效率,我們可以配置 W=N R=1。這個時候任何一個節(jié)點(diǎn)讀成功就認(rèn)為成功,但是寫的時候必須寫所有三個節(jié)點(diǎn)成功才認(rèn)為成功。

NWR模型的一些設(shè)置會造成臟數(shù)據(jù)的問題,因為這很明顯不是像Paxos一樣是一個強(qiáng)一致的東西,所以,可能每次的讀寫操作都不在同一個結(jié)點(diǎn)上,于是會出現(xiàn)一些結(jié)點(diǎn)上的數(shù)據(jù)并不是最新版本,但卻進(jìn)行了最新的操作。

所以,Amazon Dynamo引了數(shù)據(jù)版本的設(shè)計。也就是說,如果你讀出來數(shù)據(jù)的版本是v1,當(dāng)你計算完成后要回填數(shù)據(jù)后,卻發(fā)現(xiàn)數(shù)據(jù)的版本號已經(jīng)被人更新成了v2,那么服務(wù)器就會拒絕你。版本這個事就像“樂觀鎖”一樣。

但是,對于分布式和NWR模型來說,版本也會有惡夢的時候——就是版本沖的問題,比如:我們設(shè)置了N=3 W=1,如果A結(jié)點(diǎn)上接受了一個值,版本由v1 -> v2,但還沒有來得及同步到結(jié)點(diǎn)B上(異步的,應(yīng)該W=1,寫一份就算成功),B結(jié)點(diǎn)上還是v1版本,此時,B結(jié)點(diǎn)接到寫請求,按道理來說,他需要拒絕掉,但是他一方面并不知道別的結(jié)點(diǎn)已經(jīng)被更新到v2,另一方面他也無法拒絕,因為W=1,所以寫一分就成功了。于是,出現(xiàn)了嚴(yán)重的版本沖突。

Amazon的Dynamo把版本沖突這個問題巧妙地回避掉了——版本沖突這個事交給用戶自己來處理。

于是,Dynamo引入了Vector Clock(矢量鐘)這個設(shè)計。這個設(shè)計讓每個結(jié)點(diǎn)各自記錄自己的版本信息,也就是說,對于同一個數(shù)據(jù),需要記錄兩個事:1)誰更新的我,2)我的版本號是什么。

下面,我們來看一個操作序列:

1)一個寫請求,第一次被節(jié)點(diǎn)A處理了。節(jié)點(diǎn)A會增加一個版本信息(A,1)。我們把這個時候的數(shù)據(jù)記做D1(A,1)。然后另外一個對同樣key的請求還是被A處理了于是有D2(A,2)。這個時候,D2是可以覆蓋D1的,不會有沖突產(chǎn)生。

2)現(xiàn)在我們假設(shè)D2傳播到了所有節(jié)點(diǎn)(B和C),B和C收到的數(shù)據(jù)不是從客戶產(chǎn)生的,而是別人復(fù)制給他們的,所以他們不產(chǎn)生新的版本信息,所以現(xiàn)在B和C所持有的數(shù)據(jù)還是D2(A,2)。于是A,B,C上的數(shù)據(jù)及其版本號都是一樣的。

3)如果我們有一個新的寫請求到了B結(jié)點(diǎn)上,于是B結(jié)點(diǎn)生成數(shù)據(jù)D3(A,2; B,1),意思是:數(shù)據(jù)D全局版本號為3,A升了兩新,B升了一次。這不就是所謂的代碼版本的log么?

4)如果D3沒有傳播到C的時候又一個請求被C處理了,于是,以C結(jié)點(diǎn)上的數(shù)據(jù)是D4(A,2; C,1)。

5)好,最精彩的事情來了:如果這個時候來了一個讀請求,我們要記得,我們的W=1 那么R=N=3,所以R會從所有三個節(jié)點(diǎn)上讀,此時,他會讀到三個版本:

?A結(jié)點(diǎn):D2(A,2)?B結(jié)點(diǎn):D3(A,2; B,1);?C結(jié)點(diǎn):D4(A,2; C,1)

6)這個時候可以判斷出,D2已經(jīng)是舊版本(已經(jīng)包含在D3/D4中),可以舍棄。

7)但是D3和D4是明顯的版本沖突。于是,交給調(diào)用方自己去做版本沖突處理。就像源代碼版本管理一樣。

很明顯,上述的Dynamo的配置用的是CAP里的A和P。

關(guān)注公眾號【Java技術(shù)江湖】后回復(fù)“PDF”即可領(lǐng)取200+頁的《Java工程師面試指南》

強(qiáng)烈推薦,幾乎涵蓋所有Java工程師必知必會的知識點(diǎn),不管是復(fù)習(xí)還是面試,都很實用。



瀏覽 80
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 人妻少妇无码| 日韩黄色电影在线免费观看| 国产美女精品| 西西人体444rt高清大胆模特| 亚州无码精品| 国产一级黄色A片| 久久777| 天天操天天干天天射| 精品乱子伦一区二区三区在线播放 | 四虎操逼| 337p粉嫩噜噜噜| 波多野结衣无码流出| 亚洲a视频| 欧美精品第一页| 粉嫩av在线| 亚洲天堂2016| 一品国精和二品国精的文化意义 | av性爱在线| 国产精品一品二区三区的使用体验| 精品视频久久| 国产又爽又黄免费视频免费| 亚洲一区三区| 伊大香蕉| 日韩黄色片在线观看| 蜜桃久久久亚洲精| 高清无码一区二区三区| 97国产在线视频| 99久久99九九九99九他书对| 少妇喷水视频| 黄色操逼片| 日韩AV无码专区亚洲AV紧身裤| 中文字幕国产| 欧美成人一级| 人妻少妇无码视频| 四川婬妇BBw搡BBBB搡| 天天干人人干| 午夜福利区| 五月丁香婷婷激情综合| 日韩在线一级片| 91成人免费视频| 亚洲有码在线观看| 最新国产在线| 国产精品揄拍500视频| 我想看操逼| 中文字幕丰满的翔田千里| 国产成人三级在线| 黑人无码一二三四五区| 久久国产精品视频| 精品国产乱子伦一区二区三区最新章 | 深夜无码| 91精品导航| 男人的天堂亚洲| ww毛片| 天天狠狠操| 国产婬片一级A片AAA毛片AⅤ| 久久人妻无码| 免费无码视频| 成人伊人| 成人视频在线播放| 日本免费中文字幕| 国产17c精品视频一二三区| 先锋影音一区二区| 西西人体44www大胆无码| 欧美成人网站免费在线观看| 成人毛片一区二区三区无码| 天天操视频网站| 国产香蕉视频免费| 人妻少妇偷人精品无码免费| 国产精品无毛五区六区| 91视频亚洲| 天天干天天撸| 影音先锋男人资源站| 91色在线观看| 日韩中文字幕在线观看视频| 丁香欧美| 国产9熟妇视频网站| 日本欧美在线视频| 超碰人人操人人摸| 亚洲黄色视频在线观看网站| 你懂的视频| 国精产品久拍自产在线网站 | 777在线视频| 黄色免费在线观看网站| 又黄又爽视频| 日本不卡一区二区三区| 蜜桃无码一区| 亚洲国产成人91PORN| 欧美精品一区二区少妇免费A片| 国产女人高潮毛片| 国精品91无码一区二区三区在线 | 成人日韩在线| 综合无码| 少妇高潮一区二区三区99| 免费三级网站| 国产欧美在线综合| 在线看片av| 国产高清无码在线| 蝌蚪窝在线视频免费观看| 婷婷五月天网址| 国产欧美综合精品| 俺来俺去www色官网| 中文字幕婷婷| 四虎影院最新地址| 午夜成人AV| caoporen| 亚洲欧美日韩中文字幕在线观看| 丁香婷婷久久久综合精品国产| 欧美一区二区三曲的| 精品丰满人妻一区二区三区免费观 | 久久久久久久国产精品| 一级一级a免一级a做免费线看内裤 | 日韩黄视频| 亚洲无码人妻在线| 3级毛片| 亚洲中文字幕成人| 高清无码电影| 黄片视频在线免费播放| 免费操B视频| 秘蜜桃色一区二区三区在线观看 | 国产69精品久久久久久久久久久久 | 无码中文在线| 国产精品成人无码免费| 无码三级午夜久久人妻| 蜜桃视频网站18| 日本黄色的视频| 国产精品二| 翔田千里被操120分钟| 91最新地址| 中文免费高清在线观看视频| 丁香花五月激情| 在线免费看黄色| 黄色在线视频观看| 超碰在线91| 中文字幕区| 国产偷拍精品视频| 操东北女人逼| 精品人妻一区二区三区蜜桃| 蕉久中文字慕| 特黄aaaaaaaa真人毛片| 成人激情免费视频| 欧美日韩大屌| 免费性爱视频| 色婷婷一区二区| 囯产一级a一级a免费视频| 亚洲无码高清在线观看| 日韩,变态,另类,中文,人妻| 91综合网| A片网站在线观看| 成人在线乱码视频| 2025天天操| 鲁鲁鲁鲁鲁鲁鲁777777| 高潮视频在线观看| 乱子伦日B视频| AV牛牛| 91视频免费看| 国产在线免费视频| 亚洲护士无码| 大香蕉网视频| 波多野59部无码喷潮| 久色性爱视频| 亚洲AV无码乱码精| 久操国产视频| 91乱伦视频| 五月天激情小说网| 国产三级成人| 高清国产AV| aaa国产| 国产做受精品网站在线观看| 国产一级aa| 欧美不卡在线观看| 另类老妇性BBwBBw| 亚洲日韩成人电影| 波多野结衣视频无码| 青青草超碰| 日韩极品在线观看| 精品三级在线观看| 中文电视剧字幕在线播放免费视频| 全部免费黄色视频| 成人动漫一区二区| 三区在线观看| 91蜜桃婷婷狠狠久久综合9色| 人人澡人人爽| 在线a视频免费观看| 亚洲成人在线播放| 黑人大荫蒂女同互磨| 狠狠撸天天操| 成人精品| 岛国AV免费看| 日韩欧美在中文| 五月天AV网站| 99在线免费观看视频| 热的无码| 亚洲精品国产精品国自产A片同性| 日本三级片在线| 97精品在线| 91性爱视频在线观看| 少妇无码一区| 黄片免费观看视频| 国产秘精品一区二区三区免费| 国产一级片免费看| 草久热| 成人片天天看片欧美一级| 91免费视频观看| 亚洲综合日韩| 91成人一区二区| 99热精品免费在线观看| 九九这里有精品| 亚洲免费毛片| 亚州性爱| 五月婷婷开心| 亚洲高清无码免费| 亚洲视频免费完整版在线播放| 亚洲高清视频免费| 婷婷少妇激情| 蜜臀AV一区二区三区免费看| 色一区二区三区| 国产免费一级片| 黄片网站免费在线观看| 懂色AV| 99爱在线观看| 国产黄色无码| 牛牛在线精品视频| 中文字幕亚洲中文字幕| 亚洲秘无码一区二区三区欧美| 久久天天操| 亚洲www在线观看| 一级黄色免费视频| 国精品无码一区二区三区在线| 欧美成人图片视频在线| 天天干,夜夜操| 久久婷婷六月综合| 99re6热在线精品视频| 99精品在线播放| TokyoKot大交乱无码| 大香蕉啪啪| 婷婷五月综合网| 人成视频在线免费观看| 一本色道久久综合无码人妻软件 | 亚洲国产精品一区二区三区| 国产精品自拍视频| 成人激情视频网| 一道AV| 在线a视频免费观看| 嫩草99| 狠狠色AV| 99re99| 五月丁香综合网| 亚洲少妇一区| 成人一级黄片| 五月天综合| 视色视频在线观看18| 青青操b| 精品一区二区三区四区五区六区七区八区九区 | 四川少妇搡bbw搡bbbb| 久久影院av| 大香蕉美女视频| 仙踪林777777野大粗| 日韩免费视频| 一区二区三区久久久| 亚洲国产一区二区三区| 狠狠干五月天| 热久久伊人| 色哟哟一中文字慕| 在线观看亚| 无码不卡在线播放| 天天毛片| 揄拍成人国产精品视频| 激情婷婷在线| 成人午夜视频精品一区| 在线99精品| 日韩免费在线观看一区入口| 91麻豆福利在线| 中文字幕av久久爽一区| 在线一区二区三区| 国产精品视频免费观看| h片在线播放| www.超碰| 亚洲AV在线观看| 欲色AV| 免费黄色成人网站| 先锋AV资源| 久久福利导航| 欧美成人18| 麻豆三级片| 久久精品免费| 免费无码成人片在线观看在线 | 日韩三级片无码| 国产va在线| 国产乱子伦精品免费,| AV性爱在线| 久色精品| 欧美色色网站| 久久久亚洲熟妇熟女| 五月天色综合| 婷婷视频在线| 蜜桃视频网站| 神马午夜福利| 成人午夜大片| 少妇二区| 午夜成人免费福利| 国产香蕉AV| 亚洲国产成人久久| 免费AV影片| 国产女人18毛片水真多成人如厕 | 欧美性受XXXX黑人XYX性爽一 | 亚洲Japanese办公室制服| 中文无码在线播放| 在线视频亚洲| 九九草影院| 国产青娱乐在线视频| 久热在线资源福利站| 五月丁香婷婷在线观看| 中文在线A∨在线| 成人免费A片在线观看直播96| 91无码人妻一区二区成人aⅴ| 911香蕉视频| 国产女人18毛片水18精| 黄色视频亚洲| 国产a级毛片| 暗呦罗莉精品一区二区| 中文字幕五月久久婷婷| 久久依人大香蕉| 国产乱子伦精品久久| 亚洲AV无码精品国产| 青娱乐av在线| AV无码免费观看| 亚洲福利电影| 亚洲高清无码免费在线观看| 成人中文字幕在线视频| 成人一区二区在线观看| 亚洲精品午夜| 先锋影音在线| 欧美精品日韩在线观看| www欧美| 成人黄色在线| TokyoKot大交乱无码| 久操国产视频| 一本无码视频| 欧美精品久久久久| 99视频免费| 偷偷操av| 骚骚肥肥一区二区三区| 中文无码在线观看中文字幕av中文 | 在线观看黄色电影| 亚洲AV无码成人精品区天堂小说 | 日韩毛片视频| 夜夜爽夜夜高潮夜夜爽| 久久a视频| 黄色免费在线观看| 豆花视频logo进入官网| 久久黄色片| 九九九九AV| 男人的天堂一区| 91.www91成人影视在线观看91成人网址9| 亚洲视频a| 特黄aaaaaaaa真人毛片| 操逼日韩| 99热在线中文字幕| 午夜黄色视频在线观看| 欧美黄色三级片| 九九久久精品| 国产黄色a片| 成人一区视频| 无码一区二区视频| 日韩无码成人电影| 色99在线| 熟女综合网| 成人免费看AA片| 亚洲日本三级片| 干老女人逼| 又大又粗又爽| 日本无码嫩草一区二区| 欧美一级无码| 日韩黄色在线视频| 久热精品视频在线观看| 国产精品麻豆视频| 内射熟妇| 人妻精品一区二区三区| 51成人免费| 九九韩剧网最新电视剧免费观看| av天堂亚洲| 亚洲黄色视频免费| 精品久久久久久亚洲| 蜜桃av秘无码一区三| 欧美午夜福利视频| 一区二区三区三级片| 熟女少妇视频| 中文字幕第5页| 婷婷玖玖| 91无码人妻一区二区| 欧美一区二区在线| 免费观看黄色在线视频| 狠狠干天天干| 国产黄色视频在线观看| 中文字幕无码影院| 怡春院在线| 四虎在线视频观看96| 亚洲一区二区三区在线播放| 久久午夜无码鲁丝片| 成人A片在线播放| 亚洲精品午夜| 亚洲av免费在线| 麻豆传媒视频观看| 欧美久久久久久久| 久草免费在线| 蜜桃无码在线| 亚洲无码一区二区三区| 精品中文字幕在线播放| 久久久久久久久久久国产| 激情网站在线观看| 人妻无码精品久久人妻成人| 天天搞天天搞| 日日干夜夜撸| 1000部毛片A片免费视频| 91狠狠综合久久久久久| 亚洲色婷| 内射视频免费观看| 亚洲综合免费观看高清完整版在线| 午夜91| 妹子干综合| 亚洲黄色在线免费观看| 亚洲精品乱码久久久久久蜜桃91| 丁香激情视频| 美日韩免费视频| 97男人的天堂| 中文子幕免费毛片| 三级无码| 精品久久一区二区三区四区 | 白虎高清无码大尺度免费在线观看| a片视频免费| 免费黄片视频| 亚洲精品影视| 久久精品一区二区三区四区| 国产成人精品a视频一区| 成人乱无码AV在线观看| 草久av| 在线国产小视频| 韩日综合在线| 亚洲成人性爱网站| 操逼手机视频| 不卡无码在线观看| 成人一级黄色电影| 高清免费无码视频| 欧美AAAAAAAAAA特级| 九九九精品视频| 粉嫩99精品99久久久久久特污 | 国外成人在线视频老鸭窝| 97香蕉网| 蜜桃久久久亚洲精| 奇米狠狠色| aV无码av天天aV天天爽第一| 高清无码视频在线播放| 亚洲综人网| 久久久麻豆| 日本狠狠干| 久久午夜无码鲁片午夜精品男男| 欧美成人高清视频| 天天色小说| 一区二区三区四区视频在线| 在线观看免费欧美操逼视频| 中文字幕不卡在线| 五月丁香婷婷在线观看| 欧美日韩精品在线| 青青草成人在线观看| 短发半推半就AV| 看免费黄色视频| 亚洲欧美视频| 在线内射| 香蕉成人网站在线观看| 香蕉毛片| 亚洲GV成人无码久久精品| 国产欧美综合视频一区二区在线| 久久久成人片| 性欧美日韩| 在线一级片| 天天爽天天爽夜夜爽毛片| 久操无码视频| 夜夜骑夜夜| 人人操人人操人人操人人操| 国产久久久| 国产视频福利在线| 国产精品自产拍| www.男人的天堂| 欧美偷拍精品| 久草视频2| 日韩国产欧美| 2018人人操| 国产69视频在线观看| 欧美狠狠干| A片黄色电影| 天天撸天天日| 无码精品一区二区三区在线| 国产高清无码一区二区| 男人手机天堂| 成人福利小视频| 一级黄色视频在线观看| 9999re| 久久99九九| 无码人妻精品一区二区蜜桃91| A色片| 91av视频| 国产灬性灬淫灬欲水灬| 黄色操逼片| 在线激情| 91白丝在线观看| 亚洲精品AⅤ一区二| 国产男女视频| 日韩无码一区二区三| 国产精品A片| 躁BBB躁BBB躁BBBBB乃| 三级av在线观看| 精品国产一区二区三区性色AV| 亚洲人天堂| 最近中文字幕高清2019中文字幕 | 黄片高清免费观看| 五月天黄色小说| 丁香婷婷六月| 久草高清视频| 好吊视频一区二区三区红桃视频you | 五月天丁香成人| 三级片大香蕉| 欧美八区| 亚洲中文字幕2019| 草逼网视频| 一区二区三区精品婷婷| 91人人干| 免费黄片视频在线观看| 亚洲午夜激情电影| 青草伊人av| 91视频免费网站| 国产91精品在线观看| 在线亚洲AV| 日韩AV免费在线播放| 丁月婷婷五香天日五月天| 亚洲一区二区在线免费观看| 日本熟妇高潮BBwBBwBBw| 亚洲精品在线视频观看| 狠狠色噜噜狠狠狠7777米奇网| 97精品人妻| 九色PORNY自拍视频| 大香蕉伊人AV| 99成人网站| 日本免费A∨| 国偷自产视频一区二区久| 在线播放中文字幕| 无码人妻丰满熟妇区毛片视频| 久久久精品午夜人成欧洲亚洲韩国| 国产午夜精品一区二区三区四区 | 高清无码视频免费版本在线观看 | 91在线无码精品秘入口三人| 久久精品国产亚洲AV成人婷婷 | 国产女人高潮毛片| 无码在线播放视频| 天堂网视频| 51乱伦| AV在线无码| 91抽插| 国产香蕉91| 特级西西人体www高清大胆| 天天天天色| 中文字幕高清免费看| 久久三级| 91人人爽| 五月婷婷视频| 黄色二区| 亚洲精品久久久久久久久豆丁网 | 大香伊人| 一级免费黄片| 在线免费观看AV片| 日韩小电影免费观看高清完整版在线观 | 日本色色网| 97碰碰碰| 无码一区三区| 日韩小视频在线观看| 大香蕉伊人AV| 在线免费看黄色视频| 日本中文字幕网站| 欧美一级A片在线观看| 乱伦内射视频| 特写毛茸茸BBwBBwBBw| 人妻18无码人伦一区二区三区精品 | 91丨PORNY丨丰满人妻网站| 日本熟妇高潮BBwBBwBBw| 操逼中文字幕| 色天使视频| 一区二区三区不卡在线| 成人做爰100片免费视频| 欧美a片在线看| 国产乱子伦一区二区三区视频| 高清无码久久| 欧美性爱在线网站| 99视频免费在线| 日韩A级视频| 国产精品欧美激情| 少妇AAA级久久久无码精品片 | 九九热这里有精品| 日韩在线91| 国产AⅤ无码一区二区| 国产精品小电影| A级免费视频| 人人看人人插| 五月激情丁香婷婷| 午夜综合网| 最新中文字幕av| 伊人精品A片一区二区三区| 日韩欧美成人在线视频| 亚洲久久在线| 国产中文视频| 97香蕉久久国产超碰青草专区| 一级黄色片在线观看| 亚洲视频免费播放| 欧美草逼视频| 亚洲无线观看| 自拍偷拍网| 日本少妇黄色视频| 亚洲乱论| 色综合99久久久无码国产精品 | 在线观看黄色AV| 51妺嘿嘿午夜福利| 亚洲在线视频播放| 欧美亚洲| 午夜国产视频| www.国产豆花精品区| 日韩aaaa| 欧美一级A片免费看视频小说| 91理论片| 精品AV无码| 黄片网页| www.人人操| 久久国产精品波多野结衣AV| 永井玛丽亚av无码中出流出| 一本久道综合| 影音先锋亚洲无码| 国产欧美日韩综合在线视频| 麻豆精品传媒2021md| 亚州高清无码视频| 狠狠视频| 91精品久久久久| 欧美国产日韩欧美亚洲国产 | 国产大屌| 无码无码无码| 国产综合精品久久久久成人AV| 天天日天天色| 国产又粗又长又硬黄色一级片| 超碰在线网| 天天日日日干| 成人大片在线观看| 亚洲视频中文字幕| 99视频免费| 一级操逼视频免费观看| 99r6热只有精品免费观看| 少妇搡BBBB搡BBB搡毛片少妇| 国产黄色视频在线观看免费| 玖玖爱国产| 99视频在线免费观看| 性满足BBwBBWBBw| 91精品国产一区三一| 亚洲九九视频| 蜜臀av在线观看| 免费激情| 人人操在线公开| 人人操人人网站| 久久这里只有精品9| 香蕉三级片| 五月丁香在线视频| 亚洲精品无码在线播放| 国产亲子乱婬一级A片借种| 日本一区二区三区免费观看| 久久久久久免费视频| 欧美三级网站| 成人久久久久久| 久久久久麻豆V国产精华液好用吗| 高清无码在线观看免费| 日皮视频在线观看| 无码三级在线播放| 在线激情网站| 国产精品欧美7777777| 色玉米地熟妇| 久久免费9| 影音av资源| 欧美成人视频网站| 美日韩综合| 99久草| 亚洲小说区图片区| 日韩美女免费性爱视频| 亚洲毛片亚洲毛片亚洲毛片| 三个黑人猛躁我一晚上| 天天综合91| 色情片在线播放| 91人妻人人澡人人爽人妻| 久久亚洲成人| 女生操网站| 五月丁香婷婷色色| 日韩无码一级片| 欧美自拍一区| 嘉兴少妇按摩69XX| 人人爽人人爽人人爽| 狠狠撸狠狠撸| 久久艹久久| 毛片在线视频| 欧美精品无码久久久精品酒店| 操BBB操BBB| 九哥草逼网| 亚州精品国产精品乱码不99勇敢 | 男女av免费观看| 国产婷婷色一区二区在线观看| 国精品无码人妻一区二区三区免费| 丁香婷婷综合网| 亚洲综合视频在线观看| 一级片黄色电影| 国产一级a一片成人AV| 一级免费黄片| 嫩BBB槡BBBB槡BBBB| 亚洲av动漫| 国产熟妇码AV| 在线播放91灌醉迷J高跟美女| 99热国产免费| 午夜免费播放观看在线视频| 国产剧情一区二区三区| 黄色录像一级片| 五月天激情啪啪| aa免费视频| 视色视频在线观看| 亚洲免费一级片| 久久国内视频| 久久免费成人电影| 亚洲最新中文字幕| 日韩一级电影在线| 一级性爽A√毛片| 韩日美女性爱| 中文字幕在线日本| 国产成人精品一区二区| 亚洲伊人影院| 91在线小视频| 蜜桃无码在线| 狠狠视频| 无码成人网| 五月涩| 北条麻妃精品青青久久价格| 欧美激情另类| 麻豆一区视频| 老妇槡BBBB槡BBBB槡| 国产91探花系列在线观看| 日韩色在线| 日韩性爱视屏| 蜜臀AV网| 一夲道无码专区av无码A片| 日本一区二区在线视频| 成人不卡| 影音先锋成人在线视频| 中文字幕在线观看av| 免费看无码| 日韩电影一区| 亚洲精品国产AV婷婷| 东京热视频网站| 9久9久9久9久女女女女| 黑人无码| 色色色欧美| 人人摸人人草| 免费无码婬片AAAA片老婦| 亚洲福利视频电影精| 色婷婷五月天在线观看| 在线观看高清无码中文字幕| jizzjizz欧美| 大香蕉美女视频| 黄片视频在线免费观看| 色婷婷7777| 麻豆av在线| 亚洲无码AV一区二区| 成人精品视频| 北条麻妃在线中文字幕| 亚洲偷拍中文| 人人操在线播放| 伊人大香在线| 91人人澡| 亚洲AV性爱| 中国人妻HDbute熟睡| 在线观看黄色AV| 国产成人无码精免费视频| 亚洲另类视频| 天堂8在线| 亚洲无码免费视频在线观看| 亚洲无码专区在线| 国产小黄片在线| 国产精品乱伦| aaa无码| 啪啪视频m3u8| 91乱子伦国产乱子伦| 91久久人澡人妻人人做人人爽97 | 色色视频免费看| 成人无码动漫A片| 性色在线| 国产欧美一区二区三区视频| 久久99精品久久久久久水蜜桃| 日韩顶级毛片| 亚洲第一免费视频| 欧美AⅤ视频| 99精品视频在线观看| 色99视频| 国产永久在线| 亚洲成人网站在线观看| 蜜桃av无码一区二区三区| 亚洲日本中文字幕在线| 久草福利在线| 日韩无码AV一区二区| 色播网址| 日韩无码毛片| 九色PORNY蝌蚪视频| a片在线免费播放| 一区在线观看| 欧美成人午夜视频| 国产精品国产三级囯产普通话2| 97日韩天堂| 亚洲AV无码免费| 成人黄色无码视频| www日韩无码| 亚洲精品视频无码| 中文字幕在线观看视频免费| 亚洲最新在线观看| 黄片网站免费观看| 国产一级a毛一级a毛观看视频网站 | 最近中文字幕mv第三季歌词| 黄色视频在线观看地址| 2014亚洲天堂| 无码中文字幕网站| 中文字幕成人无码| 亚洲图片在线| 久久久久久久| 军人妓女院BD高清片在线播放| 亚洲91网站| 国产成人免费观看视频| www.啪啪| 婷婷亚洲色| AV色天堂| 97超碰网| 丁香婷婷色五月激情综合三级三级片欧美日韩国| 亚洲熟女视频| 爱爱午夜福利| 一区二区av在线| 成人先锋AV| 操B视频网站| 十八禁无码网站在线观看| 人妻在线免费视频| 久久久久久亚洲精品| 青青草手机在线视频| 特级黄色视频| 91久久精品无码一区| 五月婷婷狠狠爱| 日韩AV在线免费观看| www.国产精品| 久久午夜电影| 一插菊花综合视频| 最美人妖系列国产Ts涵涵| 亚洲性爱网站| 悠悠色综合| 熟妇人妻中文AV无码| 日韩无码精品一区二区三区| 欧美极品少妇| 久久婷婷青青| 四川少妇BBB凸凸凸BBB安慰我 | 豆花视频| 思思热99| AAAAA毛片| 日韩精品视频一区二区三区| 精品国产乱码| 99久久人妻精品免费二区| 三级AV在线免费观看| 91精品无码| 五月激情网站| 亚洲人妻在线观看| 日韩美女在线| 亚洲午夜久久久久久久久| 69亚洲| 日韩天堂在线播放| 四虎影院中文字幕| 91一区二区| 乱伦精品| AV一级片| 尹人成人| 丁香五月六月| 亚洲免费黄片| 只有精品| 色色五月丁香婷婷| 黄色电影视频在线| 日韩av无码电影| 99精品亚洲| 亚洲一区自拍| 噜噜色av| 免费无码成人| 成人欧美一区二区三区白人| 精品國產一區二區三區久久蜜月| 猫咪视频大全视频| 日韩大香蕉| 亚洲欧美成人| 一区二区三区欧美| 日韩做爱视频| 91无码人妻| 波多野结衣黄色| 肏逼网站| 91麻豆精品|