Paxos 算法是一種多數(shù)派決議,是解決分布式系統(tǒng)中數(shù)據(jù)一致性最有效的一種算法(Google Chubby的作者M(jìn)ike Burow 說(shuō)過(guò)這個(gè)世界上只有一種一致性算法那就是Paxos,其他的算法都是殘次品)
Paxos 中主要有三個(gè)角色
Proposer : 提交者(議案提交者) Acceptor:接收者(議案接收者),Learber :學(xué)習(xí)者
要滿足Paxos算法需要滿足以下四個(gè)前提:
1 如果Acceptor 沒(méi)有議案必須接收第一個(gè)議案
2 每個(gè)議案都必須有一個(gè)議案編號(hào),并且議案編號(hào)只能增長(zhǎng),不能重復(fù),隨著時(shí)間議案編號(hào)會(huì)遞增
3 如果Acceptor已經(jīng)接收的議案如果大于新接收的議案那么拒絕。
4 一個(gè)Acceptor會(huì)接收到提交的議案和批準(zhǔn)的議案
Paxos 算法主要分為兩階段:
1 Prepare 階段(決議提交)
a) Proposer 提出議案,并且將議案編號(hào)K,并且把這個(gè)議案編號(hào)K發(fā)給Acceptor
b) Acceptor判斷手里有沒(méi)有議案,如果沒(méi)有任何議案Acceptor必須接收
c) 如果Acceptor已經(jīng)有議案,議案編號(hào)大于發(fā)過(guò)來(lái)的議案編號(hào)拒絕發(fā)過(guò)來(lái)的議案編號(hào)。
d) 如果Acceptor已經(jīng)有議案,議案編號(hào)小于新發(fā)過(guò)來(lái)的議案議案編號(hào),Acceptor需要檢查之前是否有批準(zhǔn)的議案,如果沒(méi)有則用接受該議案。如果之前有批準(zhǔn)的議案,則將批準(zhǔn)的議案編號(hào)和議案內(nèi)容回復(fù)給Proposer.
Accept 階段
a) Proposer 收到過(guò)半Acceptor發(fā)過(guò)來(lái)的回復(fù)時(shí)且沒(méi)有附帶任何批準(zhǔn)過(guò)的議案編號(hào)和議案內(nèi)容,那么Proposer繼續(xù)提交批準(zhǔn)(Accept)請(qǐng)求,這時(shí)會(huì)將議案編號(hào)和議案內(nèi)容一起提交。
b)Proposer 收到過(guò)半Acceptor發(fā)過(guò)來(lái)的回復(fù),且有附帶議案編號(hào)和議案內(nèi)容,那么Proposer找到所有回復(fù)中超過(guò)半數(shù)的那個(gè)作為提交配準(zhǔn)請(qǐng)求發(fā)送給Acceptors
c) Proposer 沒(méi)有收到過(guò)半Acceptor發(fā)過(guò)來(lái)的回復(fù),則修改議案編號(hào),并將議案編號(hào)重新發(fā)給Acceptors
d) Acceptor 收到Proposer發(fā)過(guò)來(lái)的提交請(qǐng)求,如果議案編號(hào)小于手里持有的議案編號(hào)直接不回應(yīng)或reject,反之接受新的議案編號(hào)和議案內(nèi)容回復(fù)給Proposer
e)經(jīng)過(guò)一段時(shí)間Proposer對(duì)比接收到的Accept回復(fù),如果超過(guò)半數(shù),則結(jié)束流程(表示議案已經(jīng)被批準(zhǔn)),通知Learner學(xué)習(xí)議案.如果未超過(guò)半數(shù),則修改議案編號(hào),重新接入Prepare階段。