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

PolarDB:オンライン宣伝

最終更新日:Jun 27, 2024

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

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

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

      説明

      読み取り専用ノードは、オンラインプロモートプロセスの開始後もデータ読み取りを提供できます。 ただし、データは最新ではない場合があります。 切り替え中に古いデータが新しいプライマリノードから読み取られないようにするには、すべてのバックエンドセッションを破棄し、起動プロセスの終了後にデータの読み取りと書き込みを開始します。

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

      説明

      このステップでは、基になるストレージからのサポートが必要です。

    4. SIGUSR2シグナルをStartupプロセスに送信して、ログ再生の終了とオンラインプロモート操作の処理を通知します。

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

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

    Postmasterプロセスを次の図に示します。Postmaster进程处理过程

  • 起動プロセス

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

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

    3. LogIndex BGWプロセスがPOLAR_BG_WAITING_RESET状態になるのを待ちます。

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

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

    6. ノードロールをprimaryに設定し、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进程处理过程

    LogIndex BGWプロセスは、PostmasterプロセスからSIGUSR2信号を受信した後、次のオンラインプロモート操作を実行します。

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

    2. スタートアッププロセスが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を決定します。