1. RAFT排序服務(wù)介紹
在fabric1.4.1的版本中,提供了基于raft共識(shí)的raft排序服務(wù)伴网。raft的模型可以容忍奔潰逃沿,如果有節(jié)點(diǎn)故障掉線可以正常運(yùn)行。前提是要有大多數(shù)存活济炎,也就是要保證1/2以上的節(jié)點(diǎn)個(gè)數(shù)正常運(yùn)行川抡。raft共識(shí)是“主從模型”,主節(jié)點(diǎn)通過(guò)動(dòng)態(tài)選舉決定须尚,從節(jié)點(diǎn)是主節(jié)點(diǎn)的復(fù)制崖堤。raft排序服務(wù)比kafka排序服務(wù)易于設(shè)置和管理。并且raft的設(shè)計(jì)允許不同的組織貢獻(xiàn)節(jié)點(diǎn)來(lái)共同組成排序服務(wù)耐床。
2. RAFT排序和kafka排序的對(duì)比
從提供服務(wù)的視角來(lái)看密幔,基于raft和kafka的排序服務(wù)是類似的,他們都是基于CFT(crash fault tolerant)模型的排序服務(wù)撩轰,并且都使用了主從節(jié)點(diǎn)的設(shè)置胯甩。如果你是應(yīng)用開發(fā)者或者智能合約開發(fā)者,你不會(huì)注意到他們之間的卻別堪嫂。但是偎箫,有一些主要的區(qū)別值得探討,尤其是你需要管理排序服務(wù)皆串。
- kafka和zookeeper的設(shè)計(jì)不適用于大型網(wǎng)絡(luò)淹办。它們的設(shè)計(jì)是CFT模型,但局限于運(yùn)行的比較緊密的主機(jī)上恶复。也就是說(shuō)怜森,需要有一個(gè)組織專門運(yùn)行kafka集群速挑。鑒于此,當(dāng)有多個(gè)組織使用基于kafka排序服務(wù)的時(shí)候塔插,其實(shí)沒(méi)有實(shí)現(xiàn)區(qū)中心化梗摇,因?yàn)樗械墓?jié)點(diǎn)連接的都是由一個(gè)組織單獨(dú)控制的kafka集群。如果使用raft想许,每個(gè)組織可以貢獻(xiàn)排序節(jié)點(diǎn)伶授,共同組成排序服務(wù),可以更好的區(qū)中心化流纹。
- raft是原生支持的糜烹,而kafka需要經(jīng)過(guò)復(fù)雜的步驟部署,并且需要單獨(dú)學(xué)習(xí)成本漱凝。而且kafka和zookeeper的支持相關(guān)的issue要通過(guò)apache來(lái)處理疮蹦,而不是hyperledger fabric。raft的實(shí)現(xiàn)是包含在fabric社區(qū)的茸炒,開發(fā)支持更加便利愕乎。
-
系統(tǒng)架構(gòu)不同
3.1 kafka共識(shí)
在kafka共識(shí)模式中,orderer與orderer之間不會(huì)互相直接建立連接壁公,而是與kafka連接感论。這種共識(shí)模式中,依賴于外部的kafka集群系統(tǒng)和zookeeper集群系統(tǒng)紊册。每個(gè)orderer會(huì)把自己的交易發(fā)送給kafka集群比肄,交易在kafka對(duì)應(yīng)的topic中排序后,kafka把排序后的交易推送給orderer節(jié)點(diǎn)囊陡。Orderer節(jié)點(diǎn)收到交易后對(duì)交易打包芳绩,然后發(fā)給peer。
kafka.jpg
3.2 etcdraft共識(shí)
在etcdraft共識(shí)模式中撞反,orderer與orderer之間直接建立連接妥色,不依賴外部系統(tǒng)。在orderer節(jié)點(diǎn)中痢畜,會(huì)創(chuàng)建raft的協(xié)程來(lái)處理與其他orderer的通信垛膝。
etcd.jpg
3. RAFT排序服務(wù)的目的
raft排序是fabric實(shí)現(xiàn)拜占庭容錯(cuò)排序服務(wù)的第一步,如我們所見丁稀,開發(fā)raft排序服務(wù)的決定也是基于此的吼拥。
4. 配置RAFT共識(shí)
raft節(jié)點(diǎn)之間通過(guò)使用TLS認(rèn)證身份,如果一個(gè)攻擊者想要偽造raft節(jié)點(diǎn)线衫,就必須要獲得一個(gè)有效的證書和對(duì)應(yīng)的私鑰凿可。所以,沒(méi)有一個(gè)有效的TLS證書,是不可能運(yùn)行raft節(jié)點(diǎn)的枯跑。
要使用raft共識(shí)惨驶,需要修改兩個(gè)地方
- 本地配置:用來(lái)控制節(jié)點(diǎn)的特性,例如TLS配置敛助,備份個(gè)數(shù)和文件存儲(chǔ)粗卜。
- 通道配置:用來(lái)定義raft集群的成員關(guān)系,以及raft協(xié)議相關(guān)的參數(shù)纳击,例如心跳間隔续扔、leader節(jié)點(diǎn)超時(shí)時(shí)間等。
需要注意的是焕数,每個(gè)channel有屬于它自己的raft集群纱昧。因此,在chennel中要指定raft節(jié)點(diǎn)堡赔,指定的方式是把raft節(jié)點(diǎn)的tls證書配置到channel的配置文件中识脆。在系統(tǒng)通道和應(yīng)用通道中的配置中,每個(gè)排序以consenter的形式列出來(lái)善已。下面是configtx.yaml中關(guān)于raft節(jié)點(diǎn)配置的章節(jié)灼捂。
Consenters:
- Host: raft0.example.com
Port: 7050
ClientTLSCert: path/to/ClientTLSCert0
ServerTLSCert: path/to/ServerTLSCert0
- Host: raft1.example.com
Port: 7050
ClientTLSCert: path/to/ClientTLSCert1
ServerTLSCert: path/to/ServerTLSCert1
- Host: raft2.example.com
Port: 7050
ClientTLSCert: path/to/ClientTLSCert2
ServerTLSCert: path/to/ServerTLSCert2
本地配置
orderer.yaml配置文件中有兩個(gè)關(guān)于raft排序配置的章節(jié),分別問(wèn)cluster和Consensus
- cluster换团,主要用來(lái)決定tls通信配置
- ClientCertificate, ClientPrivateKey : 客戶端證書和私鑰(general.tls.{privateKey, certificate})纵东。
- ListenPort:對(duì)外提供服務(wù)的端口 (general.listenPort)。
- ListenAddress : 本地監(jiān)聽的地址啥寇。
- ServerCertificate, ServerPrivateKey : 服務(wù)端的證書和私鑰。
- SendBufferSize : 發(fā)送區(qū)緩存大小洒扎。
注意:ListenPort, ListenAddress, ServerCertificate, ServerPrivateKey這幾個(gè)配置項(xiàng)辑甜,只能同時(shí)設(shè)置或者同時(shí)不設(shè)置。
- cluster
- WALDir : raft的WAL(Write Ahead Logs)存放位置袍冷,每個(gè)通道需要有以它自己的channel ID為前綴命名的子目錄磷醋。
- SnapDir : raft的快照存放位置,每個(gè)通道需要有以它自己的channel ID為前綴命名的子目錄胡诗。
通道配置
當(dāng)節(jié)點(diǎn)啟動(dòng)后邓线,如果想要更改配通道置并且使配置生效,只有重啟節(jié)點(diǎn)服務(wù)煌恢。有一個(gè)例外是SnapshotIntervalSize配置項(xiàng)骇陈,它可以在運(yùn)行時(shí)動(dòng)態(tài)調(diào)整。
- TickInterval : 兩次Node.Tick調(diào)用的時(shí)間間隔瑰抵。
- ElectionTick : 如果follower在當(dāng)前階段你雌,經(jīng)過(guò)ElectionTick次的時(shí)間后,沒(méi)有從主節(jié)點(diǎn)收到任何消息二汛,follower將會(huì)成為候選節(jié)點(diǎn)并發(fā)起選舉婿崭。
- HeartbeatTick : 主節(jié)點(diǎn)在HeartbeatTick間隔內(nèi)回發(fā)送心跳信息給從節(jié)點(diǎn)拨拓,來(lái)保持它主節(jié)點(diǎn)的身份。
- ElectionTick必須大于HeartbeatTick
- MaxInflightBlocks : 在樂(lè)觀復(fù)制階段限制正在進(jìn)行的附加塊的最大數(shù)量氓栈。
- SnapshotIntervalSize:每個(gè)快照的大小渣磷。
(后續(xù)實(shí)踐后,見更新具體使用步驟授瘦,敬請(qǐng)關(guān)注)