PostgreSQL-17でのフェイルオーバースロットの設定

PostgreSQL 17では、高可用性の設定を強化するフェイルオーバースロットが導入されました。レプリケーションスロットは、レプリケーション中にノード間のデータを信頼性と一貫性を保つことを確実にし、一方、フェイルオーバースロットは、特にフェイルオーバー中およびその後にノード間の一貫性を確保します。

フェイルオーバースロットは、転送先サーバーへのフェイルオーバー後でも、論理レプリケーションが途切れることなく継続できる強力な機能です。フェイルオーバースロットを使用すると、論理レプリケーションスロットをプライマリノードとスタンバイノード間で自動的に同期させることが可能となり、フェイルオーバー時のダウンタイムと手動介入の必要性を大幅に減らすことができます。

このガイドでは、新しいフェイルオーバースロット機能を使用して高可用性のPostgreSQLクラスターを設定する方法を説明します。最終的には、フェイルオーバーをスムーズに処理できる堅牢なレプリケーションセットアップが完成します。

フェイルオーバースロットが歴史的観点から重要である理由

PostgreSQL 15の課題

  • プライマリノードに結び付けられたレプリケーションスロット:PostgreSQL 15では、レプリケーションスロットはプライマリサーバーでのみ作成されていました。プライマリサーバーが故障すると、すべての論理レプリケーションスロットが失われ、重大なレプリケーション遅延とデータ損失が発生しました。
  • 手動フェイルオーバーの管理:フェイルオーバーシナリオ中、管理者は新しいプライマリサーバーでレプリケーションスロットを手動で再作成する必要があり、これにより複雑さが増し、エラーが導入され、ダウンタイムが延長されました。
  • スロット同期なし:スタンバイサーバーはプライマリの論理レプリケーションスロットについて何も知る手段がありませんでした。この同期の欠如により、フェイルオーバーが発生するとレプリケーションストリームが完全にリセットされました。

PostgreSQL 16の改良

最小限の論理デコーディング

PostgreSQL 16では、スタンバイで最小限の論理デコーディングという機能が導入されました。

  • スタンバイでの最小デコーディング:これにより、スタンバイサーバーはWALログをデコードして論理レプリケーションの準備を行い、フェイルオーバーが発生した場合に使用するための事前準備スロットを有効にしました。
  • 高速フェイルオーバー:スタンバイでWALの変更を事前にデコードすることで、スタンバイをプライマリに昇格させる際のレプリケーション遅延を短縮することが可能でした。ただし、スムーズなフェイルオーバーを確保するためには引き続き一部の手動設定が必要でした。

PostgreSQL 17: ゲームチェンジャー – フェイルオーバースロット

  • フェイルオーバースロットPostgreSQL 17で導入されたフェイルオーバースロットは、プライマリとスタンバイサーバー間の論理レプリケーションスロットを自動的に同期することで、手動介入を不要にしました。
  • 自動同期:新しいスロット同期ワーカーにより、フェイルオーバーが有効になっているスロット(failover = true)が常に同期されるようになりました。これは、プライマリノードがアクティブな状態でも常に同期されます。
  • シームレスなトランジション: フェイルオーバー時、待機サーバーはレプリケーションスロットを失うことなくプライマリとして引き継ぎ、データの損失をゼロにし、継続的なレプリケーションを確保します。

Feature

PostgreSQL 15

PostgreSQL 16

PostgreSQL 17

論理レプリケーション

はい

はい

はい

自動スロット同期

いいえ

スタンバイにおける最小限の論理デコード

フェイルオーバースロットの完全な引き継ぎ

フェイルオーバー処理

手動介入が必要

待機中の事前ウォームアップ済みスロット

自動フェイルオーバースロット

スロットのスタンバイへの同期

サポートされていません

最小限で、構成が必要です

スロット同期ワーカーによる自動

論理レプリケーションの高可用性

限定された

最小限のデコードで改善

フェイルオーバースロットを使用したシームレス

フェイルオーバースロットを使用した高可用性クラスタの作成

このセクションでは、フェイルオーバースロットを使用したPostgreSQLの高可用性クラスタの作成方法について説明します。例として、次のノードを使用します:

  1. NodeA(プライマリサーバー)
  2. NodeB(物理スタンバイ)
  3. NodeC(論理サブスクライバー)

