著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

ストリーミングレプリケーションは、リレーショナルデータベースを水平方向にスケーリングするために使用できる一般的な方法です。 別々のマシンで実行されている同じデータベースクラスターの2つ以上のコピーを使用します。 1つのデータベースクラスターはプライマリと呼ばれ、読み取り操作と書き込み操作の両方を提供します。 レプリカと呼ばれる他のものは、読み取り操作のみを提供します。 ストリーミングレプリケーションを使用して、システムの高可用性を提供することもできます。 プライマリデータベースクラスタまたはサーバーに予期しない障害が発生した場合、レプリカは読み取り操作を継続して提供するか、(レプリカの1つ)が新しいプライマリクラスタになります。

PostgreSQL は、論理レプリケーションと物理レプリケーションの両方をサポートする、広く使用されているリレーショナルデータベースです。 論理レプリケーションは、プライマリデータベースクラスターからレプリカデータベースに高レベルの変更をストリーミングします。 論理レプリケーションを使用すると、データベース内の単一のデータベースまたはテーブルに変更をストリーミングできます。 ただし、物理レプリケーションでは、 WAL(ログ先行書き込み)ログファイルへの変更がストリーミングされ、レプリカクラスターにレプリケートされます。 その結果、プライマリデータベースクラスタの特定の領域を複製することはできませんが、代わりにプライマリへのすべての変更が複製されます。

このチュートリアルでは、2つの別々のPostgreSQL 12クラスターを実行する2つの別々のマシンを使用して、Ubuntu20.04上のPostgreSQL12で物理ストリーミングレプリケーションをセットアップします。 1台のマシンはプライマリで、もう1台はレプリカです。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • 2台の別々のマシンUbuntu20.04マシン。 1つはプライマリと呼ばれ、もう1つはレプリカと呼ばれます。 これらは、初期サーバーセットアップガイドを使用してセットアップできます。これには、sudo権限とファイアウォールを持つ非rootユーザーが含まれます。
  • ポートでHTTP/HTTPSとトラフィックを許可するように構成されたファイアウォール 5432-PostgreSQL12で使用されるデフォルトのポート。 Ubuntu 20.04 でufwを使用してファイアウォールを設定する方法に従って、これらのファイアウォール設定を構成できます。
  • 両方のUbuntu20.04サーバーで実行されているPostgreSQL12。 Ubuntu20.04でのPostgreSQLのインストールと基本的な使用法をカバーするUbuntu20.04でPostgreSQLをインストールして使用する方法チュートリアルのステップ1に従ってください。

ステップ1—接続を受け入れるようにプライマリデータベースを設定する

この最初のステップでは、プライマリデータベースを構成して、レプリカデータベースが接続できるようにします。 デフォルトでは、PostgreSQLは localhost (127.0.0.1)接続用。 これを変更するには、最初に編集します listen_addresses primaryデータベースの構成パラメーター。

primary サーバーで、PostgreSQL構成ファイルを開きます。 postgresql.conf、で見つかりました /etc/postgresql/12/main/ ディレクトリ:

  1. sudo nano /etc/postgresql/12/main/postgresql.conf

ファイルが開いたら、 listen_addresses 変数と値をから変更します localhost プライマリサーバーのIPアドレスに。 また、を削除する必要があります # 次のような行の先頭からの文字:

/etc/postgresql/12/main/postgresql.conf
. . .
listen_addresses = 'your_primary_IP_address'
. . .

ファイルを保存して終了します。

完了すると、 primary データベースは、入力したIPアドレスで他のマシンからの接続を受け入れる準備が整います。 次に、replyprimaryに接続するときに使用する適切な権限を持つロールを作成します。

ステップ2—レプリケーション権限を持つ特別な役割を作成する

次に、データベースを複製する権限を持つprimaryデータベースにロールを作成する必要があります。 レプリカは、プライマリに接続するときにこの役割を使用します。 レプリケーション専用に別の役割を作成することにも、セキュリティ上の利点があります。 レプリカは、プライマリ上のデータを操作できなくなります。 データを複製することしかできません。

まず、データベースクラスターに接続します。 postgres 次のコマンドを使用するユーザー:

  1. sudo -u postgres psql

役割を作成するには、を実行する必要があります CREATE ROLE 次のようにクラスターでコマンドを実行します。

  1. CREATE ROLE test WITH REPLICATION PASSWORD 'testpassword' LOGIN;

次の出力が表示されます。

Output
CREATE ROLE

このコマンドは、という名前のロールを作成します test パスワード付き 'testpassword'、データベースクラスターを複製する権限があります。

PostgreSQLには、レプリカが接続する特別なレプリケーション疑似データベースがありますが、最初に編集する必要があります /etc/postgresql/12/main/pg_hba.conf レプリカがアクセスできるようにするための構成ファイル。 したがって、次のコマンドを実行してPostgreSQLコマンドプロンプトを終了します。

  1. \q

ターミナルコマンドプロンプトに戻ったので、 /etc/postgresql/12/main/pg_hba.conf を使用した構成ファイル nano:

  1. sudo nano /etc/postgresql/12/main/pg_hba.conf

次の行を最後に追加します pg_hba.conf ファイル:

/etc/postgresql/12/main/pg_hba.conf
. . .
host    replication     test    your-replica-IP/32   md5

これにより、プライマリレプリカがロールを使用してレプリケーション疑似データベースに接続できるようになります。 test、以前に作成しました。 The host valueは、プレーンまたはSSL暗号化TCP/IPソケットを介した非ローカル接続を受け入れることを意味します。 replication PostgreSQLがレプリケーションに使用する特別な疑似データベースの名前です。 最後に、値 md5 使用される認証のタイプです。 複数のレプリカが必要な場合は、他のレプリカのIPアドレスを使用して、ファイルの最後に同じ行をもう一度追加します。

