pgbackrest を使用した postgresql の増分バックアップ - 開発者による若い戦士のためのコース

免責事項

私は開発者です。 私はコードを作成し、ユーザーとしてのみデータベースと対話します。 私は決してシステム管理者のふりをしているわけではなく、ましてや dba のふりをしているわけではありません。 しかし…

たまたま、postgresql データベースのバックアップを整理する必要がありました。 クラウドは使用しません。SSH を使用するだけで、お金を要求せずにすべてが機能することを確認できます。 このような場合はどうすればよいでしょうか? そうです、私たちは pgdump を cron にプッシュし、毎日すべてをアーカイブにバックアップし、完全に失われた場合は、このアーカイブをどこか遠くに送ります。

今回の問題は、計画によれば、データベースが 100 日あたり約 +- XNUMX MB 増加することになっていたことでした。 もちろん、数週間後には、pgdump ですべてをバックアップしたいという欲求は消えます。 ここで増分バックアップが役に立ちます。

面白い? 猫さんへようこそ。

増分バックアップは、すべてのソース ファイルがコピーされるのではなく、新しいファイルと、前のコピーの作成以降に変更されたファイルのみがコピーされるバックアップのタイプです。

(当時は) postgres の複雑さをまったく理解する気のなかった開発者と同じように、私も緑色のボタンを見つけたかったのです。 そうですね、AWS や DigitalOcean のように、XNUMX つのボタンを押すとレプリケーションが実行され、XNUMX つ目のボタンを押すとバック​​アップが設定され、XNUMX つ目のボタンを押すとすべてが数時間ロールバックされます。 ボタンや美しい GUI ツールは見つかりませんでした。 ご存知の場合は (無料または格安)、コメントに書いてください。

グーグルで検索したところ、XNUMXつのツールが見つかりました ペグバーマン и pg背もたれ。 最初のものでは単に成功しませんでした (ドキュメントが非常に乏しく、古いマニュアルに従ってすべてを理解しようとしました)。XNUMX 番目のものでは、ドキュメントは同等であることがわかりましたが、欠陥がないわけではありません。 同様のタスクに直面している人々の作業を簡素化するために、この記事が書かれました。

この記事を読むと、増分バックアップを作成し、それをリモート サーバー (バックアップのあるリポジトリ) に保存し、メイン サーバーでデータ損失やその他の問題が発生した場合に復元する方法がわかります。

訓練

マニュアルを再現するには 11 つの VPS が必要です。 XNUMX つ目はストレージ (バックアップが保存されるリポジトリ) で、XNUMX つ目は実際には postgres (私の場合は postgres のバージョン XNUMX) を備えたサーバー自体です。

postgres を含むサーバーには root、sudo ユーザー、postgres ユーザーが存在し、postgres 自体がインストールされている (postgres ユーザーは postgresql のインストール時に自動的に作成されます)、リポジトリ サーバーには root と sudo ユーザーが存在すると想定されます (マニュアル)ユーザー名 pgbackrest が使用されます)。

説明を再現するときに問題が少なくなるように、斜体で書きます どこで、どのユーザーで、どの権限でコマンドを実行したか 記事を書きながらチェックしながら。

pgbackrest の取り付け

リポジトリ (ユーザー pgbackrest):

1. pgbackrest からアーカイブをダウンロードし、その内容を /build フォルダーに転送します。

sudo mkdir /build
sudo wget -q -O - 
       https://github.com/pgbackrest/pgbackrest/archive/release/2.18.tar.gz | 
       sudo tar zx -C /build

2. アセンブリに必要な依存関係をインストールします。

sudo apt-get update
sudo apt-get install build-essential libssl-dev libxml2-dev libperl-dev zlib1g-dev 
       libpq-dev

3. pgbackrest の組み立て:

cd /build/pgbackrest-release-2.18/src && sudo ./configure
sudo make -s -C /build/pgbackrest-release-2.18/src

4. 実行可能ファイルを /usr/bin ディレクトリにコピーします。

sudo cp /build/pgbackrest-release-2.18/src/pgbackrest /usr/bin
sudo chmod 755 /usr/bin/pgbackrest

5. Pgbackrest には Perl が必要です。 インストール:

sudo apt-get install perl

6. ログ用のディレクトリを作成し、ログに特定の権限を与えます。

sudo mkdir -p -m 770 /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo mkdir -p /etc/pgbackrest
sudo mkdir -p /etc/pgbackrest/conf.d
sudo touch /etc/pgbackrest/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest/pgbackrest.conf
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf

7. 以下を確認します。

pgbackrest version

