【pgBackRest 紹介】PostgreSQL のバックアップを取ってみよう

★★★ Live配信告知 ★★★
◆◇世界一わかりみの深いクラウドネイティブ on Azure◆◇
6/22(金) 12:00~ 第14回:世界一わかりみの深いAzure Bot Service 〜AIによるFAQチャットボット構築〜
今回はAzure Cognitive Service for LanguageというAzureのAIサービスを用いて、FAQチャットボットの構築方法についてわかりみ深く説明します。

こんにちは。サイオステクノロジーの橋本です。
今回は PostgreSQL のバックアップ管理ツールである pgBackRest を紹介します。

コミュニティページ : pgBackRest

pgBackRest は非常に多機能で細かい制御ができる反面、
設定項目が多い点と日本語ドキュメントが少ないため、導入のハードルが高いかもしれません。

今回は少し冗長ですが、機能や設定、扱い方を詳細に説明します。
最後まで読んでいただければ、インストール~バックアップ取得~リストアまでできるレベルで解説します。

〇目次〇
用語説明
できること、機能紹介
要件
今回の環境
インストール
 - PostgerSQL の設定
 - pgBackRestの設定
 - stanza の作成とチェック
バックアップ取得
バックアップの世代管理について
リポジトリのディレクトリ構造
リストアについて
pgBackRest の欠点

〇用語説明〇
pgBackRest では 2 つの用語があります。
本記事でもその用語を用いて説明を進めていきます。

・stanza (スタンザ)
 pgBackRest をインストールしたサーバが1台で複数台の Postgres サーバのバックアップ取得が可能です。
 また、それぞれの Postgres サーバごとに細かくバックアップ内容を変えることが可能です。
 Postgres サーバのバックアップ方法などを定義した内容を stanza といいます。
 *stanza は一区切りを示す単語で日本語だと節や回が近いニュアンスらしいです。

・リポジトリ
 ディレクトリ、オブジェクトストレージといったバックアップを保存する場所、
 WALセグメントをアーカイブする場所を合わせてリポジトリと言います。

・アーカイブ WAL
 pgbackrest の用語ではないですが、本記事ではarchive_commandで退避されたWAL ファイルを
 全てアーカイブ WAL と呼んでいます。

〇できること、機能紹介〇
pgBackRest は非常に高機能で細かい制御が可能です。
反面、パラメータが多いため設定の理解に時間がかかるかもしれません。

pgBackRest でできることを主なことは以下になります。
☆マークがついているものは、後程実際に検証します。

– 取得できるバックアップ種別
 ・完全バックアップ ☆
 ・増分バックアップ ☆
 ・差分バックアップ ☆

– 取得できるバックアップ
 ・リモートバックアップ ☆
 ・ローカルバックアップ
 ・アーカイブ WAL ファイル ☆
  *アーカイブされていない WAL ファイルはバックアップされません

– 機能 複数の PostgreSQL サーババックアップ ☆
 ・バックアップコンテンツの圧縮 ☆
  バックアップコンテンツそのものを gzip 圧縮します。
 ・バックアップコンテンツの並列圧縮 ☆
  複数コアを用いて並列的にファイル圧縮が可能です。
 ・バックアップの保持期限設定 (バックアップローテション) ☆
  それぞれのバックアップの保持期限や何世代保持するか設定が可能です。
 ・バックアップ整合性検証
  バックアップ最中にファイルのチェックサムの検証が可能です。
 ・バックアップの中断と再開
 ・デルタ復元
  DB の復元時、Postgresサーバに乗り込んでDBコンテンツを手動で削除する必要はないです。
 ・S3、Azure、およびGCS互換のオブジェクトストアのサポート
  Azure
  S3
  GCS

 ・リポジトリ(バックアップそのもの)の暗号化
 