前提条件

始める前に、以下を確認してください:

  • 3つのノードすべてにPostgreSQL 17がインストールされていること。
  • 各ノード間でパスワードなしのSSHアクセスが可能であること。
  • PostgreSQL、PostgreSQLレプリケーション、およびPostgreSQL 構成ファイルの基本的な理解があること。

ステップ1: プライマリノード(NodeA)の構成

1.1 NodeAでクラスタを初期化します

主ノードにPostgreSQLをインストールした後、クラスタを初期化します。次のコマンドを使用できます:

Shell

 

1.2 postgresql.confファイルでレプリケーションを構成します

クラスタを初期化した後、デフォルトで/home/pgedge/nodeA/postgresql.confにあるpostgresql.confファイルを編集します。次のパラメータ値を設定します:

Shell

 

1.3 pg_hba.confファイルを更新してレプリケーションアクセスを許可します

pg_hba.confファイルはPostgreSQLサーバーのクライアント認証を管理します。 レプリケーションユーザーのアクセスを確保するために、/home/pgedge/nodeA/pg_hba.confに次のエントリを追加します:

Shell

 

その後、構成を再読み込みします:

Shell

 

1.4 レプリケーションユーザーを作成します

次に、PostgreSQLにログインしてレプリケーションユーザーを作成します:

Shell

 

SQL

 

1.5 テーブルを作成し、パブリケーションを設定します

次に、テーブルを作成し、関連付けられたパブリケーションを作成する必要があります:

SQL

 

ステップ2:物理スタンバイの構成(NodeB)

2.1 NodeBを初期化します

PostgreSQLをインストールした後、NodeBを初期化します:

Shell

 

2.1 ベースバックアップを作成します

次に、クラスタのバックアップを取るためにpg_basebackupを使用します:

Shell

 

2.2 Node-Bでpostgresql.confを構成します

postgresql.confファイル(/home/pgedge/nodeB/postgresql.confに位置)を変更し、次の設定を行います:

Shell

 

2.3 フェイルオーバースロット同期を有効にする

psqlクライアントを使用してNodeBにログインします:

Shell

 

次に、NodeBのレプリケーションを構成するために次のステートメントを使用します:

SQL

 

psqlクライアントを終了し、NodeBを再起動します:

Shell

 

2.4 スロット同期の確認

その後、psqlを使用してNodeBに再接続し、スロットが同期されていることを確認します:

SQL

 

ステップ3: 論理サブスクライバー(NodeC)の設定

3.1 クラスタを初期化し、NodeCを構成します

PostgreSQLをインストールした後、クラスタを初期化します。次のコマンドを使用できます:

Shell

 

次に、次のパラメータ値を設定して、/home/pgedge/nodeC/postgresql.confファイルを編集します:

Shell

 

3.2 NodeCにサブスクリプションを作成します

NodeCでサブスクリプションを作成するには、次のコマンドを使用します:

Shell

 

ステップ4: フェイルオーバーのシミュレーションと連続性の確保

次のコマンドを使用して、フェイルオーバーをシミュレートし、レプリケーションが継続され、データの整合性が保持されていることを確認できます。

4.1 フェイルオーバーのシミュレーション

NodeAの障害をシミュレートし、その後NodeBのスタンバイからプライマリへの昇格を行うには、次のコマンドを使用します:

Shell

 

4.2 NodeCでサブスクリプションを更新します

NodeBを昇格した後、NodeCにログインして、NodeBが現在プライマリノードであることを反映するために接続を更新します。

SQL

 

4.3 データの継続性を検証

レプリケーションをテストするには、psqlを使用してNode-B(現在のプライマリ)にログインします:

SQL

 

Node-Cでレプリケーションを確認します:

SQL

 

結論

PostgreSQL 17のフェイルオーバースロット機能を使用すると、論理レプリケーション環境でシームレスなフェイルオーバーが可能になります。このガイドで概説されている手順に従うことで、プライマリサーバーの障害が発生してもデータフローが途切れることなく、中断されない高可用性クラスターを作成できます。

構成を最適化し、PostgreSQL 17の新機能を活用することで、ミッションクリティカルなアプリケーション向けに耐障害性の高い効率的なデータベースインフラストラクチャを作成できます。

Source:
https://dzone.com/articles/setting-up-failover-slots-in-postgresql-17