日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

隨著大型網(wǎng)站的各種高并發(fā)訪問、海量數(shù)據(jù)處理等場景越來越多,如何實(shí)現(xiàn)網(wǎng)站的高可用、易伸縮、可擴(kuò)展、安全等目標(biāo)就顯得越來越重要。為了解決這樣一系列問題,大型網(wǎng)站的架構(gòu)也在不斷發(fā)展。提高大型網(wǎng)站的高可用架構(gòu),不得不提的就是分布式。在關(guān)于分布式事務(wù)、兩階段提交協(xié)議、三階提交協(xié)議一文中主要用于解決分布式一致性問題的集中協(xié)議,那么這篇文章主要講解業(yè)內(nèi)公認(rèn)的比較難的也是最行之有效的paxos算法。

我認(rèn)為對paxos算法講解的最清楚的就是維基百科了。但是要看懂維基百科中的介紹需要很強(qiáng)的數(shù)學(xué)思維(paxos畢竟是一個算法),而且有很多關(guān)于定理的推論、證明等過程。那么本篇文章主要站在程序的角度,通俗的,循序漸進(jìn)的講解到底什么是paxos算法。

背景

google Chubby的作者M(jìn)ike Burrows說過, there is only one consensus protocol, and that’s Paxos” – all other Approaches are just broken versions of Paxos. 意即世上只有一種一致性算法,那就是Paxos,所有其它一致性算法都是Paxos算法的不完整版。

Paxos算法是萊斯利·蘭伯特(Leslie Lamport,就是 LaTeX 中的”La”,此人現(xiàn)在在微軟研究院)于1990年提出的一種基于消息傳遞的一致性算法。為描述 Paxos 算法,Lamport 講述了這樣一個故事:

在古希臘有一個島嶼叫做Paxos,這個島嶼通過議會的形式修訂法律。執(zhí)法者(legislators,后面稱為牧師priest)在議會大廳(chamber)中表決通過法律,并通過服務(wù)員傳遞紙條的方式交流信息,每個執(zhí)法者會將通過的法律記錄在自己的賬目(ledger)上。問題在于執(zhí)法者和服務(wù)員都不可靠,他們隨時會因?yàn)楦鞣N事情離開議會大廳、服務(wù)員也有可能重復(fù)傳遞消息(或者直接徹底離開),并隨時可能有新的執(zhí)法者(或者是剛暫時離開的)回到議會大廳進(jìn)行法律表決,因此,議會協(xié)議要求保證上述情況下可以能夠正確的修訂法律并且不會產(chǎn)生沖突。

什么是paxos算法

Paxos 算法是分布式一致性算法用來解決一個分布式系統(tǒng)如何就某個值(決議)達(dá)成一致的問題。

人們在理解paxos算法是會遇到一些困境,那么接下來,我們帶著以下幾個問題來學(xué)習(xí)paxos算法:

1、paxos到底在解決什么問題?

2、paxos到底如何在分布式存儲系統(tǒng)中應(yīng)用?

3、paxos的核心思想是什么?

paxos解決了什么問題

在關(guān)于分布式一致性的探究中我們提到過,分布式的一致性問題其實(shí)主要是指分布式系統(tǒng)中的數(shù)據(jù)一致性問題。所以,為了保證分布式系統(tǒng)的一致性,就要保證分布式系統(tǒng)中的數(shù)據(jù)是一致的。

在一個分布式數(shù)據(jù)庫系統(tǒng)中,如果各節(jié)點(diǎn)的初始狀態(tài)一致,每個節(jié)點(diǎn)都執(zhí)行相同的操作序列,那么他們最后能得到一個一致的狀態(tài)。為保證每個節(jié)點(diǎn)執(zhí)行相同的命令序列,需要在每一條指令上執(zhí)行一個“一致性算法”以保證每個節(jié)點(diǎn)看到的指令一致。

所以,paxos算法主要解決的問題就是如何保證分布式系統(tǒng)中各個節(jié)點(diǎn)都能執(zhí)行一個相同的操作序列。

分布式一致性算法——paxos

 