Postgres サーバー (sudo ユーザーまたは root):

postgres を使用してサーバーに pgbackrest をインストールするプロセスは、リポジトリへのインストール プロセスと似ています (はい、pgbackrest は両方のサーバーにインストールする必要があります)。 ただし、6 番目の段落の XNUMX 番目と最後のコマンドは次のとおりです。

sudo chown pgbackrest:pgbackrest /var/log/pgbackrest
sudo chown pgbackrest:pgbackrest /etc/pgbackrest/pgbackrest.conf

と置換する:

sudo chown postgres:postgres /var/log/pgbackrest
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf

パスワードなしの SSH を介したサーバー間の対話の設定

pgbackrest が正しく動作するには、キー ファイルを使用して postgres サーバーとリポジトリ間の対話を設定する必要があります。

リポジトリ (ユーザー pgbackrest):

キーペアを作成します。

mkdir -m 750 /home/pgbackrest/.ssh
ssh-keygen -f /home/pgbackrest/.ssh/id_rsa 
       -t rsa -b 4096 -N ""

警告! 上記のコマンドは sudo を使用せずに実行します。

Postgres サーバー (sudo ユーザーまたは root):

キーペアを作成します。

sudo -u postgres mkdir -m 750 -p /var/lib/postgresql/.ssh
sudo -u postgres ssh-keygen -f /var/lib/postgresql/.ssh/id_rsa 
       -t rsa -b 4096 -N ""

リポジトリ (sudo ユーザー):

postgres サーバーの公開キーをリポジトリ サーバーにコピーします。

(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && 
       echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && 
       sudo ssh root@<postgres_server_ip> cat /var/lib/postgresql/.ssh/id_rsa.pub) | 
       sudo -u pgbackrest tee -a /home/pgbackrest/.ssh/authorized_keys

このステップでは、root ユーザーのパスワードの入力を求められます。 postgresサーバーのrootユーザーのパスワードを入力する必要があります。

Postgres サーバー (sudo ユーザー):

リポジトリの公開キーを postgres を使用してサーバーにコピーします。

(echo -n 'no-agent-forwarding,no-X11-forwarding,no-port-forwarding,' && 
       echo -n 'command="/usr/bin/pgbackrest ${SSH_ORIGINAL_COMMAND#* }" ' && 
       sudo ssh root@<repository_server_ip> cat /home/pgbackrest/.ssh/id_rsa.pub) | 
       sudo -u postgres tee -a /var/lib/postgresql/.ssh/authorized_keys

このステップでは、root ユーザーのパスワードの入力を求められます。 リポジトリの root ユーザーのパスワードを正確に入力する必要があります。

私たちはチェックします:

リポジトリ (実験を純粋に行うため、root ユーザー):

sudo -u pgbackrest ssh postgres@<postgres_server_ip>

Postgres サーバー (純粋な実験のため、root ユーザー):

sudo -u postgres ssh pgbackrest@<repository_server_ip>

問題なくアクセスできることを確認します。

postgresサーバーのセットアップ

Postgres サーバー (sudo ユーザーまたは root):

1. 外部 IP からの postgres サーバーへのノックを許可しましょう。 これを行うには、ファイルを編集します postgresql.conf (/etc/postgresql/11/main フォルダーにあります)、次の行を追加します。

listen_addresses = '*'

そのような行がすでに存在する場合は、その行のコメントを解除するか、パラメーター値を「*」に設定します。

ファイル内 pg_hba.conf (フォルダ内にもあります) /etc/postgresql/11/main) 次の行を追加します。

hostssl  all  all  0.0.0.0/0  md5
host  all  all  0.0.0.0/0  md5

ここで:

hostssl/host - подключаемся через SSL (или нет)
all - разрешаем подключение ко всем базам
all - имя пользователя, которому разрешаем подключение (всем)
0.0.0.0/0 - маска сети с которой можно подключаться
md5 - способ шифрования пароля

2. 必要な設定を行いましょう postgresql.conf (フォルダの中にあります /etc/postgresql/11/main) pgbackrest が機能するようにするには:

archive_command = 'pgbackrest --stanza=main archive-push %p' # Где main - название кластера. При установке postgres автоматически создает кластер main.
archive_mode = on
max_wal_senders = 3
wal_level = replica

3. pgbackrest 構成ファイル (/etc/pgbackrest/pgbackrest.conf) で必要な設定を行いましょう。

[main]
pg1-path=/var/lib/postgresql/11/main

[global]
log-level-file=detail
repo1-host=<repository_server_ip>

4. postgresql をリロードします。

sudo service postgresql restart

