Hyperledger FabricのGossip関連の基本的な情報のまとめ
Hyperledger Fabric(HLF)のGossipプロトコルに関するLeader、Anchorってなんだっけってのいつも忘れるのでまとめておきます。
Hyperledger FabricでのGossipあれこれ
以下に基本的な情報をまとめていきます。ここには載せてない細かい設定項目がたくさんあるんですが、シビアなチューニングをしない限りはサンプル値やデフォルト値のままにしといて特に問題ないと思います。
Gossipの用途
HLFではGossipプロトコルによるメッセージングを以下4つの用途で使用しています。
Peerの所在およびアイデンティティ情報、また、Channelの所属情報の拡散
Channel内でのPeer間でのブロックの同期
新規に追加されたPeerへのPeer-to-Peerでの台帳データの伝播によるキャッチアップ
Private Dataの伝播
Leader Peer
上述のうち「2. Channel内でのPeer間でのブロックの同期」に関わる要素です。
Ordering ServiceからあるChannelのブロックを各Peerへ配布する際、Ordering ServiceからすべてのPeerにブロック(を含むメッセージ)が必ずしも直接届けられるわけではありません。各Organizationの配下でそのChannelに所属しているPeerのうち、ひとつ~複数のPeerが代表してOrdering Serviceから直接ブロックをPullして受け取ります。この代表PeerをLeader Peerと呼びます。
そのOrganization内でLeader Peer以外にそのChannelに所属しているPeerが他にあれば、Leader PeerからGossipによってブロックが配布されます。
Leader Peerの選定方式
あるPeerが常にLeader Peerであると静的に選定しておくStatic方式と、ある種の選挙方式により動的にLeader Peerが(通常は)Organization内&Channel内の組み合わせにつきひとつ選定されるDynamic方式があります。これらに関する設定は以下いずれかの方法でPeerごとに指定されます。
core.yaml
ファイルで設定
peer: # Gossip related configuration gossip: useLeaderElection: true orgLeader: false
export CORE_PEER_GOSSIP_USELEADERELECTION=true export CORE_PEER_GOSSIP_ORGLEADER=false
useLeaderElectionをtrueにしておくとDynamic方式でのLeader候補として設定されます。orgLeaderをtrueにすると、そのPeerがStaticなLeaderとして設定されます。両方falseにしておくとそのPeerはLeaderになろうと=Ordering Serviceからブロックを受け取ろうとしません(stand-byモード)。なお両方trueにした場合にどうなるかはドキュメントに書いておらずソースコード読まないとならないんで調べていません。
複数PeerをStatic Leaderにしておくこともできますし、なんならすべてのPeerをStatic Leaderにしておくこともできるんですが、そうするとOrdering Serviceとの通信が増えてしまって帯域を無駄に使うことになるのであんまり良いやり方ではないようです。というかよほどシビアなパフォーマンスチューニングをしているなどの事情がなければ、耐障害性や設定のシンプルさの面ですべてのPeerをDynamic方式を使用するよう設定しておいたほうがよいと思われます。
Anchor Peer
他のOrganization配下のPeerについて、Peerの所在およびアイデンティティ情報、また、所属するChannelの情報をやり取りするために使われるのがAnchor Peerです。各Organizationが、Channelごとに配下のそのChannelに参加するPeerのうちゼロ~複数をAnchor Peerに設定します。Anchor Peerには自身のOrganizationおよび他のOrganizationのPeerの最新の情報が保持され、他の(OrganizationのPeerを含め)他Peerにその情報を提供します。
少なくともChannel内のいずれかのOrganization配下のPeerひとつがAnchorに設定されていないと正しくChannel内のPeerの情報が共有されません。この場合Private Dataが機能しなくなるなどの害が生じるため、確実にChannelごとにひとつ以上のAnchorが設定されているようにしましょう。耐障害性などを考えると、基本的にはOrganizationごと×Channelごとの組み合わせでひとつのAnchorを設定しておくのがよいでしょう。
Anchor PeerはChannelに関する各Organizationごとの設定なのでconfig.jsonに書くことになります。以下のようなかたちで記述します。
"AnchorPeers": { "mod_policy": "Admins", "value": { "anchor_peers": [ { "host": "peer0.org1.example.com", "port": 7051 } ] }