pg_probackupに精通していること。最初の部分

画像



こんにちは、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ファイルのアーカイブを作成し、アーカイブのバックアップを作成するを見ていきます。



All Articles