〇要件〇
細かい要件は省略しますが、以下のポイントは特に気を付ける必要があります。

 pgBackRest サーバから PostgreSQL サーバに対しパスワードなしで SSH ログインできること
 PostgreSQL サーバから pgBackRest サーバに対しパスワードなしで SSH ログインできること
 PostgreSQL サーバにも pgBackRest がインストールされていること

SSH ログイン設定の話は、SSH の話なので今回は割愛します。
設定方法はコミュニティマニュアルを参考にしてください。

〇今回の環境〇
ここからは実際にコマンドや設定、バックアップの取得を例示します。
前提として今回は以下の環境で検証しました。

OS や kernel , Pgbackrest のバージョンは全サーバ共通です。

OS CentOS 7.7.1908
kernel kernel-3.10.0-1062.12.1.el7.x86_64
Pgbackrest pgbackrest-2.36-1.rhel7.x86_64

PostgerSQL サーバは以下の2つバージョンのサーバを用意しました。

PostgreSQL postgresql14-14.1-1PGDG.rhel7.x86_64
postgresql10-10.19-1PGDG.rhel7.x86_64
PGDATA /pgdb/data
PostgreSQL プロセスオーナー pg-user

また、前提として 1秒に 1レコード、現在時刻を挿入するスクリプトを実装しています。
これを PostgreSQL のリストア時に、いつの時点にリカバリができたか判断に利用します。

〇インストール〇
PostgreSQL のリポジトリで配布されています
そのため、以下の 2 コマンドでインストールが可能です。

– pgBackRestの設定

pgBackRest は非常に柔軟な設定が可能です。
主に 4 箇所で設定、指定が可能です。

1: デフォルト値
2: 設定ファイルの global セクション
3: 設定ファイルの各 stanza 内
4: コマンド実行時の付与するオプション

1 の設定が最も弱く、数字が大きい箇所の設定ほど優先 (上書き) されます。

・設定サンプル (/etc/pgbackrest.conf)

上記は設定例をサンプルに説明します。
server1 と server2 の 2 つのサーバのバックアップが設定されています。
pgbackrest の言葉で言うと stanza が 2 つあるわけです。

オプション log-level-file に着目して設定の優先度について説明します。
log-level-file はファイルに出力するログレベルを指定します。

デフォルト値は info です。
つまり設定ファイルに log-level-file がない場合は info レベルのログが出力されます。

上記例では global セクションに log-level-file の設定があります。
server2 の stanza では log-level-file の設定はないため、
global セクションの log-level-file 設定が引き継がれます。

対し、server1 の stanza では log-level-file は detail が指定されます。
そのため server1 では detail レベルのログが出力されるわけです。

コマンド実行時にもオプションを付与することができます。
そして、コマンド実行時に付与したオプションが最も優先されます。

究極的には設定ファイルは編集せず、
すべてコマンド実行時のオプションとして付与することでバックアップを取得することもできます。
しかし、コミュニティは基本的に設定ファイル内部で諸々設定することが推奨しています。

– PostgerSQL の設定
アーカイブされたログを保存するために以下のように設定します。
*<stanza name>は適宜変える必要があります

この設定により WAL ファイルをアーカイブする際リモートリポジトリにアーカイブしてくれます。

PostgreSQL は PITR するためには WAL ファイルとアーカイブ WAL が必要になります。
この設定をすることでアーカイブ WAL はリモートサーバである pg_backrest サーバに保管してくれます。

– pgBackRest の設定
pgBackRest サーバの設定
設定ファイル : /etc/pgbackrest.conf

server1 の設定
設定ファイル : /etc/pgbackrest.conf

server2 の設定
設定ファイル : /etc/pgbackrest.conf

– stanza の作成
デフォルトではコンソールには何も表示されません。

– 設定内容のチェック
以下のコマンドで設定に誤りがないかチェックできます。
PostgreSQL サーバおよび pgBackRest サーバで実行しましょう。

このコマンドもデフォルトでは何も表示されません。
ちょっと不安なので、もっとたくさんログを表示させてみましょう

