Gossip数据传播协议
Gossip數(shù)據(jù)傳播協(xié)議:
①通過(guò)不斷識(shí)別可用的成員對(duì)等節(jié)點(diǎn),管理節(jié)點(diǎn)發(fā)現(xiàn)和通道成員資格,并最終檢測(cè)出脫機(jī)/離線的對(duì)等節(jié)點(diǎn);
②在通道上跨(所有)節(jié)點(diǎn)分發(fā)賬本數(shù)據(jù)。任何具有與通道其余部分不同步數(shù)據(jù)的對(duì)等節(jié)點(diǎn)都可以識(shí)別缺失的塊,并通過(guò)復(fù)制正確的數(shù)據(jù)來(lái)同步自身;
③通過(guò)使用點(diǎn)對(duì)點(diǎn)狀態(tài)傳輸來(lái)更新賬本數(shù)據(jù),使新連接的節(jié)點(diǎn)加快同步速度。
?
?
基于gossip的廣播由對(duì)等節(jié)點(diǎn)操作——這些對(duì)等點(diǎn)接收來(lái)自通道上其他對(duì)等點(diǎn)的消息,然后將這些消息轉(zhuǎn)發(fā)到通道上隨機(jī)選擇的多個(gè)對(duì)等節(jié)點(diǎn),其中這個(gè)數(shù)字是一個(gè)可配置的常量。對(duì)等節(jié)點(diǎn)還可以使用pull(拉取)機(jī)制,而不是等待消息的傳遞。這種循環(huán)不斷重復(fù),其結(jié)果是通道成員、賬本和狀態(tài)信息不斷保持最新和同步。為了傳播新塊,通道上的leader節(jié)點(diǎn)從排序服務(wù)拉取數(shù)據(jù),并向其組織中的對(duì)等節(jié)點(diǎn)發(fā)起gossip傳播。
* 領(lǐng)導(dǎo)leader選舉:
該機(jī)制用于為每個(gè)組織選舉一個(gè)??對(duì)等節(jié)點(diǎn),該對(duì)等節(jié)點(diǎn)將保持與排序服務(wù)的連接,并在其組織內(nèi)的對(duì)等節(jié)點(diǎn)之間開(kāi)始分發(fā)新到達(dá)的塊。領(lǐng)導(dǎo)選舉為系統(tǒng)提供了有效利用排序服務(wù)帶寬的能力。
領(lǐng)導(dǎo)人選舉有兩種模式:
①靜態(tài):系統(tǒng)管理員手動(dòng)的將一個(gè)節(jié)點(diǎn)配置為一個(gè)組織中的leader;
②動(dòng)態(tài):對(duì)等節(jié)點(diǎn)執(zhí)行leader選舉程序,選擇組織中的一個(gè)對(duì)等節(jié)點(diǎn)成為leader。
?
* 靜態(tài)領(lǐng)導(dǎo)人選舉:靜態(tài)選舉允許手動(dòng)的將組織中的一個(gè)或多個(gè)節(jié)點(diǎn)定義為leader。但是請(qǐng)注意,太多節(jié)點(diǎn)連接到排序服務(wù)的話會(huì)造成低效率地使用帶寬。要啟用靜態(tài)領(lǐng)導(dǎo)選舉模式,請(qǐng)?jiān)赾ore.yaml中配置以下參數(shù):
或者,這些參數(shù)也可以使用環(huán)境變量來(lái)配置和覆蓋:
以下配置將使peer處于待命模式,即peer不會(huì)試圖成為領(lǐng)導(dǎo)者:
將CORE_PEER_GOSSIP_USELEADERELECTION和CORE_PEER_GOSSIP_ORGLEADER設(shè)置為true是不明確的,將導(dǎo)致錯(cuò)誤。在靜態(tài)配置中,組織管理員負(fù)責(zé)在發(fā)生故障或崩潰時(shí)提供leader節(jié)點(diǎn)的高可用性。
?
* 動(dòng)態(tài)領(lǐng)導(dǎo)人選舉:動(dòng)態(tài)領(lǐng)導(dǎo)選舉允許組織中的對(duì)等節(jié)點(diǎn)選擇一個(gè)leader節(jié)點(diǎn),該對(duì)等點(diǎn)將連接到排序服務(wù)并拉取新的區(qū)塊。這個(gè)leader是為一個(gè)組織中的節(jié)點(diǎn)獨(dú)立選出來(lái)的。一個(gè)動(dòng)態(tài)選出的leader會(huì)向其他節(jié)點(diǎn)發(fā)送心跳信息,作為其活躍的證據(jù)。如果一個(gè)或多個(gè)節(jié)點(diǎn)在規(guī)定的時(shí)間內(nèi)沒(méi)有收到心跳的更新,他們將選舉一個(gè)新的leader。在網(wǎng)絡(luò)分區(qū)的最壞情況下,組織將有多個(gè)活躍的leader來(lái)確保彈性和可用性,以允許組織的對(duì)等節(jié)點(diǎn)繼續(xù)取得發(fā)展。網(wǎng)絡(luò)分區(qū)修復(fù)后,其中一個(gè)領(lǐng)導(dǎo)者將放棄其領(lǐng)導(dǎo)地位。在沒(méi)有網(wǎng)絡(luò)分區(qū)的穩(wěn)定狀態(tài)下,將只有一個(gè)活動(dòng)的leader連接到排序服務(wù)。
以下配置控制領(lǐng)導(dǎo)者發(fā)送心跳消息的頻率:
為了啟用動(dòng)態(tài)領(lǐng)導(dǎo)選舉,需要在core.yaml中配置以下參數(shù):
或者,這些參數(shù)可以通過(guò)環(huán)境變量配置和覆蓋:
?
* 錨節(jié)點(diǎn):錨節(jié)點(diǎn)被gossip協(xié)議用來(lái)確保不同組織的節(jié)點(diǎn)能夠感知到彼此。當(dāng)提交了包含對(duì)錨節(jié)點(diǎn)更新的配置區(qū)塊時(shí),對(duì)等節(jié)點(diǎn)將與錨節(jié)點(diǎn)接觸,并向它們學(xué)習(xí)錨節(jié)點(diǎn)所知道的所有對(duì)等節(jié)點(diǎn)。一旦每個(gè)組織中(至少)有一個(gè)對(duì)等節(jié)點(diǎn)與錨節(jié)點(diǎn)聯(lián)系,錨節(jié)點(diǎn)就會(huì)了解通道中的每個(gè)對(duì)等節(jié)點(diǎn)。由于gossip通信是持續(xù)的,而且peers總是要求被告知他們不知道的peer的存在,所以可以為一個(gè)通道建立一個(gè)共同的成員視圖。
例如,假設(shè)通道中有三個(gè)組織—A、B、C—和一個(gè)為組織C定義的錨節(jié)點(diǎn)peer0.orgc。當(dāng)peer1.orgA聯(lián)系peer0.orgC時(shí),peer1.orgA將告訴peer0.orgC關(guān)于peer0.orgA的信息。之后,當(dāng)peer1.orgB聯(lián)系peer0.orgC時(shí),peer0.orgC會(huì)告訴peer1.orgB關(guān)于peer0.orgA的信息。此時(shí)起,A和B組織將開(kāi)始直接交換成員信息,而不再需要peer0.orgC的任何協(xié)助。
由于跨組織通信依賴于gossip才能正常工作,因此必須在通道配置中定義至少一個(gè)錨節(jié)點(diǎn)。為了高可用性和冗余,強(qiáng)烈建議每個(gè)組織提供自己的錨節(jié)點(diǎn)集。(錨節(jié)點(diǎn)不需要與領(lǐng)導(dǎo)節(jié)點(diǎn)相同!)
?
外部和內(nèi)部端點(diǎn):
為了使gossip能夠有效地工作,對(duì)等節(jié)點(diǎn)需要能夠獲得自己組織中的對(duì)等節(jié)點(diǎn)以及其他組織中的對(duì)等節(jié)點(diǎn)的端點(diǎn)信息。當(dāng)一個(gè)節(jié)點(diǎn)被引導(dǎo)/啟動(dòng)?時(shí),它會(huì)使用它的core.yaml中的peer.gossip.bootstrap來(lái)廣播自己,并交換成員信息,在自己的組織中構(gòu)建所有可用對(duì)等節(jié)點(diǎn)的視圖。
節(jié)點(diǎn)core.yaml中的peer.gossip.bootstrap屬性用于引導(dǎo)組織內(nèi)的gossip。如果你正在使用gossip,你通常會(huì)配置組織中的所有對(duì)等節(jié)點(diǎn)來(lái)指向一組初始引導(dǎo)節(jié)點(diǎn)(你可以指定一個(gè)以空格分隔的對(duì)等節(jié)點(diǎn)列表)。內(nèi)部端點(diǎn)通常由對(duì)等節(jié)點(diǎn)本身自動(dòng)計(jì)算,或者直接通過(guò)core.yaml中的core.peer.address顯式傳遞。如果需要覆蓋這個(gè)值,可以將CORE_PEER_GOSSIP_ENDPOINT作為環(huán)境變量導(dǎo)出。
建立跨組織通信同樣需要引導(dǎo)信息。最初的跨組織引導(dǎo)信息是通過(guò)上面描述的“錨節(jié)點(diǎn)”設(shè)置提供的。如果你想讓組織里的其他節(jié)點(diǎn)被其他組織所知,你就得設(shè)置節(jié)點(diǎn)的core.yaml中的peer.gossip.externalendpoint。如果不設(shè)置此值,則不會(huì)將該節(jié)點(diǎn)的端點(diǎn)信息廣播給其他組織中的對(duì)等節(jié)點(diǎn)。要設(shè)置這些屬性,請(qǐng)發(fā)出以下命令:
gossip消息:
在線的對(duì)等節(jié)點(diǎn)通過(guò)不斷廣播“alive/活著”消息來(lái)表明它們的可用性,每個(gè)消息都包含公鑰基礎(chǔ)設(shè)施(PKI) ID和消息發(fā)送方的簽名。對(duì)等節(jié)點(diǎn)通過(guò)收集這些消息來(lái)維持通道成員關(guān)系;如果沒(méi)有節(jié)點(diǎn)接收到來(lái)自某個(gè)特定節(jié)點(diǎn)的活動(dòng)消息,則最終將從通道成員中清除此“死掉的”對(duì)等節(jié)點(diǎn)。由于活動(dòng)消息是經(jīng)過(guò)加密簽名的,惡意節(jié)點(diǎn)永遠(yuǎn)不能模擬其他對(duì)等節(jié)點(diǎn),因?yàn)樗鼈內(nèi)鄙俑C書(shū)頒發(fā)機(jī)構(gòu)(CA)授權(quán)的簽名密鑰。
除了自動(dòng)轉(zhuǎn)發(fā)接收到的消息外,狀態(tài)協(xié)調(diào)過(guò)程還同步每個(gè)通道上對(duì)等節(jié)點(diǎn)的世界狀態(tài)。每個(gè)節(jié)點(diǎn)不斷地從通道上的其他對(duì)等節(jié)點(diǎn)拉取區(qū)塊,以便在發(fā)現(xiàn)差異時(shí)修復(fù)自己的狀態(tài)。由于不需要固定連接來(lái)維護(hù)基于gossip的數(shù)據(jù)分發(fā),因此該過(guò)程可靠地為共享賬本提供了數(shù)據(jù)一致性和完整性,包括對(duì)節(jié)點(diǎn)崩潰的容忍性。
由于通道之間是隔離的,一個(gè)通道上的對(duì)等節(jié)點(diǎn)不能在其他通道上發(fā)送消息或共享信息。盡管對(duì)等節(jié)點(diǎn)都可以屬于多個(gè)通道,但是通過(guò)應(yīng)用基于對(duì)等節(jié)點(diǎn)通道訂閱的消息路由策略,分區(qū)消息傳遞可以防止區(qū)塊傳播到不在通道中的對(duì)等節(jié)點(diǎn)。
?
點(diǎn)對(duì)點(diǎn)消息的安全性由對(duì)等節(jié)點(diǎn)的TLS層處理,不需要簽名。對(duì)等節(jié)點(diǎn)通過(guò)由CA分配的證書(shū)進(jìn)行身份驗(yàn)證。雖然也使用TLS certs,但是在gossip層中身份驗(yàn)證使用的是對(duì)等節(jié)點(diǎn)證書(shū)。賬本區(qū)塊由排序服務(wù)簽名,然后在通道上交付給領(lǐng)導(dǎo)節(jié)點(diǎn)。
身份驗(yàn)證由對(duì)等節(jié)點(diǎn)的成員服務(wù)提供者管理。當(dāng)對(duì)等節(jié)點(diǎn)第一次連接到通道時(shí),TLS會(huì)話與成員身份綁定,這本質(zhì)上是根據(jù)網(wǎng)絡(luò)和通道中的成員身份對(duì)連接的每個(gè)對(duì)等節(jié)點(diǎn)進(jìn)行身份驗(yàn)證。
///縱有疾風(fēng)起,人生不言棄///
https://www.cnblogs.com/skzxc/p/10858692.html
總結(jié)
以上是生活随笔為你收集整理的Gossip数据传播协议的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Fabric核心模块之Peer解析
- 下一篇: Fabric权限管理和策略