すべてのプロダクト
Search
ドキュメントセンター

PolarDB:オンライン昇格

最終更新日:May 30, 2025

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 プロセス

    1. Postmaster プロセスは、トリガーファイル を検出するか、昇格コマンドを受信すると、オンライン昇格プロセスを開始します。

    2. 現在のすべてのバックエンドプロセスに SIGTERM シグナルを送信します。

      説明

      読み取り専用ノードは、オンライン昇格プロセスが開始された後もデータ読み取りを提供できます。ただし、データは最新ではない可能性があります。スイッチオーバー中に新しいプライマリノードから古いデータが読み取られるのを防ぐため、すべてのバックエンドセッションを切断し、Startup プロセスが終了した後にデータの読み取りと書き込みを開始します。

    3. 共有ストレージを読み取り/書き込みモードで再マウントします。

      説明

      この手順には、基盤となるストレージのサポートが必要です。

    4. Startup プロセスに SIGUSR2 シグナルを送信して、ログ再生を終了し、オンライン昇格操作を処理するように通知します。

    5. Polar ワーカープロセスに SIGUSR2 シグナルを送信して、一部の LogIndex データの解析を停止するように通知します。これは、このような LogIndex データは実行中の読み取り専用ノードにのみ必要であるためです。

    6. LogIndex バックグラウンドワーカー(BGW)プロセスに SIGUSR2 シグナルを送信して、オンライン昇格操作を処理するように通知します。

    次の図は、Postmaster プロセスを示しています。Postmaster进程处理过程

  • Startup プロセス

    1. 古いプライマリノードによって生成されたすべての WAL ログを再生し、LogIndex データを生成します。

    2. 古いプライマリノードの最後のチェックポイントが読み取り専用ノードでも実行されていることを確認します。これにより、最後のチェックポイント用に読み取り専用ノードに書き込まれたデータがストレージに保存されます。

    3. LogIndex BGW プロセスが [POLAR_BG_WAITING_RESET] 状態になるまで待機します。

    4. 読み取り専用ノードのローカルデータ(clog など)を共有ストレージにコピーします。

    5. WAL メタキューメモリ領域をリセットし、共有ストレージからスロット情報を再読み込みし、LogIndex BGW プロセスの LSN を現在の整合性 LSN の最小値に設定して、LogIndex BGW プロセスがこの時点から新しい再生を開始するようにします。

    6. ノードロールをプライマリに設定し、LogIndex BGW プロセスのステータスを [POLAR_BG_ONLINE_PROMOTE] に設定します。これで、クラスタはデータの読み取りと書き込みを提供できるようになります。

    次の図は、Startup プロセスを示しています。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进程处理过程

    LogIndex BGW プロセスは、Postmaster プロセスから SIGUSR2 シグナルを受信すると、次のオンライン昇格操作を実行します。

    1. すべての LogIndex データをストレージに保存し、ステータスを [POLAR_BG_WAITING_RESET] に変更します。

    2. 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 を決定します。