PostgreSQL 9.1 - 同期レプリケーション: クイックスタート

sr_sync02.htmlに、より詳細な動作機構や新規に追加された関数、ツールの紹介がある。
sr_sync03.htmlに、障害対応に関する解説がある。

解説資料としては、 http://lets.postgresql.jp/documents/technical/replication/1 が詳しい。

(2012.10.30追記)以下の記述は書籍にまとめたので参照のこと。



なお、原稿のサンプルとして
仕組み設定を公開したので、参照のこと。



概要

同期レプリケーションの設定は非常に簡単である。非同期レプリケーションとの違いは二つのパラメータの設定だけである。

スレーブ側:primary_conninfo

recovery.confファイルのパラメータprimary_conninfoに、スレーブ自身の名を追加する。
例えばスレーブ名を"slave1"とするなら、次のようになる。

    primary_conninfo = 'host=master port=5432 application_name=slave1'

マスタ側:synchronous_standby_names

postgresql.confファイルの実行時パラメータsynchronous_standby_namesに、「同期レプリケーションするスレーブ名」を列挙する。接続するスレーブすべてに同期レプリケーションする場合は'*'を書く。

例えば、スレーブ名slave1とslave2を同期レプリケーションするには、次のように設定する。

    synchronous_standby_names = 'slave1,slave2'

詳細は後述するが、このように設定すると、slave1が同期レプリケーション、slave2は非同期レプリケーションで起動される。

構成

ここでは、以下に示す構成のシステムを構築する。

マスタ1台に対し、3台のスレーブを接続する。うちslave1とslave2は同期レプリケーション、slave3は非同期レプリケーションとする。
ただし、PostgreSQL ver9.1の同期レプリケーションはスレーブ1台のみ有効なので、 slave2はslave1が停止するまで"非同期レプリケーション"で稼働する。

話が前後するが、PostgreSQLは同期レプリケーションと非同期レプリケーションを混在できる。

マスタの設定

postgresql.conf

以下、マスタのpostgresql.confの設定例を示す。今回はアーカイブログを設定しない。アーカイブログの利用については http://lets.postgresql.jp/documents/technical/replication/1の「WALアーカイブをする場合」「WALアーカイブをしない場合」を参照のこと。

listen_addresses = '*'	# 適宜。

# archive か hot_standby。今回はHotStandbyと併用するので"hot_standby"
wal_level = hot_standby

# スレーブの最大数。ここでは3。
max_wal_senders = 3

# 同期レプリケーションするスレーブ。ここではslave1とslave2。詳細は後述。
synchronous_standby_names = 'slave1,slave2'
pg_hba.conf

スレーブからの接続のために、pg_hba.confに以下の行を追加する。 USERはスレーブの実行ユーザを指定する。ここではpostgres。

# TYPE  DATABASE        USER            CIDR-ADDRESS            METHOD
host    replication     postgres	192.168.1.0/24            trust
起動

スレーブの準備のためにマスタは起動しておく。

master> pg_ctl -D /usr/local/pgsql/data start

スレーブの設定

ベースバックアップの取得

マスタのベースバックアップをスレーブのサーバ上にコピーする。ここではver9.1でサポートされたpg_basebackupコマンドを利用する。

pg_basebackupはマスターサーバのwalsenderプロセスに接続し、全てのテーブルスペース以下のファイルと、指定されていれば最新のWALログファイルを転送する。

まず、slave1にログインし、以下のコマンドを実行する。

slave1> pg_basebackup -h master -p 5432 -D /usr/local/pgsql/data --xlog --progress --verbose

これで、サーバslave1上の/usr/local/pgsql/data以下にマスタのデータベースクラスタ以下がコピーされる。

同様にslave2、slave3でも同じコマンドを実行する。

slave2> pg_basebackup -h master -p 5432 -D /usr/local/pgsql/data --xlog --progress --verbose
slave3> pg_basebackup -h master -p 5432 -D /usr/local/pgsql/data --xlog --progress --verbose
recovery.confの設定と、起動

pg_basebackupコマンドでマスタのデータベースクラスタには、postgresql.confとpg_hba.confもコピーされている。適宜、パラメータ値を変更する。

次にrecovery.confを準備する。 PostgreSQLをインストールしたディレクトリにshareというサブディレクトリがあり、そこにサンプルファイルrecovery.conf.sampleがあるので、それをコピーして編集する。

slave1> cd /usr/local/pgsql/data
slave1> cp ../share/recovery.conf.sample recovery.conf

編集が必要な項目を示す。これはslave1の例である。slave2、slave3でも同様の編集を行うこと。

standby_mode = on

primary_conninfo = 'host=master port=5432 application_name=slave1' # スレーブ名をapplication_nameに設定
スレーブの起動

スレーブを起動する。

slave1> pg_ctl -D  /usr/local/pgsql/data start
slave2> pg_ctl -D  /usr/local/pgsql/data start
slave3> pg_ctl -D  /usr/local/pgsql/data start

動作確認

マスタ側で動作確認を行う。以下のVIEWを表示する。

master> psql sampledb
psql (9.1.0)
Type "help" for help.

sampledb=# SELECT application_name,state,sync_priority,sync_state
sampledb-#                                   FROM pg_stat_replication;
 application_name |   state   | sync_priority | sync_state 
------------------+-----------+---------------+------------
 slave1           | streaming |             1 | sync
 slave2           | streaming |             2 | potential
 slave3           | streaming |             0 | async
(3 rows)

slave1からslave3まで、3つのスレーブが接続されていることがわかる。

application_nameとsync_stateを簡単に説明する。

  • slave1: sync

slave1は同期レプリケーションしている。

  • slave2: potential

slave2は現時点では非同期レプリケーションだが、slave1がダウンすると同期レプリケーションに移行できる(potentialを持つ)。

  • slave3: async

slave3は非同期レプリケーションしている。