リポジトリサーバーのセットアップ

リポジトリ (pgbackrest ユーザー):

設定ファイルに必要な設定を行ってみましょう pg背もたれ
(/etc/pgbackrest/pgbackrest.conf):

[main]
pg1-host=<postgres_server_ip>
pg1-path=/var/lib/postgresql/11/main

[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2 # Параметр, указывающий сколько хранить полных бэкапов. Т.е. если у вас есть два полных бэкапа и вы создаете третий, то самый старый бэкап будет удален. Можно произносить как "хранить не более двух бэкапов" - по аналогии с ротациями логов. Спасибо @Aytuar за исправление ошибки.
start-fast=y # Начинает резервное копирование немедленно, прочитать про этот параметр можно тут https://postgrespro.ru/docs/postgrespro/9.5/continuous-archiving

リポジトリの作成

リポジトリ (pgbackrest ユーザー):

クラスター用の新しいストレージを作成する メイン:

sudo mkdir -m 770 /var/lib/pgbackrest
sudo chown -R pgbackrest /var/lib/pgbackrest/
sudo -u pgbackrest pgbackrest --stanza=main stanza-create

Проверка

Postgres サーバー (sudo ユーザーまたは root):

postgres サーバーを確認します。

sudo -u postgres pgbackrest --stanza=main --log-level-console=info check

リポジトリ (pgbackrest ユーザー):

リポジトリ サーバーを確認します。

sudo -u pgbackrest pgbackrest --stanza=main --log-level-console=info check

出力に「check command end: completed completed success」という行が表示されていることを確認します。

疲れた? 最も興味深い部分に移りましょう。

バックアップの作成

リポジトリ (pgbackrest ユーザー):

1. バックアップを実行します。

sudo -u pgbackrest pgbackrest --stanza=main backup

2. バックアップが作成されていることを確認します。

ls /var/lib/pgbackrest/backup/main/

Pgbackrest は最初の完全バックアップを作成します。 必要に応じて、バックアップ コマンドを再度実行して、システムが増分バックアップを作成することを確認できます。

完全バックアップを再度作成する場合は、追加のフラグを指定します。

sudo -u pgbackrest pgbackrest --stanza=main --type=full backup

詳細なコンソール出力が必要な場合は、以下も指定します。

sudo -u pgbackrest pgbackrest --stanza=main --type=full --log-level-console=info backup

バックアップの復元

Postgres サーバー (sudo ユーザーまたは root):

1. 実行中のクラスターを停止します。

sudo pg_ctlcluster 11 main stop

2. バックアップからの復元:

sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta --recovery-option=recovery_target=immediate restore

データベースを最後の完全バックアップの状態に復元するには、recovery_target を指定せずに次のコマンドを使用します。

sudo -u postgres pgbackrest --stanza=main --log-level-console=info --delta restore

重要! リカバリ後、データベースがリカバリ モードでスタックする場合があります (エラー: 読み取り専用トランザクションでは DROP DATABASE を実行できません) のようなエラーが発生します。 正直に言うと、これが何に関係しているのかまだ理解できていません。 解決策は次のとおりです (コマンドの実行後、少し待つ必要があります)。

sudo -u postgres psql -c "select pg_wal_replay_resume()"

実際、特定のバックアップをその名前で復元することが可能です。 ここに私だけがいる ドキュメント内のこの機能の説明へのリンクを提供します。。 開発者は、このオプションを慎重に使用するようアドバイスし、その理由を説明しています。 使用したことを自分から追加できます。 本当に必要な場合は、リカバリ後にデータベースがリカバリ モードを終了していることを確認し (pg_is_in_recovery() を選択すると「f」が表示されるはずです)、念のためリカバリ後に完全バックアップを作成してください。

3. クラスターを開始します。

sudo pg_ctlcluster 11 main start

バックアップを復元した後、XNUMX 回目のバックアップを実行する必要があります。

リポジトリ (pgbackrest ユーザー):

sudo pgbackrest --stanza=main backup

それだけです。 最後に、私は決して上級 dba のふりをしようとしているわけではなく、わずかな機会にはクラウドを利用するつもりであることを思い出していただきたいと思います。 現在、私自身もバックアップ、レプリケーション、モニタリングなど、様々な勉強を始めています。 そして、コミュニティに少し貢献し、自分用の小さなチートシートを残すために、結果についての小さなレポートを書きます。

次の記事では、クリーンなクラスターへのデータ復元、バックアップの暗号化と S3 への公開、rsync によるバックアップなどの追加機能について説明します。

出所: habr.com

コメントを追加します