PolarDB for PostgreSQL のオンライン昇格機能は、読み取り専用ノードをプライマリノードに昇格するために使用されます。
前提条件
PolarDB for PostgreSQL クラスタが、次のデータベースエンジンバージョンのいずれかで実行されていること。
PolarDB for PostgreSQL 16 リビジョンバージョン 2.0.16.3.1.1 以降
PolarDB for PostgreSQL 15 リビジョンバージョン 2.0.15.7.1.1 以降
PolarDB for PostgreSQL 14 リビジョンバージョン 2.0.14.5.1.0 以降
PolarDB for PostgreSQL 11 リビジョンバージョン 2.0.11.2.1.0 以降
PolarDB コンソールで、または 文を実行することで、クラスタの リビジョンバージョンを確認SHOW polardb_version;できます。リビジョンバージョンが要件を満たしていない場合は、更新してください。
背景情報
PolarDB for PostgreSQL は、共有ストレージに基づいて 1 つのプライマリノードと複数の読み取り専用ノードで構成されるアーキテクチャを採用しています。これは、従来のデータベースのプライマリ/セカンダリアーキテクチャとは以下の点で異なります。
セカンダリノード: 従来のデータベースで使用されます。個別のストレージを持ち、完全な WAL ログを使用してプライマリノードとデータを同期します。
読み取り専用ノード: PolarDB for PostgreSQL で使用されるレプリカノードです。プライマリノードとストレージを共有し、WAL メタログを使用してプライマリノードとデータを同期します。
従来のデータベースでは、昇格操作により、データベースを再起動したり、データの読み取りと書き込みを中断したりすることなく、セカンダリノードをプライマリノードに昇格できます。これにより、データベースの高可用性が確保され、目標復旧時間(RTO)が短縮されます。
PolarDB for PostgreSQL でも、読み取り専用ノードをプライマリノードに昇格できる必要があります。読み取り専用ノードは従来のデータベースのセカンダリノードとは異なるため、PolarDB for PostgreSQL は、読み取り専用ノードをプライマリノードに昇格するためのオンライン昇格機能を提供しています。
使用方法
pg_ctl ユーティリティを使用して、読み取り専用ノードを昇格できます。
pg_ctl promote -D [datadir]仕組み
以下のセクションでは、オンライン昇格機能の仕組みについて説明します。
トリガーメカニズム
PolarDB for PostgreSQL は、従来のデータベースでセカンダリノードを昇格するために使用されるのと同じメソッドを使用します。トリガープロセスでは、次の操作が実行されます。
[pg_ctl] ユーティリティで promote コマンドを呼び出して、postmaster プロセスにシグナルを送信します。postmaster プロセスは、他のプロセスと連携して昇格操作をシームレスに実行します。
recovery.conf ファイルで トリガーファイル のパスを定義します。その他のコンポーネントは、トリガーファイル を生成することによってトリガーされます。
説明PolarDB for PostgreSQL での読み取り専用ノードの昇格プロセスは、従来のデータベースでのセカンダリノードの昇格プロセスとは、以下の重要な点で異なります。
読み取り専用ノードがプライマリノードに昇格した後、共有ストレージを読み取り/書き込みモードで再マウントする必要があります。
読み取り専用ノードは、いくつかの重要な制御情報をメモリに保持します。プライマリノードのこのような制御情報は、共有ストレージに永続化されます。オンライン昇格プロセス中に、このような制御情報も共有ストレージに永続化されます。
読み取り専用ノードは、ログを再生することでメモリにデータを取得できます。オンライン昇格プロセス中に、どのデータを共有ストレージに書き込むことができるかを判断することが不可欠です。
読み取り専用ノードがメモリ内の WAL ログを再生する場合、プライマリノードとは異なるバッファエビクションメソッドとフラッシュ制御ルールを使用します。
読み取り専用ノードのサブプロセスは、オンライン昇格プロセス用に異なる方法で実装されます。
Postmaster プロセス
Postmaster プロセスは、トリガーファイル を検出するか、昇格コマンドを受信すると、オンライン昇格プロセスを開始します。
現在のすべてのバックエンドプロセスに SIGTERM シグナルを送信します。
説明読み取り専用ノードは、オンライン昇格プロセスが開始された後もデータ読み取りを提供できます。ただし、データは最新ではない可能性があります。スイッチオーバー中に新しいプライマリノードから古いデータが読み取られるのを防ぐため、すべてのバックエンドセッションを切断し、Startup プロセスが終了した後にデータの読み取りと書き込みを開始します。
共有ストレージを読み取り/書き込みモードで再マウントします。
説明この手順には、基盤となるストレージのサポートが必要です。
Startup プロセスに SIGUSR2 シグナルを送信して、ログ再生を終了し、オンライン昇格操作を処理するように通知します。
Polar ワーカープロセスに SIGUSR2 シグナルを送信して、一部の LogIndex データの解析を停止するように通知します。これは、このような LogIndex データは実行中の読み取り専用ノードにのみ必要であるためです。
LogIndex バックグラウンドワーカー(BGW)プロセスに SIGUSR2 シグナルを送信して、オンライン昇格操作を処理するように通知します。
次の図は、Postmaster プロセスを示しています。

