Node restart and down node recovery#
PGDは、ノードの再起動またはノードの切断から復旧するように設計されています。切断されたノードは、各ピアノードに再接続し、そのノードから欠落しているデータを複製することにより、グループに再参加します。
ノードが起動すると、各接続はbdr.node_slots.state = catchup
を使用して bdr.node_slots に表示され始め、欠落データの複製を開始します。キャッチアップは、各ピアノードからの欠落データの量に応じて継続され、サーバーのワークロードに応じて、時間の経過とともに増加する可能性があります。
各ノードの書き込みアクティビティの量が均一でない場合、より多くのデータを持つノードからのキャッチアップ期間は他のノードよりも大幅に長くかかる場合があります。最終的に、スロットの状態はbdr.node_slots.state = streaming
に変更されます。
時間や日などの長期間オフラインになっているノードは、さまざまな理由でリソースの問題を発生させる可能性があります。次の問題を理解することなく、長期の停止を計画しないでください。
各ノードは変更情報を保持します1つの replication slot を使用
ピアノードごとに)したがって、後で一時的に到達不能なノードへの変更を再生できます。ピアノードが無期限にオフラインになったままである場合、この蓄積された変更情報により、最終的にノードはPostgreSQLトランザクションログpg_wal
の WAL
用の記憶領域が不足し、これに似たエラーでデータベースサーバーがシャットダウンする可能性があります。
PANIC: could not write to file "pg_wal/xlogtemp.559": No space left on device
または、他のディスク不足関連の症状を報告する場合があります。
さらに、オフラインノードのスロットもカタログxminを抑制し、カタログテーブルのバキュームを防止します。
EDB Postgres Extended ServerおよびEDB Postgres Advanced Serverでは、オフラインノードもデータのフリーズを抑制して、競合解決データの損失を防ぎます bdr_read_all_conflicts を参照してください。
管理者は、ノードの停止を監視し Monitoring the Connection Manager を参照して、ノードに十分な空きディスク領域があることを確認する必要があります。ワークロードが予測可能な場合は、時間の経過とともに使用される領域の量を計算できるため、重要な問題が発生する前にノードがダウンできる最大時間を予測できます。
PGDによって作成されたレプリケーションスロットを手動で削除しないでください。そうした場合、クラスターは損傷し、 Replication slots created by PGD で説明しているように、スロットを使用していたノードをクラスターから分離する必要があります。
ノードがオフラインである間、他のノードはオフラインノードから同じデータのセットをまだ受け取っていない可能性があるため、これはノード全体でのわずかな相違として現れる場合があります。分離プロセスは、ノード間のこの不均衡を修正します。
パートキャッチアップと呼ばれる分離のフェーズ中に、オフラインノードに関して他のすべてのノードから最も遠いノードが選択されます。他のノードがこの最も遠いノードに関して等しく追いついていない場合、最も先のノードをソースとして、オフラインノードをオリジンとして、等しく追いついていない各ノードをターゲットとして同期が開始されます。同期は、基本的にターゲットノードからソースノードの最前方ノードへのサブスクリプションであり、オフラインノードオリジンからターゲットノードに変更を転送します。
他のノードがどれだけ遅れているかによっては、この同期は別れるときに時間がかかる場合があります。同期が完了し、すべてのノードが等しく追いつくと、分割はノードの分割に進みます。この同期がなければ、強制的な部分が実行されると、クラスターの状態は一貫していない場合があります。これは、データが分岐する可能性があることを意味します。自動同期機能により、ノードがオフラインになると、これが検出され、すべてのノードが同期プロセスによってこのオフラインノードに関して等しくキャッチアップされます。これにより、ノードが分離するまで待機してデータの一貫性を保証する必要がありません。
ノードが長期間ダウンしているか、永久に失われている場合、推奨される戦略は、障害が発生したノードを分離し、その場所に新しいノードに再参加することです。新しいノードは、元のノードと同じ名前を使用できます。