PostgreSQL 9.3でPITR(Point In Time Recovery)を実行するためのWAL設定
目次
概要
PostgreSQL 9.3でPITR(Point In Time Recovery)を実行するために必要な設定を行います。 以下の手順は「PostgreSQL 9.3のCentOS 6.5へのインストールと初期設定」に沿って PostgreSQL 9.3がインストールされた環境であることを前提としています。
PITRの特徴はデータベースのバックアップを取得した時点ではなく、データベースに障害が発生する直前の 状態まで復旧できるという点です。 PITRを実現するためには、データベースのバックアップが必要であることは当然ですが、 それに加えてバックアップ後にデータベースがどのように更新されたのかという履歴情報が必要となります。 PostgreSQLはデータベースの障害発生後、PITR実行時に、データベースのバックアップ(ベースバックアップ)に対して、 更新の履歴情報を参照しながらデータベースを更新していくことで障害直前の状態まで復旧します。
データベースに対する更新情報はWALファイルに記録されていますが、WALファイルは一定数に達すると 古いファイルから削除されてしまいます。 必要なデータベースの更新情報が削除されてしまうとデータベースを復旧できなくなってしまうので、 一定数に達して削除されるWALファイルをアーカイブして取っておく必要があります。 以下ではその設定について説明します。
なお、ベースバックアップには pg_basebackup コマンドを使用してオンラインバックアップを取得する 前提で設定を行います。
構成
想定環境
サーバ構成
OSバージョン
CentOS 6.5 x86_64
パッケージ一覧
postgresql93-9.3.4-1PGDG.rhel6.x86_64.rpm
postgresql93-libs-9.3.4-1PGDG.rhel6.x86_64.rpm
postgresql93-server-9.3.4-1PGDG.rhel6.x86_64.rpm
環境構築
インストール
PostgreSQLがインストールされ、稼働していれば、 特に追加でインストールするものはありません。
設定
アーカイブログ用ディレクトリの作成
まずはアーカイブログ用のディレクトリを作成します。
# cd / # mkdir -m 777 bkup # su - postgres -bash-4.1$ cd /bkup/ -bash-4.1$ mkdir -m 700 pgdata1 -bash-4.1$ cd pgdata1/ -bash-4.1$ mkdir -m 700 pg_arch
WALアーカイブ設定
WALの出力レベルとアーカイブモードを変更します。 PITR(Point In Time Recovery)を行うためにはWALの出力レベル(wal_level)を archive、またはhot_standbyに設定する必要があります。 デフォルトはminimalになっています。 また、古いWALはデフォルトでは捨てられてしまいますが、 リカバリの時に必要となる可能性があるため、 WALとは別のディレクトリに保管しておきます。 この古くなって別の場所に保管されたWALをアーカイブログと呼びます。
max_wal_senders パラメータはクライアントからの同時ストリーミング接続を受ける際の
最大接続数を指定します。
設定は2でも良いのですが、今後ストリーミングレプリケーションを行う際に1接続使用するため
予備として1接続足しておきます。
・バックアップの実行用
・トランザクションログのストリーミング用(pg_basebackupで -X s オプションを使用するため)
・ストリーミングレプリケーション用(PITRでは不要)
-bash-4.1$ cd /data/pgdata1/ -bash-4.1$ vi postgresql.conf
#wal_level = minimal # minimal, archive, or hot_standby
↓変更
wal_level = hot_standby # minimal, archive, or hot_standby
#archive_mode = off # allows archiving to be done
↓変更
archive_mode = on # allows archiving to be done
#archive_command = '' # command to use to archive a logfile segment
↓変更
archive_command = 'cp %p /bkup/pgdata1/pg_arch/%f' # command to use to archive a logfile segment
#max_wal_senders = 0 # max number of walsender processes
↓変更
max_wal_senders = 3 # max number of walsender processes
クライアント認証の設定
pg_basebackup コマンドを実行するためには pg_hba.conf ファイルに 明示的にレプリケーションの実行を許可する設定が必要となります。 設定せずに pg_basebackup を実行すると以下のようなエラーが出力されます。
pg_basebackup: サーバに接続できませんでした: FATAL: no pg_hba.conf entry for replication connection from host "[local]", user "postgres", SSL off
-bash-4.1$ cd /data/pgdata1/ -bash-4.1$ vi pg_hba.conf
local all postgres peer
local replication postgres peer ←追加
local all all md5
host all all 192.168.0.0/24 md5
インスタンス再起動
設定が完了したら、PostgreSQLを再起動して設定を反映させます。
-bash-4.1$ pg_ctl restart -m fast -w サーバ停止処理の完了を待っています....完了 サーバは停止しました サーバの起動完了を待っています....2014-11-02 13:34:26 JST [19010] LOG: redirecting log output to logging collector process 2014-11-02 13:34:26 JST [19010] HINT: Future log output will appear in directory "pg_log". 完了 サーバ起動完了
動作テスト
アーカイブモードを有効化するとワーカプロセスが1つ増えます。 増えたワーカプロセス(アーカイバプロセス)を確認します。
-bash-4.1$ ps -ef | grep postgres (前略) postgres 19010 1 0 13:34 pts/1 00:00:01 /usr/pgsql-9.3/bin/postgres postgres 19011 19010 0 13:34 ? 00:00:00 postgres: logger process postgres 19013 19010 0 13:34 ? 00:00:00 postgres: checkpointer process postgres 19014 19010 0 13:34 ? 00:00:00 postgres: writer process postgres 19015 19010 0 13:34 ? 00:00:00 postgres: wal writer process postgres 19016 19010 0 13:34 ? 00:00:01 postgres: autovacuum launcher process ↓ワーカプロセスが1つ増えた postgres 19017 19010 0 13:34 ? 00:00:00 postgres: archiver process postgres 19018 19010 0 13:34 ? 00:00:02 postgres: stats collector process (後略)
PostgreSQLを停止するタイミングでWALがアーカイブされます。 PostgreSQLを再起動してアーカイブログが生成されることを確認します。 以下は何度か再起動した後の状態を表示しています。
-bash-4.1$ pg_ctl restart -m fast -w
サーバ停止処理の完了を待っています....完了
サーバは停止しました
サーバの起動完了を待っています....2014-11-02 23:03:29 JST [21543] LOG: redirecting log output to logging collector process
2014-11-02 23:03:29 JST [21543] HINT: Future log output will appear in directory "pg_log".
完了
サーバ起動完了
-bash-4.1$ ls -l /data/pgdata1/pg_xlog/
合計 49160
-rw------- 1 postgres postgres 302 11月 2 12:02 2014 000000010000000000000007.00000028.backup
-rw------- 1 postgres postgres 16777216 11月 2 23:03 2014 000000010000000000000009
-rw------- 1 postgres postgres 16777216 11月 2 23:03 2014 00000001000000000000000A
-rw------- 1 postgres postgres 16777216 11月 2 13:34 2014 00000001000000000000000B
drwx------ 2 postgres postgres 4096 11月 2 23:03 2014 archive_status
-bash-4.1$ ls -l /bkup/pgdata1/pg_arch/
合計 114696
↓アーカイブログが生成された
-rw------- 1 postgres postgres 16777216 11月 2 11:54 2014 000000010000000000000003
-rw------- 1 postgres postgres 16777216 11月 2 11:54 2014 000000010000000000000004
-rw------- 1 postgres postgres 302 11月 2 11:54 2014 000000010000000000000004.00000028.backup
-rw------- 1 postgres postgres 16777216 11月 2 12:00 2014 000000010000000000000005
-rw------- 1 postgres postgres 16777216 11月 2 12:02 2014 000000010000000000000006
-rw------- 1 postgres postgres 16777216 11月 2 12:02 2014 000000010000000000000007
-rw------- 1 postgres postgres 302 11月 2 12:02 2014 000000010000000000000007.00000028.backup
-rw------- 1 postgres postgres 16777216 11月 2 13:34 2014 000000010000000000000008
-rw------- 1 postgres postgres 16777216 11月 2 23:03 2014 000000010000000000000009