Startup プロセス
古いプライマリノードによって生成されたすべての WAL ログを再生し、LogIndex データを生成します。
古いプライマリノードの最後のチェックポイントが読み取り専用ノードでも実行されていることを確認します。これにより、最後のチェックポイント用に読み取り専用ノードに書き込まれたデータがストレージに保存されます。
LogIndex BGW プロセスが [POLAR_BG_WAITING_RESET] 状態になるまで待機します。
読み取り専用ノードのローカルデータ(clog など)を共有ストレージにコピーします。
WAL メタキューメモリ領域をリセットし、共有ストレージからスロット情報を再読み込みし、LogIndex BGW プロセスの LSN を現在の整合性 LSN の最小値に設定して、LogIndex BGW プロセスがこの時点から新しい再生を開始するようにします。
ノードロールをプライマリに設定し、LogIndex BGW プロセスのステータスを [POLAR_BG_ONLINE_PROMOTE] に設定します。これで、クラスタはデータの読み取りと書き込みを提供できるようになります。
次の図は、Startup プロセスを示しています。

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] に変更します。
Startup プロセスが [POLAR_BG_ONLINE_PROMOTE] 状態になることを確認するまで待機します。
読み取り専用ノードが昇格される前、LogIndex BGW プロセスはバッファープール内のページのみを再生します。
読み取り専用ノードが昇格されているとき、LogIndex BGW プロセスはすべての WAL ログを順次再生し、MarkBufferDirty を呼び出してページをダーティとしてマークし、ページがフラッシュされるのを待ちます。
再生タスクが完了すると、LogIndex BGW プロセスはバックグラウンド再生の LSN を決定し、ステータスを [POLAR_BG_REDO_NOT_START] に変更します。
フラッシュ制御
ダーティページごとに最も古い LSN があり、FlushList 内で順番になっています。この LSN は、整合性 LSN を決定するために使用されます。
読み取り専用ノードが昇格された後、現在の WAL LSN がバッファの最も古い LSN に設定されている場合、最も古い LSN よりも低い LSN のデータがストレージに保存される前に、新しい整合性 LSN が設定されます。
オンライン昇格機能は、2 つの問題を解決する必要があります。
古いプライマリノードでの WAL 再生中に、ダーティページの最も古い LSN をどのように設定するか。
新しいプライマリノードによって生成されたダーティページの最も古い LSN をどのように設定するか。
説明オンライン昇格プロセス中に、PolarDB for PostgreSQL は、前述の 2 つのケースで生成されたダーティページの最も古い LSN を、LogIndex BGW プロセスによって決定された LSN に設定します。同じ最も古い LSN でマークされたすべてのバッファがストレージに保存された場合にのみ、プロセスは新しい LSN を決定します。