Ubuntu20.04でPostgreSQL12を使用して物理ストリーミングレプリケーションを設定する方法
著者は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以外のユーザーが含まれます。
- ポート
5432
(PostgreSQL 12で使用されるデフォルトのポート)でHTTP/HTTPSとトラフィックを許可するように構成されたファイアウォール。 Ubuntu 20.04 でufwを使用してファイアウォールを設定する方法に従って、これらのファイアウォール設定を構成できます。 - 両方のUbuntu20.04サーバーで実行されているPostgreSQL12。 Ubuntu20.04でのPostgreSQLのインストールと基本的な使用法を説明するUbuntu20.04でPostgreSQLをインストールして使用する方法チュートリアルのステップ1に従ってください。
ステップ1—接続を受け入れるようにプライマリデータベースを設定する
この最初のステップでは、プライマリデータベースを構成して、レプリカデータベースが接続できるようにします。 デフォルトでは、PostgreSQLは接続についてlocalhost
(127.0.0.1
)のみをリッスンします。 これを変更するには、最初にprimaryデータベースのlisten_addresses
構成パラメーターを編集します。
primary サーバーで、/etc/postgresql/12/main/
ディレクトリにあるPostgreSQL構成ファイルpostgresql.conf
を開きます。
- sudo nano /etc/postgresql/12/main/postgresql.conf
ファイルが開いたら、listen_addresses
変数を見つけて、値をlocalhost
からprimaryサーバーのIPアドレスに変更します。 また、次のように、行の先頭から#
文字を削除する必要があります。
. . .
listen_addresses = 'your_primary_IP_address'
. . .
ファイルを保存して終了します。
完了すると、 primary データベースは、入力したIPアドレスで他のマシンからの接続を受け入れる準備が整います。 次に、replyがprimaryに接続するときに使用する適切な権限を持つロールを作成します。
ステップ2—レプリケーション権限を持つ特別な役割を作成する
次に、データベースを複製する権限を持つprimaryデータベースにロールを作成する必要があります。 レプリカは、プライマリに接続するときにこの役割を使用します。 レプリケーション専用に別の役割を作成することにも、セキュリティ上の利点があります。 レプリカは、プライマリ上のデータを操作できなくなります。 データを複製することしかできません。
まず、次のコマンドを使用して、postgres
ユーザーとしてデータベースクラスターに接続します。
- sudo -u postgres psql
ロールを作成するには、次のようにクラスターでCREATE ROLE
コマンドを実行する必要があります。
- CREATE ROLE test WITH REPLICATION PASSWORD 'testpassword' LOGIN;
次の出力が表示されます。
OutputCREATE ROLE
このコマンドは、test
という名前のロールをパスワード'testpassword'
で作成します。このロールには、データベースクラスターを複製する権限があります。
PostgreSQLにはreplicaが接続する特別なレプリケーション疑似データベースがありますが、最初に/etc/postgresql/12/main/pg_hba.conf
構成ファイルを編集してreplicaがアクセスできるようにする必要があります。 したがって、次のコマンドを実行してPostgreSQLコマンドプロンプトを終了します。
- \q
ターミナルコマンドプロンプトに戻ったので、nano
を使用して/etc/postgresql/12/main/pg_hba.conf
構成ファイルを開きます。
- sudo nano /etc/postgresql/12/main/pg_hba.conf
pg_hba.conf
ファイルの最後に次の行を追加します。
. . .
host replication test your-replica-IP/32 md5
これにより、プライマリで、レプリカが以前に作成したロールtest
を使用してレプリケーション疑似データベースに接続できるようになります。 host
値は、プレーンまたはSSL暗号化TCP/IPソケットを介した非ローカル接続を受け入れることを意味します。 replication
は、PostgreSQLがレプリケーションに使用する特別な疑似データベースの名前です。 最後に、値md5
は、使用される認証のタイプです。 複数のレプリカが必要な場合は、他のレプリカのIPアドレスを使用して、ファイルの最後に同じ行をもう一度追加します。
構成ファイルへのこれらの変更が確実に実装されるようにするには、以下を使用してprimaryクラスターを再起動する必要があります。
- sudo systemctl restart postgresql@12-main
プライマリクラスターが正常に再起動した場合、クラスターは正しくセットアップされ、レプリカが接続されるとストリーミングを開始する準備が整います。 次に、レプリカクラスターのセットアップに進みます。
ステップ3—レプリカのプライマリクラスターをバックアップする
このチュートリアルではPostgreSQLを使用して物理レプリケーションを設定しているため、プライマリクラスターのデータファイルをレプリカのデータディレクトリに物理バックアップする必要があります。 これを行うには、最初にreplicaのデータディレクトリ内のすべてのファイルをクリアします。 UbuntuでのPostgreSQLのデフォルトのデータディレクトリは/var/lib/postgresql/12/main/
です。
replicaのデータベースで次のコマンドを実行してPostgreSQLのデータディレクトリを見つけることもできます。
- SHOW data_directory;
データディレクトリの場所を特定したら、次のコマンドを実行してすべてを削除します。
- sudo -u postgres rm -r /var/lib/postgresql/12/main/*
ディレクトリ内のファイルのデフォルトの所有者はpostgresユーザーであるため、sudo -u postgres
を使用してpostgres
としてコマンドを実行する必要があります。
注:非常にまれなケースで、ディレクトリ内のファイルが破損していてコマンドが機能しない場合は、main
ディレクトリをまとめて削除し、次のように適切な権限で再作成してください。
- sudo -u postgres rm -r /var/lib/postgresql/12/main
- sudo -u postgres mkdir /var/lib/postgresql/12/main
- sudo -u postgres chmod 700 /var/lib/postgresql/12/main
レプリカのデータディレクトリが空になったので、プライマリのデータファイルの物理バックアップを実行できます。 PostgreSQLには、プロセスを簡素化するユーティリティpg_basebackup
があります。 -R
オプションを使用してサーバーをスタンバイモードにすることもできます。
レプリカでpg_basebackup
コマンドを次のように実行します。
- sudo -u postgres pg_basebackup -h primary-ip-addr -p 5432 -U test -D /var/lib/postgresql/12/main/ -Fp -Xs -R
-
-h
オプションは、非ローカルホストを指定します。 ここでは、primaryクラスターを使用してサーバーのIPアドレスを入力する必要があります。 -
-p
オプションは、プライマリサーバーで接続するポート番号を指定します。 デフォルトでは、PostgreSQLはポート:5432
を使用します。 -
-U
オプションを使用すると、プライマリクラスターに接続するユーザーをとして指定できます。 これは、前の手順で作成した役割です。 -
-D
フラグは、バックアップの出力ディレクトリです。 これは、直前に空にしたレプリカのデータディレクトリです。 -
-Fp
は、tar
ファイルではなくプレーン形式で出力するデータを指定します。 -
-Xs
は、 primary のバックアップが実行されるときに、WALログの内容をストリーミングします。 -
最後に、
-R
は、レプリカのデータディレクトリにstandby.signal
という名前の空のファイルを作成します。 このファイルにより、レプリカクラスターはスタンバイサーバーとして動作する必要があることを認識できます。-R
オプションは、プライマリサーバーに関する接続情報もpostgresql.auto.conf
ファイルに追加します。 これは、通常のpostgresql.conf
ファイルが読み取られるたびに読み取られる特別な構成ファイルですが、.auto
ファイルの値が通常の構成ファイルの値を上書きします。
pg_basebackup
コマンドがprimaryに接続すると、前の手順で作成した役割のパスワードを入力するように求められます。 primary データベースクラスターのサイズによっては、すべてのファイルのコピーに時間がかかる場合があります。
これで、レプリカに、レプリケーションを開始するために必要なプライマリのすべてのデータファイルが含まれるようになります。 次に、 reply をスタンバイモードにして、複製を開始します。
ステップ4—クラスターの再起動とテスト
プライマリクラスターのデータファイルがレプリカに正常にバックアップされたので、次のステップはレプリカデータベースクラスターを再起動してスタンバイモードにすることです。 。 reply データベースを再起動するには、次のコマンドを実行します。
- sudo systemctl restart postgresql@12-main
レプリカクラスターがスタンバイモードで正常に再起動した場合は、他のマシンのプライマリデータベースクラスターにすでに接続されているはずです。 レプリカがプライマリに接続され、プライマリがストリーミングされているかどうかを確認するには、次のコマンドを実行してプライマリデータベースクラスターに接続します。
- sudo -u postgres psql
次に、primaryデータベースクラスターのpg_stat_replication
テーブルを次のようにクエリします。
- SELECT client_addr, state FROM pg_stat_replication;
primary クラスターでこのクエリを実行すると、次のような出力が返されます。
Output client_addr | state
------------------+-----------
your_replica_IP | streaming
同様の出力がある場合、primaryはreplicaに正しくストリーミングされています。
結論
これで、2つのUbuntu 20.04サーバーがあり、それぞれにPostgreSQL12データベースクラスターがあり、それらの間で物理ストリーミングが実行されています。 プライマリデータベースクラスターに加えられた変更は、レプリカクラスターにも表示されます。
データベースがより多くのトラフィックを処理する必要がある場合は、セットアップにレプリカを追加することもできます。
ミッションクリティカルなデータを失う可能性をゼロにするための同期レプリケーションの設定方法など、物理ストリーミングレプリケーションについて詳しく知りたい場合は、公式のPostgreSQL docsのエントリを読むことができます。
その他のチュートリアルとコンテンツについては、PostgreSQLトピックページを確認してください。