上圖中,C1是一個客戶端,N1、N2、N3是分布式部署的三個服務(wù)器,初始狀態(tài)下N1、N2、N3三個服務(wù)器中某個數(shù)據(jù)的狀態(tài)都是S0。當(dāng)客戶端要向服務(wù)器請求處理操作序列:op1op2op3時(op表示operation)(這里把客戶端的寫操作簡化成向所有服務(wù)器發(fā)送相同的請操作序列,實(shí)際上可能通過Master/Slave模式處理)。如果想保證在處理完客戶端的請求之后,N1、N2、N3三個服務(wù)器中的數(shù)據(jù)狀態(tài)都能從S0變成S1并且一致的話(或者沒有執(zhí)行成功,還是S0狀態(tài)),就要保證N1、N2、N3在接收并處理操作序列op1op2op3時,嚴(yán)格按照規(guī)定的順序正確執(zhí)行opi,要么全部執(zhí)行成功,要不就全部都不執(zhí)行。

所以,針對上面的場景,paxos解決的問題就是如何依次確定不可變操作opi的取值,也就是確定第i個操作什么,在確定了opi的內(nèi)容之后,就可以讓各個副本執(zhí)行opi操作。

Paxos算法詳解

Paxos是一個十分巧妙的一致性算法,但是他也十分難以理解,就連他的作者Lamport都被迫對他做過多種講解。我認(rèn)為對paxos算法講解的最清楚的就是維基百科了。但是要看懂維基百科中的介紹需要很強(qiáng)的數(shù)學(xué)思維(paxos畢竟是一個算法),而且有很多關(guān)于定理的推論、證明等過程。那么本篇文章主要站在程序的角度,通俗的,循序漸進(jìn)的講解到底什么是paxos算法。

我們先把前面的場景簡化,把我們現(xiàn)在要解決的問題簡化為如何確定一個不可變變量的取值(每一個不可變變量可以標(biāo)識一個操作序列中的某個操作,當(dāng)確保每個操作都正確之后,就可以按照順序執(zhí)行這些操作來保證數(shù)據(jù)能夠準(zhǔn)確無誤的從一個狀態(tài)轉(zhuǎn)變成另外一個狀態(tài)了)。


接下來,請跟我一步一步的學(xué)習(xí)paxos算法。

要學(xué)習(xí)paxos算法,我們就要從他要解決的問題出發(fā),假如沒有paxos算法,當(dāng)我們面對如何確定一個不可變變量的取值這樣一個問問題的時候,我們應(yīng)該如何解決呢?

這里暫不介紹paxos中的角色的概念,讀者可以自行從維基百科中了解。不了解的話也可以直接往下看,看著看著就了解了。

問題抽象

我們把確定一個不可變變量的取值問題定義成:

設(shè)計一個系統(tǒng),來存儲名稱為var的變量。

var的取值可以是任意二進(jìn)制數(shù)

系統(tǒng)內(nèi)部由多個Accepter組成,負(fù)責(zé)管理和存儲var變量。

系統(tǒng)對外提供api,用來設(shè)置var變量的值propose(var,V) => <ok,f> or <error>

將var的值設(shè)置為V,系統(tǒng)會返回ok和系統(tǒng)中已經(jīng)確定的取值f,或者返回error。

外部有多個Proposer機(jī)器任意請求系統(tǒng),調(diào)用系統(tǒng)API(propose(var,V) => <ok,f> or <error>)來設(shè)置var變量的值。

如果系統(tǒng)成功的將var設(shè)置成了V,那么返回的f應(yīng)該就是V的值。否則,系統(tǒng)返回的f就是其他的Proposer設(shè)置的值。

>

系統(tǒng)需要保證var的取值滿足一致性

如果var沒有被設(shè)置過,那么它的初始值為null

一旦var的值被設(shè)置成功,則不可被更改,并且可以一直都能獲取到這個值

系統(tǒng)需要滿足容錯特性

可以容忍任意proposer出現(xiàn)故障可以容忍少數(shù)acceptor故障(半數(shù)以下)

暫時忽略網(wǎng)絡(luò)分化問題和acceptor故障導(dǎo)致var丟失的問題。

到這里,問題已經(jīng)抽象完成了,讀者可以再仔細(xì)看看上面的系統(tǒng)描述。如果這樣設(shè)置一個系統(tǒng),是不是就可以保證變量var的不可變性了呢?

這里還是再簡單講解一下,上面的系統(tǒng)確實(shí)可以保證變量var的不可變性。

因?yàn)関ar的初始值為null,當(dāng)有proposer請求接口propose(var,v)設(shè)置var的值的時候,系統(tǒng)會將var設(shè)置為v,并返回f(f==v)。

var變量被初始化以后,再有proposer請求propose(var,v)設(shè)置var的值的時候,系統(tǒng)會直接返回系統(tǒng)中已有的var的值f,而放棄proposer提供的v。

系統(tǒng)難點(diǎn)

要設(shè)計以上系統(tǒng)存在以下難點(diǎn):

