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は非同期レプリケーションしている。