構成ファイルへのこれらの変更が確実に実装されるようにするには、以下を使用してprimaryクラスターを再起動する必要があります。

  1. sudo systemctl restart [email protected]

プライマリクラスターが正常に再起動した場合、クラスターは正しくセットアップされ、レプリカが接続されるとストリーミングを開始する準備が整います。 次に、レプリカクラスターのセットアップに進みます。

ステップ3—レプリカのプライマリクラスターをバックアップする

このチュートリアルではPostgreSQLを使用して物理レプリケーションを設定しているため、プライマリクラスターのデータファイルをレプリカのデータディレクトリに物理バックアップする必要があります。 これを行うには、最初にreplicaのデータディレクトリ内のすべてのファイルをクリアします。 UbuntuでのPostgreSQLのデフォルトのデータディレクトリは /var/lib/postgresql/12/main/.

replicaのデータベースで次のコマンドを実行してPostgreSQLのデータディレクトリを見つけることもできます。

  1. SHOW data_directory;

データディレクトリの場所を特定したら、次のコマンドを実行してすべてを削除します。

  1. sudo -u postgres rm -r /var/lib/postgresql/12/main/*

ディレクトリ内のファイルのデフォルトの所有者はpostgresユーザーであるため、次のようにコマンドを実行する必要があります。 postgres を使用して sudo -u postgres.

注:非常にまれなケースで、ディレクトリ内のファイルが破損していてコマンドが機能しない場合は、 main ディレクトリをまとめて、次のように適切な権限で再作成します。

  1. sudo -u postgres rm -r /var/lib/postgresql/12/main
  2. sudo -u postgres mkdir /var/lib/postgresql/12/main
  3. sudo -u postgres chmod 700 /var/lib/postgresql/12/main

レプリカのデータディレクトリが空になったので、プライマリのデータファイルの物理バックアップを実行できます。 PostgreSQLには便利なユーティリティがあります pg_basebackup これにより、プロセスが簡素化されます。 それはあなたが使用してサーバーをスタンバイモードにすることさえ可能にします -R オプション。

を実行します pg_basebackup 次のようにレプリカでコマンドを実行します。

  1. sudo -u postgres pg_basebackup -h primary-ip-addr -p 5432 -U test -D /var/lib/postgresql/12/main/ -Fp -Xs -R
  • The -h オプションは非ローカルホストを指定します。 ここでは、primaryクラスターを使用してサーバーのIPアドレスを入力する必要があります。

  • The -p オプションは、primaryサーバーで接続するポート番号を指定します。 デフォルトでは、PostgreSQLはポートを使用します :5432.

  • The -U オプションを使用すると、primaryクラスターに接続するユーザーをとして指定できます。 これは、前の手順で作成した役割です。

  • The -D フラグはバックアップの出力ディレクトリです。 これは、直前に空にしたレプリカのデータディレクトリです。

  • The -Fp としてではなくプレーン形式で出力されるデータを指定します tar ファイル。

  • -Xs primary のバックアップが実行されると、WALログの内容がストリーミングされます。

  • 最後に、 -R 名前の付いた空のファイルを作成します standby.signalreplicaのデータディレクトリにあります。 このファイルにより、レプリカクラスターはスタンバイサーバーとして動作する必要があることを認識できます。 The -R オプションは、プライマリサーバーに関する接続情報も追加します。 postgresql.auto.conf ファイル。 これは、通常の場合に常に読み取られる特別な構成ファイルです。 postgresql.conf ファイルは読み取られますが、 .auto fileは、通常の構成ファイルの値をオーバーライドします。

いつ pg_basebackup コマンドがprimaryに接続すると、前の手順で作成した役割のパスワードを入力するように求められます。 プライマリデータベースクラスターのサイズによっては、すべてのファイルのコピーに時間がかかる場合があります。

これで、レプリカに、レプリケーションを開始するために必要なプライマリのすべてのデータファイルが含まれるようになります。 次に、 Replica をスタンバイモードにして、複製を開始します。

ステップ4—クラスターの再起動とテスト

プライマリクラスターのデータファイルがレプリカに正常にバックアップされたので、次のステップはレプリカデータベースクラスターを再起動してスタンバイモードにすることです。 。 reply データベースを再起動するには、次のコマンドを実行します。

  1. sudo systemctl restart [email protected]

レプリカクラスターがスタンバイモードで正常に再起動した場合は、他のマシンのプライマリデータベースクラスターにすでに接続されているはずです。 レプリカプライマリに接続され、プライマリがストリーミングされているかどうかを確認するには、次のコマンドを実行してプライマリデータベースクラスターに接続します。

  1. sudo -u postgres psql

次に、クエリを実行します pg_stat_replication primaryデータベースクラスターのテーブルは次のとおりです。

  1. SELECT client_addr, state FROM pg_stat_replication;

primary クラスターでこのクエリを実行すると、次のような出力が返されます。

Output
client_addr | state ------------------+----------- your_replica_IP | streaming

同様の出力がある場合、primaryreplicaに正しくストリーミングされています。

結論

これで、2つのUbuntu 20.04サーバーがあり、それぞれにPostgreSQL12データベースクラスターがあり、それらの間で物理ストリーミングが実行されています。 プライマリデータベースクラスターに加えられた変更は、レプリカクラスターにも表示されます。

データベースがより多くのトラフィックを処理する必要がある場合は、セットアップにレプリカを追加することもできます。

ミッションクリティカルなデータを失う可能性をゼロにするための同期レプリケーションの設定方法など、物理ストリーミングレプリケーションについて詳しく知りたい場合は、公式のPostgreSQL docsのエントリを読むことができます。

その他のチュートリアルとコンテンツについては、PostgreSQLトピックページを確認してください。