1、管理多個proposer并發(fā)執(zhí)行

2、容忍var變量的不可變性

3、容忍任意Proposer的故障

4、容忍半數(shù)以下的acceptor的故障

解決方案一

先考慮整個系統(tǒng)由單個acceptor組成。通過類似互斥鎖的方式來管理并發(fā)的proposer的請求。

proposer向acceptor申請acceptor的互斥訪問權(quán),當(dāng)取得互斥訪問權(quán)之后才能調(diào)用api給var變量賦值。accepter向proposer發(fā)放互斥訪問權(quán),誰取得了互斥訪問權(quán),acceptor就接收誰的請求。這樣通過互斥訪問的機(jī)制,proposer就要按照獲取互斥訪問權(quán)的順序來請求系統(tǒng)。一旦acceptor接收到一個proposer請求,并成功給var變量賦值之后,就不再允許其他的proposer設(shè)置var變量的值。每當(dāng)再有proposer來請求設(shè)置var變量的值的時候,acceptor就會將var里面現(xiàn)有的值返回給他。

基于互斥訪問權(quán)的acceptor的實(shí)現(xiàn)

acceptor會保存變量var的值和一個互斥鎖Lock。

提供接口prepare()

加互斥鎖,給予var的互斥訪問權(quán),并返回當(dāng)前var的取值

提供接口release()

用于釋放互斥訪問權(quán)

提供接口accept(var, v)

如果已經(jīng)加鎖,并且當(dāng)前var沒有值,則將var的值設(shè)置成v,并釋放鎖。

proposer采用兩階段來實(shí)現(xiàn)

Step1、通過調(diào)用prepare接口來獲取互斥性訪問權(quán)和當(dāng)前var的取值

如果無法獲取到互斥性訪問權(quán),則返回,并不能進(jìn)入到下一個階段,因?yàn)槠渌鹥roposer獲取到了互斥性訪問權(quán)。

Step2、根據(jù)當(dāng)前var的取值f選擇執(zhí)行

1、如果f的取值為null,說明沒有被設(shè)置過值,則調(diào)用接口accept(var ,v)來將var的取值設(shè)置成v,并釋放掉互斥性訪問權(quán)。2、如果f的取值不為null,說明var已經(jīng)被其他proposer設(shè)置過值,則調(diào)用release接口釋放掉互斥性訪問權(quán)。

總結(jié):方案一通過互斥訪問的方式來保證所有的proposer能夠串行的訪問acceptor,這樣其實(shí)并沒有解決多個proposer并發(fā)執(zhí)行的問題。只是想辦法繞開了并發(fā)執(zhí)行。雖然可以在一定程度上保證var變量的取值是確定的。但是一旦獲取到互斥訪問權(quán)的proposer在執(zhí)行過程中出現(xiàn)故障,那么就會導(dǎo)致所有其他proposer無法再獲取到互斥訪問權(quán),就會發(fā)生死鎖。。所以,方案一不僅效率低、而且還會產(chǎn)生死鎖問題,不能容忍任意Proposer出現(xiàn)故障。在之前提到的四個系統(tǒng)難點(diǎn)中,方案一可以解決難點(diǎn)1和難點(diǎn)2,但是無法解決難點(diǎn)3和難點(diǎn)4。

解決方案二

通過引入搶占式訪問權(quán)來取代互斥訪問權(quán)。acceptor有權(quán)讓任意proposer的訪問權(quán)失效,然后將訪問權(quán)發(fā)放給其他的proposer。

在方案二中,proposer向acceptor發(fā)出的每次請求都要帶一個編號(epoch),且編號間要存在全序關(guān)系。一旦acceptor接收到proposer的請求中包含一個更大的epoch的時候,馬上讓舊的epoch失效,不再接受他們提交的取值。然后給新的epoch發(fā)放訪問權(quán),讓它可以設(shè)置var變量的值。

為了保證var變量取值的不變性,不同epoch的proposer之前遵守后者認(rèn)同前者的原則:

在確保舊的epoch已經(jīng)失效后,并且舊的epoch沒有設(shè)置var變量的值,新的epoch會提交自己的值。當(dāng)舊的epoch已經(jīng)設(shè)置過var變量的取值,那么新的epoch應(yīng)該認(rèn)同舊的epoch設(shè)置過的值,并不再提交新的值。

基于搶占式訪問權(quán)的acceptor的實(shí)現(xiàn)

原文鏈接:
http://www.hollischuang.com/archives/693

分享到:
標(biāo)簽:分布式 算法 一致性
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定