一般的に、PostgreSQLのバックアップと復元のオプションとして利用できる強力なツールがたくさんあるはずです。 Barman、PgBackRest、BARTは、このコンテキストでいくつか例を挙げます。私たちの注意を引いたのは、Barmanが生産展開と市場動向に迅速に追いついているツールであるということでした。
Dockerベースの展開であっても、バックアップを別のクラウドストレージに保存する必要がある場合でも、高度にカスタマイズ可能なディザスタリカバリアーキテクチャのニーズがある場合でも、Barmanはそのようなすべての場合に非常に強力な候補です。
このブログでは、展開についてほとんど想定せずにBarmanについて説明していますが、どのような場合でも、これは可能な機能セットのみと見なす必要があります。 Barmanは、このブログでキャプチャできるものをはるかに超えており、「PostgreSQLインスタンスのバックアップと復元」を検討する場合はさらに調査する必要があります。
DR対応の導入の前提条件
RPO =0は一般的にコストがかかります。同期スタンバイサーバーの導入はそれを満たすことがよくありますが、プライマリサーバーのTPSに影響を与えることがよくあります。
PostgreSQLと同様に、Barmanは、RPOとパフォーマンスのニーズを満たすために多数の展開オプションを提供します。展開の単純さ、RPO=0またはほぼゼロのパフォーマンスへの影響を考えてください。バーマンはすべてに適合します。
バックアップと復元のアーキテクチャのディザスタリカバリソリューションを確立するために、次の展開を検討しました。
図1:Barmanを使用したPostgreSQLの展開Site-Xには次のものがあります:
- PostgreSQLサーバーインスタンスpgServerをホストする1台のサーバー「pgServer」と1台のOSユーザー「postgres」
スーパーユーザーロール「bmuser」をホストするPostgreSQLインスタンス
- Barmanバイナリをホストする1台のサーバー「geobServer」とOSユーザー「bmuser」
- 「bServer」と「pgServer」の間:
- BarmanからPostgreSQLインスタンスへの管理プレーン接続
- BarmanからPostgreSQLインスタンスへの実際のベースバックアップを実行するためのrsync接続
- PostgreSQLインスタンスからBarmanへのbarman-wal-archiveを使用したWALアーカイブ
- バーマンでpg_receivexlogを使用したWALストリーミング
- 「bServer」と「geobserver」の間:
- 地理レプリケーションを提供するためのBarmanサーバー間の同期
pgServerの場合:
[email protected]$ ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y 2>&1 >/dev/null
[email protected]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
[email protected]$ ssh [email protected] "chmod 600 ~/.ssh/authorized_keys"
bServerの場合:
[email protected]$ ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y 2>&1 >/dev/null
[email protected]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
[email protected]$ ssh [email protected] "chmod 600 ~/.ssh/authorized_keys"
geobServerの場合:
[email protected]$ ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y 2>&1 >/dev/null
[email protected]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
[email protected]$ ssh [email protected] "chmod 600 ~/.ssh/authorized_keys"
PostgreSQLインスタンスの構成
postgresインスタンスを再構成する必要がある主なものは2つあります。ベースディレクトリと、その後に生成されるWAL/トランザクションログです。 Barmanサーバーはそれらをインテリジェントに追跡します。必要なのは、バーマンがこれらのアーティファクトを収集するために適切なフィードが生成されるようにすることです。
listen_addresses = '172.25.130.180' #as per above deployment assumption
wal_level = replica #or higher
archive_mode = on
archive_command = 'barman-wal-archive -U bmuser bserver pgserver %p'
アーカイブコマンドは、WALがpostgresインスタンスによってアーカイブされるときに、barman-wal-archiveユーティリティがそれをBarmanサーバーに送信することを保証します。したがって、barman-cliパッケージは「pgServer」で利用できるようにする必要があることに注意してください。 barman-wal-archiveユーティリティを使用したくない場合は、rsyncを使用する別のオプションがあります。
以下をpg_hba.confに追加します:
host all all 172.25.130.186/32 md5
host replication all 172.25.130.186/32 md5
基本的に、「bmserver」からこのpostgresインスタンスへのレプリケーションと通常の接続を許可しています。
インスタンスを再起動し、bmuserというスーパーユーザーロールを作成します:
[email protected]$ pg_ctl restart
[email protected]$ createuser -s -P bmuser
必要に応じて、bmuserをスーパーユーザーとして使用することも避けられます。このユーザーに割り当てられた特権が必要になります。上記の例では、パスワードとしてbmuserも使用しました。ただし、PostgreSQLインスタンスの構成が必要な限り、これでほぼすべてです。
Barmanの構成には、次の3つの基本コンポーネントがあります。
この場合、Barmanはrpmを使用してインストールされるため、グローバル構成ファイルは次の場所に保存されています:
/etc/barman.conf
サーバーレベルの構成をbmuserホームディレクトリに保存したかったため、グローバル構成ファイルには次の内容が含まれていました。
[barman]
barman_user = bmuser
configuration_files_directory = /home/bmuser/barman.d
barman_home = /home/bmuser
barman_lock_directory = /home/bmuser/run
log_file = /home/bmuser/barman.log
log_level = INFO
上記の展開では、プライマリBarmanサーバーをPostgreSQLインスタンスが保持されているのと同じデータセンター/サイトに保持することにしました。同じ利点は、必要な場合の遅延が少なく、回復が速いことです。言うまでもなく、PostgreSQLサーバーでも必要なコンピューティングやネットワーク帯域幅のニーズは少なくなります。
BarmanがpgServer上のPostgreSQLインスタンスを管理できるようにするには、次の内容の構成ファイル(pgserver.confという名前)を追加する必要があります。
[pgserver]
description = "Example pgserver configuration"
ssh_command = ssh [email protected]
conninfo = host=pgserver user=bmuser dbname=postgres
backup_method = rsync
reuse_backup = link
backup_options = concurrent_backup
parallel_jobs = 2
archiver = on
archiver_batch_size = 50
path_prefix = "/usr/pgsql-12/bin"
streaming_conninfo = host=pgserver user=bmuser dbname=postgres
streaming_archiver=on
create_slot = auto
そして、PostgreSQLインスタンスのbmuserのクレデンシャルを含む.pgpassファイル:
echo 'pgserver:5432:*:bmuser:bmuser' > ~/.pgpass
重要な構成項目をもう少し理解するには:
- ssh_command :rsyncが実行される接続を確立するために使用されます
- conninfo :Barmanがpostgresサーバーとの接続を確立できるようにする接続文字列
- reuse_backup :より少ないストレージで増分バックアップを可能にするため
- backup_method :ベースディレクトリのバックアップを取る方法
- path_prefix :pg_receivexlogバイナリが保存されている場所
- streaming_conninfo :WALのストリーミングに使用される接続文字列
- create_slot :postgresインスタンスによってスロットが作成されたことを確認するには
興味深いのは、このようなパッシブノードがミックスモードで動作できることです。つまり、アクティブなBarmanサーバーとして機能してPostgreSQLサイトのバックアップを実行し、並行して他のBarmanサーバーのレプリケーション/カスケードサイトとして機能することができます。
この場合、Barmanのこのインスタンス(Site-Y上)は単なるパッシブノードである必要があるため、必要なのはファイル/home/bmuser/barman.d/pgserver.confを作成することだけです。次の構成で:
[pgserver]
description = "Geo-replication or sync for pgserver"
primary_ssh_command = ssh [email protected]
キーが交換され、このノードのグローバル構成が前述のように行われることを前提としています。構成はほぼ完了しています。
bserverで、WALを受信するためのバックグラウンドプロセスがトリガーされていることを確認します。次に、サーバーの構成を確認します。
[email protected]$ barman cron
[email protected]$ barman check pgserver
Barmanでバックアップコマンドを発行して、WALを適用できるベースデータがあることを確認します。
[email protected]$ barman backup pgserver
「geobmserver」で、次のコマンドを実行してレプリケーションが実行されていることを確認します。
[email protected]$ barman cron
[email protected]$ barman list-backup pgserver
cronはcrontabファイルに挿入する必要があります(存在しない場合)。簡単にするために、ここでは示していません。最後のコマンドは、バックアップフォルダがgeobmserverにも作成されていることを示します。
次に、Postgresインスタンスで、ダミーデータを作成しましょう:
[email protected]$ psql -U postgres -c "CREATE TABLE dummy_data( i INTEGER);"
[email protected]$ psql -U postgres -c "insert into dummy_data values ( generate_series (1, 1000000 ));"
PostgreSQLインスタンスからのWALのレプリケーションは、次のコマンドを使用して確認できます。
[email protected]$ psql -U postgres -c "SELECT * from pg_stat_replication ;”
Site-Yでインスタンスを再作成するには、最初にWALレコードが切り替えられていることを確認します。または、この例では、クリーンなリカバリを作成します。
[email protected]$ barman switch-xlog --force --archive pgserver
Site-Xで、スタンドアロンのPostgreSQLインスタンスを起動して、バックアップが正常かどうかを確認しましょう。
[email protected]$ barman cron
barman recover --get-wal pgserver latest /tmp/data
次に、必要に応じてpostgresql.confファイルとpostgresql.auto.confファイルを編集します。次に、この例で行われた変更について説明します。
- postgresql.conf :listen_addressesは、デフォルトでlocalhostになるようにコメントされています
- postgresql.auto.conf :restore_commandからsudbmuserを削除しました
/ tmp / dataにこのデータを表示し、レコードの存在を確認します。