こんにちは、BARSグループのチーフシステムアドミニストレーターであるAlexanderNikitinです。この記事では、pg_probackupツールを紹介します。
Pg_probackupは、PostgreSQLDBMSのバックアップコピーの作成を支援するPostgresProfessionalによる開発です。標準のpg_basebackupユーティリティとは異なり、このツールを使用すると、データブロックレベル(デフォルトでは8Kb)で増分バックアップを作成したり、バックアップとDBMSを検証したり、ストレージポリシーを設定したりできます。
この記事では、pg_probackupの操作で考えられるすべての側面について説明するつもりはありません。作業で、このツールをどのように使用できるかを理解したいと思います。
次の使用例が考慮されます。
- wal-
1
与えられたもの: 2つのサーバー(OS CentOS 7)があり、最初にデータベース(ホスト名srv_db1、ユーザーpostgres、PostgreSQL 12.4がインストールされている)があり、2番目にバックアップ(ホスト名srv_bkp、ユーザーbackup_user)が保存されます。
PostgreSQLクラスターのコピーがsrv_bkpサーバーに保存されるようにバックアップを構成する必要があります。
解決策:
pg_probackupはsshを介して機能し、通信およびトランスポートチャネルとしてssh接続を使用するリモートホスト上でエージェントを起動できます。したがって、srv_bkpホストのbackup_userがsrv_db1ホストのpostgresユーザーに接続できることを確認する必要があります。
1)backup_userを使用してsrv_bkpに接続し、次のコマンドを実行します。
ssh-keygen -t rsa
ssh-copy-id postgres@srv_db1
パラノイドモードをオンにして、srv_db1サーバーの〜/ .ssh / authorized_keysファイルを編集
します。キーの行の前に、次を挿入します。
command="pg_probackup-12 agent"
したがって、次のような結果になるはずです。
command="pg_probackup-12 agent" ssh-rsa AAAA....
これにより、SSH経由で起動できるのは「pg_probackup-12エージェント」だけであると言えます(これについて詳しくは、こちらをご覧ください)。
2)両方のマシンにpg_probackupをインストールします(この例ではCentOSで作業していますが、他のディストリビューションの場合、インストールプロセスはドキュメントに記載されています):
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
rpm -ivh https://repo.postgrespro.ru/pg_probackup/keys/pg_probackup-repo-centos.noarch.rpm
yum install pg_probackup-12
yum install pg_probackup-12-debuginfo
この記事の執筆時点で、利用可能な最新バージョンのpg_probackupがインストールされます-2.4.2。
3)srv_bkpにエイリアスを作成し(これは必須ではありませんが、より便利です)、バックアップを使用してディレクトリへのパスを含む変数を定義します(このディレクトリを作成した後)。
mkdir /home/backup_user/backup_db
echo "BACKUP_PATH=/home/backup_user/backup_db">>~/.bash_profile
echo "export BACKUP_PATH">>~/.bash_profile
echo "alias pg_probackup='pg_probackup-12'">>~/.bash_profile
プロファイルをロードします
. .bash_profile
4)srv_bkpで、バックアップディレクトリを初期化し、新しいインスタンスを追加します。
pg_probackup init
PostgreSQLインスタンスをディレクトリに追加し、名前をdb1にして、ssh接続パラメータ(ホスト、ユーザー名、およびPGDATAへのパス)を指定します。
pg_probackup add-instance --instance=db1 --remote-host=srv_db1 --remote-user=postgres --pgdata=/var/lib/pgsql/12/data
行が表示された場合
INFO: Instance 'db1' successfully inited
したがって、初期化は成功しました。
バックアップの保持に関するポリシーを定義しましょう。
pg_probackup set-config --instance db1 --retention-window=7 --retention-redundancy=2
結果のポリシーは次のように要約されます。
すべてのバックアップを7日未満に保つ
必要がありますが、完全バックアップの数は少なくとも2つである必要があります
。5)バックアップを作成するには、DBMSに接続する必要があるため、接続が行われるPostgreSQLクラスターにデータベースを作成します。バックアッププロセスを管理し(セキュリティの観点から、これは製品データベースに接続するよりも優れています)、データベースパラメータを変更します。
$ createdb backupdb
新しいデータベースに参加する
psql -d backupdb
バックアッププロセスが管理されるデータベースロールを作成します。
BEGIN;
CREATE ROLE backup WITH LOGIN REPLICATION password 'Strong_PWD';
GRANT USAGE ON SCHEMA pg_catalog TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup;
COMMIT;
listen_addressesパラメーターに注意してみましょう。
show listen_addresses;
localhostの場合は、*に変更します
alter system set listen_addresses='*';
listen_addressesを変更した場合は、PostgreSQLを再起動する必要があります。
pg_hba.confファイルがどこにあるか見てみましょう
psql –c 'show hba_file'
次のルールをpg_hba.confに追加します。
# pg_probackup access permission
host backupdb backup srv_bkp md5
host replication backup srv_bkp md5
構成を読み直します。
psql -c 'select pg_reload_conf()'
タイプミスがあったかどうかを確認します。
psql -c 'select * from pg_hba_file_rules'
srv_bkpのbackup_userユーザーのホームディレクトリに、サーバー名またはそのipアドレス、ポート、データベース名、ユーザー名、およびパスワードを書き込むファイルを作成します。このファイルは、バックアップコピーの作成時にパスワードが自動的に入力されるようにするために必要です。
echo "srv_db1:5432:replication:backup:Strong_PWD">>~/.pgpass
echo "srv_db1:5432:backupdb:backup:Strong_PWD">>~/.pgpass
このファイルに必要なアクセス権を設定します
chmod 600 ~/.pgpass
そして、最初のバックアップを作成します。
pg_probackup backup --instance=db1 -j2 --backup-mode=FULL --compress --stream --delete-expired --pguser=backup --pgdatabase=backupdb --remote-host=srv_db1 --remote-user=postgres
すべてを正しく実行すると、次のようなものが画面に表示されます。
INFO: Backup start, pg_probackup version: 2.4.2, instance: db1, backup ID: QFERC9, backup mode: FULL, wal mode: STREAM, remote: true, compress-algorithm: zlib, compress-level: 1
WARNING: This PostgreSQL instance was initialized without data block checksums. pg_probackup have no way to detect data block corruption without them. Reinitialize PGDATA with option '--data-checksums'.
INFO: PGDATA size: 3373MB
INFO: Start transferring data files
INFO: Data files are transferred, time elapsed: 1m:0s
INFO: wait for pg_stop_backup()
INFO: pg_stop backup() successfully executed
INFO: Syncing backup files to disk
INFO: Backup files are synced, time elapsed: 1s
INFO: Validating backup QFERC9
INFO: Backup QFERC9 data files are valid
INFO: Backup QFERC9 resident size: 975MB
INFO: Backup QFERC9 completed
INFO: Evaluate backups by retention
INFO: Backup QFERC9, mode: FULL, status: OK. Redundancy: 1/2, Time Window: 0d/7d. Active
INFO: There are no backups to merge by retention policy
INFO: There are no backups to delete by retention policy
INFO: There is no WAL to purge by retention policy
pg_probackupによって発行される警告に注意してください-チェックサムチェックはクラスターで有効になっていないため、データブロックの正確性をチェックできません。つまり、不良データブロックがバックアップに入らないという事実から保護されていません。
現在の設定を見てみましょう:
pg_probackup show-config --instance db1
次に、バックアップを作成するためのコマンドを短くしましょう。db1インスタンスの構成にいくつかのパラメーターを記述します。
pg_probackup set-config --instance=db1 --remote-host=srv_db1 --remote-user=postgres --pguser=backup --pgdatabase=backupdb --log-filename=backup_cron.log --log-level-file=log --log-directory=/home/backup_user/backup_db/log
比較してみましょう:それはどのようになり、どのようになりましたか
pg_probackup show-config --instance db1
| そうだった | になった |
|---|---|
| # Backup instance information
pgdata = /var/lib/pgsql/12/data system-identifier = 6863327140287059463 xlog-seg-size = 16777216 # Connection parameters pgdatabase = backup_user # Replica parameters replica-timeout = 5min # Archive parameters archive-timeout = 5min # Logging parameters log-level-console = INFO log-level-file = OFF log-filename = pg_probackup.log log-rotation-size = 0TB log-rotation-age = 0d # Retention parameters retention-redundancy = 2 retention-window = 7 wal-depth = 0 # Compression parameters compress-algorithm = none compress-level = 1 # Remote access parameters remote-proto = ssh |
# Backup instance information
pgdata = /var/lib/pgsql/12/data system-identifier = 6863327140287059463 xlog-seg-size = 16777216 # Connection parameters pgdatabase = backupdb pghost = srv_db1 pguser = backup # Replica parameters replica-timeout = 5min # Archive parameters archive-timeout = 5min # Logging parameters log-level-console = INFO log-level-file = LOG log-filename = backup_cron.log log-directory = /home/backup_user/backup_db/log log-rotation-size = 0TB log-rotation-age = 0d # Retention parameters retention-redundancy = 2 retention-window = 7 wal-depth = 0 #圧縮パラメーター compress-algorithm = none compress-level = 1 #リモートアクセスパラメーター remote-proto = ssh remote-host = srv_db1 remote-user = postgres |
構成で設定されたパラメーターを指定せずに、DELTAモードでインクリメンタルコピーを作成しましょう。
pg_probackup backup --instance=db1 -j2 --progress -b DELTA --compress --stream --delete-expired
私たちが得たものを見てみましょう
BACKUP INSTANCE 'db1'
=====================================================================================================================================
Instance Version ID Recovery Time Mode WAL Mode TLI Time Data WAL Zratio Start LSN Stop LSN Status
=====================================================================================================================================
db1 12 QFERKZ 2020-08-21 05:55:52-04 DELTA STREAM 1/1 9s 136kB 32MB 1.00 0/B0000028 0/B0000168 OK
db1 12 QFERC9 2020-08-21 05:51:34-04 FULL STREAM 1/0 1m:3s 959MB 16MB 3.52 0/AE000028 0/AE0001A0 OK
多くの情報がありますが、詳細な説明はドキュメントにありますが、いくつかの点について詳しく見ていきましょう:
回復時間-このバックアップ
モードを使用して回復できる最小時間-コピーが作成されたモード、現在4つが利用可能ですモード-1つのフル(FULL)および3つのインクリメンタル(PAGE、DELTA、およびPTRACK)
WALモード-ここでは次のオプションが可能です-STREAMおよびARCHIVE。 STREAMモードで作成されたコピーには、一貫したWAL状態への回復に必要なすべてのファイルが含まれています。このモードが機能するためには、バックアップユーザーにREPLICATIONロールを与える必要がありました。 ARCHIVEモードでは、WALアーカイブが構成されていることを前提としています。その後、必要なWALファイルがpg_probackupに認識されているパスに配置されます。
ステータス-ステータスはたくさんあり、それらはすべてドキュメントに記載されていますが、OKとは異なるものが見つかった場合は、ドキュメントにアクセスして何が問題だったかを確認するのが理にかなっています。
ご想像のとおり、pg_probackup showコマンドの出力を解析して、最後に作成されたバックアップのステータスを取得し、処理して監視システムに送信できます。ここで、DBMSを担当する従業員の通知をトリガーするルールを設定できます。
バックアップを開始し、結果を監視システムに送信するbkp_base.shスクリプトを作成しましょう。
#! /bin/sh
#
. /home/backup_user/.bash_profile
# , (FULL, DELTA ..)
pg_probackup backup --instance=db1 -j 2 --progress -b $1 --compress --stream --delete-expired
# zabbix.
if [ "$(pg_probackup show --instance=db1 --format=json | jq -c '.[].backups[0].status')" == '"OK"' ]; then
result=0;
else
result=1;
fi
# zabbix zabbix_trapper pg.db_backup
# , , , .
/opt/zabbix/bin/zabbix_sender -c /opt/zabbix/etc/pg.zabbix_agentd.conf -k pg.db_backup -o $result
結果のスクリプトへの呼び出しをcrontabで記述します。たとえば、次のスケジュールを設定できます。
00 01 * * 7 /home/backup_user/scr/bkp_base.sh FULL
00 01 * * 1,2,3,4,5,6 /home/backup_user/scr/bkp_base.sh DELTA
これで最初のタスクの解決策が完了しました。バックアップを構成し、コピー保持ポリシーを定義しました。また、バックアップのステータスを監視システムに送信します。
では、次の部分は、我々はWALファイルのアーカイブを作成し、アーカイブのバックアップを作成するを見ていきます。