cryptofoundry

cryptofoundry へのお問い合わせ

構築または自動化したい内容をお聞かせください。

ADM Nodes, Delegates & Pools

ネットワーク障害後のADAMANTノードのピア回復:シード、ディスカバリー、および同期選択

ADAMANTノードは、ネットワーク障害後にコンソールログを読む際に混同しやすい3つの独立した仕組みを通じてピア接続を維持しています。このノートでは、それらがどのように相互作用するか、シードピアへの接続が継続している場合でも同期が停止する可能性がある理由、および運用者が回復中に期待すべきことについて説明します。

背景

ノードは、peers.list 設定にリストされたシードピア、起動時にデータベースから読み込まれる永続化されたピア、および他のノードからの GET /peer/list によって返される発見されたピアの3つのソースから構成されるメモリ内のピアテーブルを保持しています。シードピアは固定されており、要求が失敗してもピアテーブルから削除されることはありません。

各ピアは状態を持ちます:BANNED(0、通常の使用から除外)、DISCONNECTED(1、認識されているが現在同期やブロードキャストに使用できない)、CONNECTED(2、最近正常に応答し、同期が可能)。要求が失敗すると、ピアの成功確率が低下します。以前にCONNECTEDだったピアが成功確率80%を下回ると、その状態はDISCONNECTEDに低下します。ネットワークトイムアウト(ECONNABORTED)はピアを削除せず、成功確率を低下させるだけです。

3つの並列メカニズム

シードピング(静か)。起動時および約5秒ごとに、ノードは設定からすべてのシードピアに対して GET /peer/height 経由でピングを送信します。失敗はトレースレベルでログに記録され、通常はデフォルトのコンソール出力では見えません。ピングが成功すると、ピアは再びCONNECTEDに昇格します。

ピアディスカバリー(目立つ)。約5秒ごとに、ノードはメモリ内のピア(状態はDISCONNECTEDまたはCONNECTED)からランダムに1つ選択し、GET /peer/list を要求して新しいアドレスを取得します。このランダム選択のピアがタイムアウトすると、コンソールには以下のように表示されます:

Discovering new peers failed. ECONNABORTED Request failed GET http://<peer>/peer/list

このエラーは、ランダムに選択された1つのピアのみを示しており、ピアテーブル全体を指しているわけではありません。回復中は、以前に発見されデータベースに保存されたあまり知られていないクラウドホスト型ノードが表示されることがよくあります。これはノードがシードピアを無視していることを意味するものではありません。

ブロックチェーン同期(厳格)。ローダーの同期処理は、デフォルトフィルター(CONNECTEDピアのみ)を使用して peers.list() を呼び出します。使用可能な高さを持つCONNECTEDピアが存在しない場合、同期は以下で終了します:

Failed to find enough good peers

この状況では、ノードがピアレコードを持たないという意味でのネットワーク切断ではありません。単にブロックダウンロードに適したアクティブなピアがゼロであるということです。

一般的な障害のタイムライン

ネットワーク接続が失われると、すべてのピアへのHTTP要求が失敗し始めます。以前CONNECTEDだったピアはDISCONNECTEDになり、ローダーは適切なピアを選択できなくなるため、高さの更新が停止します。ディスカバリーのエラーは、メモリ内の古くなったエントリに対して引き続き発生しますが、シードピングはバックグラウンドで静かに継続されます。少なくとも1つのシードまたは他の既知のピアが再びピングに応答すると、そのピアはCONNECTEDに戻り、同期が再開します。

「インターネットが復旧」してから「ノードが再同期を開始」するまでの間は数分かかることがあり、リモートピアへの到達がまだできない場合はさらに長くなる可能性があります。回復は、単にローカル接続が復活するのではなく、CONNECTED状態になるピアとの成功した往復通信に依存しているためです。

運用者の期待

障害後に見慣れないアドレスに対してディスカバリーのエラーが表示されることは正常であり、それ自体は設定ミスを意味しません。設定からのシードピアは引き続きピングされていますが、その失敗はデフォルトのログでは目立たないだけです。Failed to find enough good peersというメッセージは、ピアテーブルが消去されたことを意味するのではなく、現在アクティブなピアが存在しないことを意味しています。ノードを再起動するとシードおよびデータベースのピアが再読み込みされますが、回復には依然として少なくとも1つのリモートピアからの応答が必要です。

考えられる改善点

運用者の体験を改善できるいくつかの変更があります:CONNECTEDピアが一定期間以上存在しない場合にシードピングの失敗をwarnレベルでログ出力する、getFromRandomPeerで均一なランダム選択ではなくシードピアまたは最近動作していたピアを優先する、同期がFailed to find enough good peersを報告したときにすべてのシードピアを並列で再試行する、async.retryがすべての同期試行を尽くしたときに重複するwarnログを減らすなどです。