PostgreSQLは、同じデータ構造を持つ複数のマシンで個別に動作できるため、アプリケーションの永続性レイヤーの復元力が高まり、サービスの継続性を損なう可能性のある予期しないイベントに備えることができます。
この背後にある考え方は、存在する各ノードがクラスターである「ラウンドロビン」ネットワークに要求を分散することにより、システムの応答時間を改善することです。このタイプのセットアップでは、応答は常に同じであるため、どちらの要求が配信されて処理されるかは重要ではありません。
このブログでは、プログラムのインストールで提供されるツールを使用してPostgreSQLクラスターを複製する方法について説明します。使用されているバージョンはPostgreSQL11.5です。これは、オペレーティングシステムDebianBusterで現在安定して一般的に利用可能なバージョンです。このブログの例では、すでにLinuxに精通していることを前提としています。
PostgreSQLプログラム
# 1. Lists the files contained in the directory
# 2. Filters the elements that contain 'pg_' in the name
ls /usr/bin/ | grep pg_
これらのプログラムを通じて実施される活動は、順次実行することも、他のプログラムと組み合わせて実行することもできます。同じディレクトリにあるmakeと呼ばれるLinuxプログラムのおかげで、これらのアクティビティのブロックを1つのコマンドで実行できます。
存在するクラスターを一覧表示するには、pg_lsclustersプログラムを使用します。 makeを使用して実行することもできます。その動作は、コマンドが実行されるのと同じディレクトリにある必要があるMakefileという名前のファイルに依存します。
# 1. The current directory is checked
pwd
# 2. Creates a directory
mkdir ~/Documents/Severalnines/
# 3. Enroute to the chosen directory
cd ~/Documents/Severalnines/
# 4. Create the file Makefile
touch Makefile
# 5. Open the file for editing
ブロックの定義を以下に示します。名前はlsで、実行する単一のプログラムpg_lsclustersがあります。
# 1. Block name
ls:
# 2. Program to be executed
pg_lsclusters
ファイルMakefileには複数のブロックを含めることができ、各ブロックは必要な数のプログラムを実行でき、パラメーターを受け取ることもできます。スペースの代わりにインデントするための表を使用して、実行ブロックに属する行が正しいことが不可欠です。
makeを使用してpg_lsclustersプログラムを実行するには、makelsコマンドを使用します。
# 1. Executes pg_lsclusters
make ls
最近のPostgreSQLインストールで得られた結果は、オペレーティングシステムのポート5432に割り当てられたmainと呼ばれる単一のクラスターをもたらします。 pg_createclusterプログラムを使用すると、作成された新しいクラスターに新しいポートが割り当てられ、値5432が開始点として、別のポートが昇順で見つかるまで割り当てられます。
先行書き込みログ(WAL)
このレプリケーション手順は、更新を受信し続けている動作中のクラスターのバックアップを作成することで構成されます。ただし、これを同じマシンで実行すると、この手法によってもたらされる多くの利点が失われます。
システムを水平方向にスケーリングすると、サービスの可用性が向上します。ハードウェアの問題が発生した場合でも、他のマシンがワークロードを引き受ける準備ができているため、大きな違いはありません。
WALは、システムで行われるトランザクションの整合性を保証するPostgreSQLの内部複雑なアルゴリズムを表すために使用される用語です。ただし、書き込み権限でアクセスする責任を負う必要があるのは1つのクラスターのみです。
アーキテクチャには、3つの異なるタイプのクラスターがあります。
- WALへの書き込みを担当するプライマリー;
- プライマリポストを引き継ぐ準備ができているレプリカ。
- WAL読み取り義務のあるその他のレプリカ。
書き込み操作は、新しい要素を入力するか、既存のレコードを更新および削除することによって、データ構造を変更することを目的としたアクティビティです。
PostgreSQLクラスター構成
各クラスターには2つのディレクトリがあり、1つには構成ファイルが含まれ、もう1つにはトランザクションログが含まれます。これらはそれぞれ/etc/ postgresql / 11 / $(cluster)と/ var / lib / postgresql / 11 / $(cluster)にあります($(cluster)はクラスターの名前です)。
ファイルpostgresql.confは、プログラムpg_createclusterを実行してクラスターを作成した直後に作成され、クラスターをカスタマイズするためにプロパティを変更できます。
このファイルにはほとんどすべてのプロパティが含まれているため、このファイルを直接編集することはお勧めしません。それらの値はコメント化されており、各行の先頭に記号#があり、他のいくつかの行には、プロパティ値を変更するための指示が含まれています。
必要な変更を含む別のファイルを追加できます。includeという名前の単一のプロパティを編集し、デフォルト値#include =‘’をinclude =‘postgresql.replication.conf’に置き換えます。
クラスターを起動する前に、postgresql.confという元の構成ファイルと同じディレクトリにpostgresql.replication.confファイルが存在する必要があります。
# 1. Block name
create:
# 2. Creates the cluster
pg_createcluster 11 $(cluster) -- --data-checksums
# 3. Copies the file to the directory
cp postgresql.replication.conf /etc/postgresql/11/$(cluster)/
# 4. A value is assigned to the property
sed -i "s|^#include = ''|include = 'postgresql.replication.conf'|g" /etc/postgresql/11/$(cluster)/postgresql.conf
クラスターの作成に--data-checksumsを使用すると、データの整合性が向上し、パフォーマンスが少し低下しますが、ファイルの破損を回避するために非常に重要です。あるクラスターから別のクラスターに転送されました。
上記の手順は、プログラムmakeの実行時にパラメーターとして$(cluster)に値を渡すだけで、他のクラスターで再利用できます。
# 1. Executes the block 'create' by passing a parameter
sudo make create cluster=primary
タスクの簡単な自動化が確立されたので、残りの作業は、各クラスターの必要性に応じたファイルpostgresql.replication.confの定義です。
PostgreSQLでのレプリケーション
クラスターを複製する方法は2つあります。1つはクラスター全体を含む完全な方法(ストリーミング複製と呼ばれる)、もう1つは部分的または完全な方法(論理複製と呼ばれる)です。
クラスターに指定する必要のある設定は、主に4つのカテゴリに分類されます。
- マスターサーバー
- スタンバイサーバー
- サーバーの送信
- サブスクライバー
前に見たように、WALはクラスター上で行われるトランザクションを含むファイルであり、レプリケーションはこれらのファイルを1つのクラスターから別のクラスターに送信することです。
ファイルpostgresql.confにある設定の中に、WALファイルに関連するクラスターの動作を定義するプロパティ(ファイルのサイズなど)が表示されます。
# default values
max_wal_size = 1GB
min_wal_size = 80MB
max_wal_sendersと呼ばれるもう1つの重要なプロパティ。特徴的な送信サーバーを備えたクラスターに属するのは、これらのファイルを他のクラスターに送信するプロセスの量であり、受信に依存するクラスターの数よりも常に大きい値である必要があります。
WALファイルは、接続が遅れている、または受信に問題があり、現在の時刻に関連して以前のファイルが必要なクラスターに送信するために保存できます。仕様としてwal_keep_segmentsプロパティがあります。クラスターによって維持されるWALファイルセグメントの数。
レプリケーションスロットは、max_replication_slotsオプションをプロパティとして使用して、別のクラスターにすべてのレコードを提供するために必要なWALファイルをクラスターに格納できるようにする機能です。
# default values
max_wal_senders = 10
wal_keep_segments = 0
max_replication_slots = 10
これらのWALファイルのストレージを外部委託する場合は、連続アーカイブと呼ばれる、これらのファイルを処理する別の方法を使用できます。
この概念により、Linuxプログラムと、ファイルのパスを表す2つの変数、および%pや%fなどの名前を使用して、WALファイルを特定の場所に送ることができます。それぞれ。
このプロパティはデフォルトで無効になっていますが、このような重要なファイルの保存からクラスターの責任を撤回することで簡単に使用でき、postgresql.replication.confファイルに追加できます。
# 1. Creates a directory
mkdir ~/Documents/Severalnines/Archiving
# 2. Implementation on postgresql.replication.conf
archive_mode = on
archive_command = 'cp %p ~/Documents/Severalnines/Archiving/%f'
# 3. Starts the cluster
sudo systemctl start [email protected]
クラスターの初期化後、一部のプロパティを変更する必要があり、クラスターの再起動が必要になる場合があります。ただし、一部のプロパティは、クラスターを完全に再起動しなくても、再ロードすることしかできません。
このような件名に関する情報は、postgresql.confファイルにある#として表示されるコメントから取得できます(注:変更には再起動が必要です)。
この場合、解決する簡単な方法は、以前はクラスターを起動するために使用されていたLinuxプログラムsystemctlを使用することで、再起動するオプションをオーバーライドするだけです。
完全な再起動が不要な場合、クラスター自体は、クラスター内で実行されるクエリを介してプロパティを再割り当てできますが、複数のクラスターが同じマシンで実行されている場合は、パラメーターを渡す必要があります。クラスタがオペレーティングシステムに割り当てられているポート値が含まれています。
# Reload without restarting
sudo -H -u postgres psql -c ‘SELECT pg_reload_conf();’ -p 5433
上記の例では、プロパティarchive_modeは再起動が必要ですが、archive_commandは再起動が必要ありません。このテーマについて簡単に紹介した後、ポイントインタイムリカバリ(PITR)を使用して、レプリカクラスタがこれらのアーカイブされたWALファイルをバックアップする方法を見てみましょう。
PostgreSQLレプリケーションのポイントインタイムリカバリ
この示唆に富む名前により、クラスターは特定の期間からその状態に戻ることができます。これは、recovery_target_timelineと呼ばれるプロパティを介して実行されます。このプロパティは、2019-08-22 12:05 GMTなどの日付形式の値、または最新の割り当てを受け取り、最後の既存のレコードまでの回復の必要性を通知します。
プログラムpg_basebackupは、実行時に、クラスターから別の場所へのデータを含むディレクトリのコピーを作成します。このプログラムは複数のパラメーターを受け取る傾向があり、そのうちの1つは-Rであり、コピーされたディレクトリ内にrecovery.confという名前のファイルを作成します。このファイルは、postgresql.confなどの以前に表示された他の構成ファイルと同じではありません。 。
ファイルrecovery.confは、プログラムpg_basebackupの実行で渡されたパラメーターを格納します。このファイル内には、連続アーカイブの逆の操作が可能であるため、その存在はストリーミングレプリケーションの実装に不可欠です。実行されます。
# 1. Block name
replicate:
# 2. Removes the current data directory
rm -rf /var/lib/postgresql/11/$(replica)
# 3. Connects to primary cluster as user postgres
# 4. Copies the entire data directory
# 5. Creates the file recovery.conf
pg_basebackup -U postgres -d postgresql://localhost:$(primaryPort) -D /var/lib/postgresql/11/$(replica) -P -R
# 6. Inserts the restore_command property and its value
echo "restore_command = 'cp ~/Documents/Severalnines/Archiving/%f %p'" >> /var/lib/postgresql/11/$(replica)/recovery.conf
# 7. The same is done with recovery_target_timeline
echo "recovery_target_timeline = 'latest'" >> /var/lib/postgresql/11/$(replica)/recovery.conf
上記で指定したこのレプリケートブロックは、クラスターデータ、postgres、またはユーザーrootの所有者との潜在的な競合を回避するために、オペレーティングシステムのpostgresユーザーが実行する必要があります。
>レプリカクラスターはまだ立っており、レプリケーションを正常に開始するために、pg_walreceiverと呼ばれるレプリカクラスタープロセスがTCP接続を介してpg_walsenderと呼ばれるプライマリクラスターと対話します。
# 1. Executes the block ‘replicate’ by passing two parameters
sudo -H -u postgres make replicate replica=replica primaryPort=5433
# 2. Starts the cluster replica
sudo systemctl start [email protected]
ストリーミングレプリケーションと呼ばれるこのレプリケーションモデルの正常性の検証は、プライマリクラスターで実行されるクエリによって実行されます。
# 1. Checks the Streaming Replication created
sudo -H -u postgres psql -x -c ‘select * from pg_stat_replication;’ -p 5433
このブログでは、2つのPostgreSQLクラスター間で非同期ストリーミングレプリケーションを設定する方法を紹介しました。ただし、上記のコードには脆弱性が存在することを忘れないでください。たとえば、postgresユーザーを使用してこのようなタスクを実行することはお勧めしません。
クラスターのレプリケーションは、正しい方法で使用され、クラスターと相互作用するようになるAPIに簡単にアクセスできる場合、いくつかの利点があります。