PolarDB for PostgreSQL のオンラインプロモート機能は、読み取り専用ノードをプライマリノードにプロモートするために使用されます。
前提条件
pg_repack拡張機能は、次のいずれかのバージョンを実行するPolarDB for PostgreSQLクラスターでサポートされています。
PostgreSQL 14 (バージョン14.5.1.0以降)
PostgreSQL 11 (バージョン1.1.1以降)
次のステートメントを実行して、PolarDB for PostgreSQLクラスターのリビジョンバージョンを表示できます。
PostgreSQL 14
select version();
PostgreSQL 11
show polar_version;
背景情報
PolarDB for PostgreSQL は、共有ストレージに基づく1つのプライマリノードと複数の読み取り専用ノードで構成されるアーキテクチャを採用しています。 従来のデータベースのプライマリ /セカンダリアーキテクチャとは、次の点で異なります。
セカンダリノード: 従来のデータベースで使用されます。 独立したストレージがあり、完全なWALログを使用してプライマリノードとデータを同期します。
読み取り専用ノード: PolarDB for PostgreSQL で使用されるレプリカノードです。 プライマリノードとストレージを共有し、WALメタログを使用してプライマリノードとデータを同期します。
従来のデータベースでは、プロモート操作により、データベースの再起動またはデータの読み取りおよび書き込みの中断なしに、セカンダリノードをプライマリノードに昇格させることができます。 これにより、データベースの高可用性が保証され、復旧時間目標 (RTO) が削減されます。
PolarDB for PostgreSQL には、読み取り専用ノードをプライマリノードに昇格させる機能も必要です。 読み取り専用ノードは従来のデータベースのセカンダリノードとは異なるため、PolarDB for PostgreSQL には、読み取り専用ノードをプライマリノードに昇格させるオンラインプロモート機能があります。
Usage
pg_ctlユーティリティを使用して、読み取り専用ノードを昇格させることができます。
pg_ctl promote -D [datadir]
制御ポリシー機能の動作
次のセクションでは、オンラインプロモート機能の仕組みについて説明します。
トリガーメカニズム
PolarDB for PostgreSQL は、従来のデータベースで使用されているのと同じ方法を使用して、セカンダリノードを昇格させます。 トリガープロセスでは、次の操作が実行されます。
pg_ctlユーティリティでpromoteコマンドを呼び出して、postmasterプロセスに信号を送ります。postmasterプロセスは、他のプロセスと連携して、プロモート操作をシームレスに実行します。
recovery.confファイルにトリガーファイルのパスを定義します。 他のコンポーネントは、トリガーファイルを生成することによってトリガーされます。
説明PolarDB for PostgreSQL で読み取り専用ノードをプロモートするプロセスは、次の点で従来のデータベースでセカンダリノードをプロモートするプロセスとは異なります。
読み取り専用ノードがプライマリノードに昇格した後、共有ストレージを読み取り /書き込みモードで再マウントする必要があります。
読み出し専用ノードは、メモリ内にいくつかの重要な制御情報を維持する。 このようなプライマリノードの制御情報は、共有ストレージに保持される。 オンラインプロモートプロセスの間、そのような制御情報も共有ストレージ上に保持される。
読み取り専用ノードは、ログを再生することにより、そのメモリにデータを取得できます。 オンラインプロモートプロセスでは、共有ストレージに書き込むことができるデータを決定することが不可欠です。
読み取り専用ノードがメモリ内のWALログを再生するとき、プライマリノードのものとは異なるバッファ削除方法とフラッシュ制御ルールを使用します。
読み取り専用ノード上のサブプロセスは、オンラインプロモートプロセスに対して異なるように実装される。
Postmasterプロセス
ポストマスタープロセスは、トリガーファイルを検出するか、プロモートコマンドを受信すると、オンラインプロモートプロセスを開始します。
現在のすべてのバックエンドプロセスにSIGTERM信号を送信します。
説明読み取り専用ノードは、オンラインプロモートプロセスの開始後もデータ読み取りを提供できます。 ただし、データは最新ではない場合があります。 切り替え中に古いデータが新しいプライマリノードから読み取られないようにするには、すべてのバックエンドセッションを破棄し、起動プロセスの終了後にデータの読み取りと書き込みを開始します。
共有ストレージを読み取り /書き込みモードで再マウントします。
説明このステップでは、基になるストレージからのサポートが必要です。
SIGUSR2シグナルをStartupプロセスに送信して、ログ再生の終了とオンラインプロモート操作の処理を通知します。
LogIndexデータは実行中の読み取り専用ノードにのみ必要なため、PolarワーカープロセスにSIGUSR2シグナルを送信して、一部のLogIndexデータの解析を停止することを通知します。
LogIndexバックグラウンドワーカー (BGW) プロセスにSIGUSR2シグナルを送信して、オンラインプロモート操作の処理を通知します。
Postmasterプロセスを次の図に示します。
起動プロセス
古いプライマリノードによって生成されたすべてのWALログを再生し、LogIndexデータを生成します。
古いプライマリノードの最後のチェックポイントが読み取り専用ノードでも実行されていることを確認します。 これにより、最後のチェックポイントで読み取り専用ノードに書き込まれたデータがストレージに保存されます。
LogIndex BGWプロセスがPOLAR_BG_WAITING_RESET状態になるのを待ちます。
読み取り専用ノードのローカルデータ (詰まりなど) を共有ストレージにコピーします。
WALメタ・キュー・メモリ空間をリセットし、共有ストレージからスロット情報を再ロードし、LogIndex BGWプロセスのLSNを現在の整合性LSNの中の最小値に設定し、LogIndex BGWプロセスがこの時点から新しい再生を開始するようにする。
ノードロールをprimaryに設定し、LogIndex BGWプロセスのステータスをPOLAR_BG_ONLINE_PROMOTEに設定します。 その後、クラスターはデータの読み取りと書き込みを提供できます。
次の図は、起動プロセスを示しています。
LogIndex BGWプロセス
LogIndex BGWプロセスは、それ自体の状態マシンを有し、そのライフサイクルを通して状態マシンに基づいて実行される。 次の表に、LogIndex BGWプロセスの状態を示します。
状態
説明
POLAR_BG_WAITING_RESET
LogIndex BGWプロセスはリセット状態にあり、状態マシンが変化したことを他のプロセスに通知する。
POLAR_BG_ONLINE_PROMOTE
LogIndex BGWプロセスは、LogIndexデータを読み取り、再生タスクを編成および分散し、並列再生プロセスグループを使用してWALログを再生します。 この状態のLogIndex BGWプロセスは、状態を変更する前にすべてのLogIndexデータを再生する必要があります。 LogIndex BGWプロセスはまた、バックグラウンド再生のためのLSNを決定する。
POLAR_BG_REDO_NOT_START
再生タスクの終了を示します。
POLAR_BG_RO_BUF_REPLAYING
読み取り専用が実行されている場合、この状態のLogIndex BGWプロセスは、LogIndexデータを読み取り、WALログを順次再生します。 リプレイタスクが完了するたびに、LogIndex BGWプロセスは、バックグラウンドリプレイのためのLSNを決定する。
POLAR_BG_PARALLEL_REPLAYING
LogIndex BGWプロセスは、LogIndexデータを読み取り、再生タスクを編成および分散し、並列再生プロセスグループを使用してWALログを再生します。 リプレイタスクが完了するたびに、LogIndex BGWプロセスは、バックグラウンドリプレイのためのLSNを決定する。
次の図は、LogIndex BGWプロセスの状態を示しています。
LogIndex BGWプロセスは、PostmasterプロセスからSIGUSR2信号を受信した後、次のオンラインプロモート操作を実行します。
すべてのLogIndexデータをストレージに保存し、ステータスをPOLAR_BG_WAITING_RESETに変更します。
スタートアッププロセスがPOLAR_BG_ONLINE_PROMOTE状態になったことを確認するのを待ちます。
読み取り専用ノードが昇格される前に、LogIndex BGWプロセスは、バッファプール内のページのみをリプレイします。
読み取り専用ノードが昇格されている場合、LogIndex BGWプロセスは、すべてのWALログを順次再生し、MarkBufferDirtyを呼び出してページをダーティとしてマークし、ページがフラッシュされるのを待ちます。
リプレイタスクが完了すると、LogIndex BGWプロセスはバックグラウンドリプレイのLSNを決定し、ステータスをPOLAR_BG_REDO_NOT_STARTに変更します。
フラッシング制御
各ダーティページは、FlushList内で連続している最も古いLSNを有する。 このLSNは、整合性LSNを決定するために使用される。
読み取り専用ノードが昇格された後、現在のWAL LSNがバッファの最も古いLSNに設定された場合、最も古いLSNよりも低いLSNのデータがストレージに保存される前に、新しい一貫性LSNが設定される。
オンラインプロモーション機能は、2つの問題を解決する必要があります。
古いプライマリノードでのWALリプレイ中にダーティページに最も古いLSNを設定する方法は?
新しいプライマリノードによって生成されたダーティページに最も古いLSNを設定する方法は?
説明オンラインプロモートプロセス中に、PolarDB for PostgreSQL は、上記2つのケースで生成されたダーティページの最も古いLSNを、LogIndex BGWプロセスによって決定されたLSNに設定します。 同じ最も古いLSNでマークされたすべてのバッファがストレージに保存された場合にのみ、プロセスは新しいLSNを決定します。