Fabric網路組織與主節點選舉
一、Fabric網路組織
Fabric網路組織按如下結構組成:Fabric網路–>Channel通道–>組織(成員)–>節點。即整個網路由數個通道組成,每個通道都由多個組織構成,而每個組織內部由數個節點組成(可能由功能或其他劃分方式分為多個節點)。如下圖所示:
二、主節點(leader peer)選舉
一個組織(其實是成員)在一個通道上可以有多個Peer節點,這時候為了提高通訊效率,需要選舉出來一個主節點(leader)作為代表和排序服務節點通訊,負責從排序服務節點處獲取最新的區塊並在組織內部同步。有如下兩種方式:
1. 靜態指定
配置文件中配置
# Gossip related configuration
gossip:
# Defines whenever peer will initialize dynamic algorithm for
# "leader" selection, where leader is the peer to establish
# connection with ordering service and use delivery protocol
# to pull ledger blocks from ordering service
useLeaderElection: false
# Statically defines peer to be an organization "leader",
# where this means that current peer will maintain connection
# with ordering service and disseminate block across peers in
# its own organization
orgLeader: true
2. 動態選舉
相關配置:
# Gossip related configuration
gossip:
# Leader election service configuration
election:
# Longest time peer wait for stable membership during leader election startup (unit: second)
startupGracePeriod: 15s
# Interval gossip membership sampled to check its stability (unit: second)
membershipSampleInterval: 1s
# Time pass since last declaration message before peer decide to go to election (unit: second)
leaderAliveThreshold: 10s
# Time between peer sends propose message and declare itself as a leader (sends declaration message) (unit: second)
leaderElectionDuration: 5s
3. leader節點選舉流程
選舉流程(簡要):
如果當前沒有leader,進入選舉演算法
如果當前是leader:廣播leadership declearation,如果收到比自己小的leadership declearation,自己變為follower;
如果當前是follower:指定時間內沒有收到leadership declearation,則認為leader離線了,進入選舉流程
選舉演算法(簡要):
廣播提議自己為leader消息
各個節點收集選舉消息
比對ID,如果自己ID最小,則自己為leader
詳細過程如下圖所示:
偽程式碼實現:
// Gossip leader election module
// Algorithm properties:
// - Peers break symmetry by comparing IDs
// - Each peer is either a leader or a follower,
// and the aim is to have exactly 1 leader if the membership view
// is the same for all peers
// - If the network is partitioned into 2 or more sets, the number of leaders
// is the number of network partitions, but when the partition heals,
// only 1 leader should be left eventually
// - Peers communicate by gossiping leadership proposal or declaration messages
// The Algorithm, in pseudo code:
//
//
// variables:
// leaderKnown = false
//
// Invariant:
// Peer listens for messages from remote peers
// and whenever it receives a leadership declaration,
// leaderKnown is set to true
//
// Startup():
// wait for membership view to stabilize, or for a leadership declaration is received
// or the startup timeout expires.
// goto SteadyState()
//
// SteadyState():
// while true:
// If leaderKnown is false:
// LeaderElection()
// If you are the leader:
// Broadcast leadership declaration
// If a leadership declaration was received from
// a peer with a lower ID,
// become a follower
// Else, you're a follower:
// If haven't received a leadership declaration within
// a time threshold:
// set leaderKnown to false
//
// LeaderElection():
// Gossip leadership proposal message
// Collect messages from other peers sent within a time period
// If received a leadership declaration:
// return
// Iterate over all proposal messages collected.
// If a proposal message from a peer with an ID lower
// than yourself was received, return.
// Else, declare yourself a leader
4. 消息定義
// Leadership Message is sent during leader election to inform
// remote peers about intent of peer to proclaim itself as leader
message LeadershipMessage {
bytes pki_id = 1;
PeerTime timestamp = 2;
bool is_declaration = 3;
}