OSS Fan ~OSSでLinuxサーバ構築~

このエントリーをはてなブックマークに追加

PostgreSQL 9.3でPITR(Point In Time Recovery)を実行するためのWAL設定

カテゴリ:OSSセットアップ | ソフトウェア:PostgreSQL | タグ:
最終更新日:2020/12/31 | 公開日:2014/11/02

目次

概要

 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
ファイル名:/data/pgdata1/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
ファイル名:/data/pgdata1/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