コンソールに出力されるログレベルは warn ですが、
コマンド実行時に info レベルを指定することで詳細なログを出力させています。

successfully と出てくれたので安心感がありますね。

〇バックアップの取得〇
以下のコマンドを pgBackRest サーバで実行することでバックアップ取得が可能です。
pgbackrest –stanza=<stanza name> –type=full backup

ですが、初回なのでちょっと詳細にログを出力してみましょう。

server1、server2 ともに問題なくバックアップを取得できたみたいです。

取得したバックアップの内容は以下のコマンドで確認可能です
pgbackrest –stanza=<stanza name> info

〇バックアップの世代管理について〇

完全バックアップの取得ができたので差分バックアップを取得してみましょう

連続して2 回実行しました。バックアップを確認してみましょう。

しかし、どうも差分バックアップは 1回しかとられていないようです。

「/etc/pgbackrest.conf」内で「repo1-retention-diff = 1」と定義しているため、
1 世代しか保存せず、古い世代は自動で削除してくれたわけです。

なお、増分バックアップは –type=incr を指定することで取得可能です。

増分バックアップ、差分バックアップともに紐づいている完全バックアップが削除されたら、
併せて削除されます。pgbackrest 側で柔軟にやってくれるのはうれしいポイントです

〇リポジトリのディレクトリ構造〇
リポジトリの構造は以下のようになっています。
なお、通常運用する中ではバックアップされたコンテンツを直接見るケースはほとんどないと思います。

それぞれの stanza ごとにディレクトリを作ってくれるので、
それぞれのバックアップが混ざる心配はありません。

repo1-path
┣ archive
┃ ┗ <stanza name>
┃  ┗ アーカイブ WAL

┗ backup
 ┗ <stanza name>
  ┗ バックアップ

実際に中を見てみると gz 形式で圧縮されていることがわかります。

〇リストアについて〇
– 単純な PITR の実現

pgBackRest ではアーカイブ WAL は pgBackRest サーバに退避してくれますが、
そうでない再生中の WAL は管理外です。
そのため、PostgreSQL 標準のコマンド pg_switch_wal を用いて WAL ファイルを切り替えます。

少なくとも 16:02:08 まで復元ができるはずです。

疑似的に障害を発生させてみましょう。

リストアは以下のコマンドで行ないます。
pgbackrest –stanza=<stanza name> –delta restore

ポイントとしては 2 つあります。
1: PID ファイルの削除
 PID ファイルがあると pgBackRest は PostgreSQL 起動中と判断してしまいます。
 そのため、PostgreSQL が異常終了している場合などは PID ファイルを削除しましょう

2: –delta オプション
 このオプションを付与すると $PGDATA 配下の掃除を pgBackRest が勝手にやってくれます。
 rm $PGDATA を行うリスクがないので安心感があります。

リストアができたので、PostgreSQL を起動し、DB の中を覗いてみましょう

最後に取得したバックアップは 2021-12-07 15:25:28 に取得した増分バックアップです。
15:25:28 から 16:02:09 までの情報はアーカイブ WAL から復元をしてくれたわけです。

16:02:09 から 16:03:18 のデータは再生中の WAL ファイルに含まれているデータのため消失しています。

〇pgBackRest の欠点〇
再生中の WAL ファイルは退避してくれません。
例えば PostgreSQL の更新が少ない時間が続くと WAL のアーカイブはされません。
その状態でストレージ障害が発生すると PostgreSQL は数時間前までの状態にしかリストアできません。

システム要件によっては RPO(Recovery Point Objective) は XX 分以内とあるかもしれません。
この場合、PostgreSQL の更新が少ない時間帯は pg_switch_wal を定期的に実行するなどの工夫が必要になります。

 

いかがでしたでしょうか。
pg_backrest は細かい制御ができる反面、設定が複雑です (おまけに日本語ドキュメントが少ない!)。
ご参考になればと思いまうす。





ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!


ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

Be the first to comment

Leave a Reply

Your email address will not be published.


*