1.游戲背景? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?拜占庭帝國(guó)即東羅馬帝國(guó),擁有巨大的財(cái)富藕溅,并對(duì)鄰邦垂誕已久,為此派出了10支軍隊(duì)去包圍這個(gè)敵人。這個(gè)敵人雖不比拜占庭帝國(guó)烦衣,但也足以抵御5支常規(guī)拜占庭軍隊(duì)的同時(shí)襲擊脚仔∏谥冢基于一些原因,這10支軍隊(duì)不能集合在一起單點(diǎn)突破鲤脏,必須在分開的包圍狀態(tài)下同時(shí)攻擊们颜。他們?nèi)我恢к婈?duì)單獨(dú)進(jìn)攻都毫無勝算,除非有至少6支軍隊(duì)同時(shí)襲擊才能攻下敵國(guó)猎醇。他們分散在敵國(guó)的四周窥突,依靠通信兵相互通信來協(xié)商進(jìn)攻意向及進(jìn)攻時(shí)間。困擾這些將軍的問題是硫嘶,他們不確定他們中是否有叛徒阻问,叛徒可能擅自變更進(jìn)攻意向或者進(jìn)攻時(shí)間。在這種狀態(tài)下音半,拜占庭將軍們能否找到一種分布式的協(xié)議來讓他們能夠遠(yuǎn)程協(xié)商则拷,從而贏取戰(zhàn)斗?這就是著名的拜占庭將軍問題【在分布式系統(tǒng)中指的是消息不僅可以被丟失曹鸠、延遲煌茬、重放,還可以被偽造】彻桃。
2.游戲介紹
? ? ? ? PBFT(Practical Byzantine Fault Tolerance)算法由Miguel Castro 和Barbara Liskov在1999年提出來的坛善,解決了原始拜占庭容錯(cuò)算法效率不高的問題,將算法復(fù)雜度由指數(shù)級(jí)降低到多項(xiàng)式級(jí)邻眷,使得拜占庭容錯(cuò)算法在實(shí)際系統(tǒng)應(yīng)用中變得可行眠屎。
? ? ? ? PBFT是一種狀態(tài)機(jī)副本復(fù)制算法,一般包括三種協(xié)議:一致性協(xié)議(agreement)肆饶、檢查點(diǎn)協(xié)議(checkpoint)和視圖更換協(xié)議(view change)改衩。該算法要滿足以下兩個(gè)性質(zhì):? ?
? ? ? ? 安全性(safety):safety means nothing bad happens.? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 活性(liveness):liveness means that something good eventually happens.
? ? ? ? 在一個(gè)拜占庭系統(tǒng)里面,要容忍f個(gè)拜占庭節(jié)點(diǎn)錯(cuò)誤驯镊,則replica數(shù)量至少為3f+1葫督,這是滿足安全性的前提。因?yàn)榫W(wǎng)絡(luò)延遲或宕機(jī)板惑,系統(tǒng)存在f個(gè)節(jié)點(diǎn)不回復(fù)響應(yīng)(f個(gè)節(jié)點(diǎn)包括拜占庭節(jié)點(diǎn)和非拜占庭節(jié)點(diǎn)橄镜,最壞情況f個(gè)節(jié)點(diǎn)全是非拜占庭節(jié)點(diǎn)),剩下2f+1個(gè)響應(yīng)中可能有f個(gè)拜占庭節(jié)點(diǎn)冯乘,從而得到n-2f>f洽胶,即響應(yīng)中非拜占庭節(jié)點(diǎn)數(shù)目大于拜占庭節(jié)點(diǎn)數(shù)目(f+1>f)。
? ? ? ? 算法不依賴同步提供安全性裆馒,則必須依賴同步提供活性姊氓,否則違背FLP定理(在異步通信場(chǎng)景丐怯,即使只有一個(gè)進(jìn)程失敗了,沒有任何算法能保證非失敗進(jìn)程能夠達(dá)到一致性)他膳。在拜占庭節(jié)點(diǎn)不超過f响逢,并且delay(t)有界的情況下就能保證系統(tǒng)活性,delay(t)表示從消息發(fā)送到接受的時(shí)間間隔棕孙。
3.游戲規(guī)則
? ? ? ? 在一個(gè)view里面舔亭,會(huì)從replicas中選擇一個(gè)primary,其余的replicas則叫backups蟀俊。如果主節(jié)點(diǎn)行為發(fā)生異常钦铺,則進(jìn)行view change換主。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ?游戲從client向primary發(fā)送請(qǐng)求開始肢预。
狀態(tài)機(jī)操作矛洞,
時(shí)戳。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?游戲從client至少收到f+1個(gè)replicas的響應(yīng)
結(jié)束烫映。
視圖編號(hào)沼本,
時(shí)戳,
客戶端身份锭沟,
replica編號(hào)抽兆,
請(qǐng)求結(jié)果∽寤矗【why f+1辫红?因?yàn)樵?f+1個(gè)committed中有f個(gè)拜占庭節(jié)點(diǎn)表面上同意請(qǐng)求,實(shí)際上根本不會(huì)回復(fù)請(qǐng)求】
3.1 重彩大戲------三階段協(xié)議
Pre-prepare:
? ? ? ? Primary為客戶端請(qǐng)求分配一個(gè)序列號(hào)n祝辣,向所有backups發(fā)現(xiàn)預(yù)準(zhǔn)備消息贴妻。
視圖編號(hào),
消息
的摘要蝙斜。
Prepare:
? ? ? ? 若滿足以下條件名惩,backups接受預(yù)準(zhǔn)備消息:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1.客戶端請(qǐng)求和預(yù)準(zhǔn)備消息具有正確簽名。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.當(dāng)前視圖編號(hào)是v孕荠。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.backups從未在當(dāng)前視圖v接收過序列號(hào)為n但摘要不同的預(yù)準(zhǔn)備請(qǐng)求绢片。? ? ? ? ? ? ? ? ? ? ? ? ? 4.h<n<H〉呵恚【防止一個(gè)拜占庭節(jié)點(diǎn)選擇一個(gè)大的序號(hào)來消耗序號(hào)空間】
? ? ? ? 如果上述條件滿足,backups接收預(yù)準(zhǔn)備消息巢株,進(jìn)入prepare階段槐瑞,向其他節(jié)點(diǎn)廣播準(zhǔn)備消息,并將預(yù)準(zhǔn)備和準(zhǔn)備消息寫入日志阁苞。
commit:
? ? ? ?如果backups收到2f【包括自己】個(gè)與預(yù)準(zhǔn)備消息一致的準(zhǔn)備消息困檩,請(qǐng)求消息和預(yù)準(zhǔn)備消息具有相同的視圖v和序列號(hào)n祠挫,并且已將相關(guān)消息寫入日志,則進(jìn)入commit階段悼沿,向其他節(jié)點(diǎn)廣播一條確認(rèn)消息等舔。如果各節(jié)點(diǎn)收到2f+1條相同的commits消息,則向客戶端發(fā)送一條reply消息糟趾。
3.2 垃圾回收
? ? ? PBFT是一種狀態(tài)機(jī)副本復(fù)制算法慌植,replicas會(huì)將執(zhí)行過消息記錄在本地日志中,為了節(jié)省內(nèi)存义郑,需要一種機(jī)制來清理日志蝶柿。何時(shí)來清理?在每次操作完后執(zhí)行是不明智的非驮,因?yàn)楸容^耗資源交汤。可以定期清理劫笙,比如每100次清理一次芙扎。我們將請(qǐng)求后執(zhí)行的狀態(tài)稱為檢查點(diǎn)checkpoint;帶證明的檢查點(diǎn)稱為stable certificate填大,當(dāng)節(jié)點(diǎn)收到2f+1個(gè)checkpoint消息時(shí)戒洼,可證明穩(wěn)定檢查點(diǎn)是正確的。穩(wěn)定檢查點(diǎn)之前的日志消息均可刪除栋盹。? ? ? ? ? ? ? ? ? ? ? ?
? ? ? 當(dāng)清理檢查點(diǎn)時(shí)replica i向其他replicas廣播一條檢查點(diǎn)協(xié)議施逾,
是最近一次正確執(zhí)行請(qǐng)求序號(hào),
是其當(dāng)前狀態(tài)摘要例获。如果每一個(gè)replica收到2f+1個(gè)具有相同序號(hào)
和摘要
的檢查點(diǎn)消息汉额,這時(shí)每一個(gè)replica可以清理序列號(hào)
小于等于n的日志信息。
? ? ? ?檢查點(diǎn)協(xié)議也用來更新水平線榨汤。低水平線等于最近穩(wěn)定檢查點(diǎn)的序號(hào)蠕搜,高水平線
,
為日志大小收壕。
3.3 視圖更改
? ? ? ? 當(dāng)主節(jié)點(diǎn)掛掉妓灌,或者在commit階段有些節(jié)點(diǎn)收到2f+1個(gè)commit,有些沒有收到2f+1個(gè)commit蜜宪,導(dǎo)致狀態(tài)不一致虫埂,這些狀況都需要更改視圖來提供系統(tǒng)活性和安全性。
? ? ? ? 當(dāng)請(qǐng)求超時(shí)圃验,備份節(jié)點(diǎn)進(jìn)入視圖v+1掉伏,廣播視圖更改消息。
穩(wěn)定檢查點(diǎn)序列號(hào),
是穩(wěn)定檢查點(diǎn)證明斧散,
是一個(gè)集合供常,包含對(duì)請(qǐng)求
(請(qǐng)求的序列號(hào)大于
)相關(guān)消息集合
。
包含2f+1個(gè)相同的準(zhǔn)備消息鸡捐。
? ? ? ? ?當(dāng)視圖v+1的主節(jié)點(diǎn)收到2f個(gè)相同個(gè)視圖更改消息栈暇,向其他副本廣播新視圖消息,
是2f+1個(gè)視圖更改消息箍镜,
的計(jì)算規(guī)則如下:? ? ? ? 1.確定序列號(hào)
和
源祈。其中
等于
中穩(wěn)定檢查點(diǎn)序列號(hào),
等于
中最大prepare消息序列號(hào)。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.主節(jié)點(diǎn)為
和
之間的每一個(gè)序列號(hào)n分配pre-prepare消息鹿寨。如果
中包含n對(duì)應(yīng)的
組合新博,則對(duì)應(yīng)的預(yù)準(zhǔn)備消息為
(也就是說序列號(hào)n對(duì)應(yīng)的請(qǐng)求有2f+1個(gè)prepare消息,在新視圖中依然提交這個(gè)請(qǐng)求)脚草。如果
中不包含n對(duì)應(yīng)的
組合赫悄,則提交null消息為
,即不做任何處理馏慨。
? ? ? ? 副本收到新視圖消息后埂淮,廣播一次prepare消息,進(jìn)入v+1写隶,視圖更換完成倔撞。