先日リリースされたFedora 19には、Linux-HA Japanで開発したPostgreSQLのストリーミングレプリケーションのクラスタリング機能がついに同梱されました。
Pacemaker のバージョンも開発版で比較的新しい 1.1.9 が同梱されているので、これを使ってPostgreSQLストリーミングレプリケーションのクラスタリングに挑戦してみたいと思います。
環境
今回、Fedoraのインストール手順方法は割愛しますが、以下の環境を用意してください。
※ 超スモール構成のため、商用での利用は推奨しません。信頼性を確保するには、Pacemaker用やレプリケーション用の専用LANを準備し、STONITHの導入を検討してください。

- ホスト名は、52-fe19 と 53-fe19 とします。 (単に私の手元の環境で使っているホスト名で、深い意味はありません。。。)
- 皆大好きなSELinuxやファイアウォールは無効にしておきます。
- 設定が複雑になるので、ネットワーク監視やディスク監視は行いません。
- 超スモール環境のためネットワークは2本で挑戦します。なお、よく悪者扱いされるNetworkManagerは停止し、IPは手動で設定してください。また、/etc/hostsにホスト名を定義するとトラブル可能性があるので定義しないでください。
- 1本目用途 : PostgreSQLへのアクセス用+Pacemaker通信用
- 52-fe19のIP 192.168.0.152
- 53-fe19のIP 192.168.0.153
- PostgreSQLアクセス用の仮想IP(vip-master) 192.168.0.252
- 2本目用途 : レプリケーション用 + Pacemaker通信用
- 52-fe19のIP 192.168.1.152
- 53-fe19のIP 192.168.1 .153
- レプリケーション用仮想IP(vip-rep) 192.168.1.252
インストール
両ノードに、yumを使って必要なパッケージを一気にインストールし、PostgreSQLのアーカイブディレクトリを作成しておきます。(両ノードで実行)
# yum install postgresql-server pacemaker corosync pcs
読み込んだプラグイン:langpacks, refresh-packagekit
(省略)
完了しました!
# su - postgres
$ mkdir /var/lib/pgsql/pg_archive
PostgreSQLの設定
PostgreSQLのデータベースクラスタを作成します。(52-fe19上で実行)
$ cd /var/lib/pgsql/data
$ initdb
データベースシステム内のファイルの所有者は"postgres"ユーザでした。
このユーザがサーバプロセスを所有しなければなりません。
(省略)
成功しました。以下を使用してデータベースサーバを起動することができます。
postmaster -D /var/lib/pgsql/data
または
pg_ctl -D /var/lib/pgsql/data -l logfile start
postgresql.conf ファイルに以下を設定します。その他の設定はデフォルトのままで構いません。なお、synchronous_standby_names パラメータが設定されている場合は、必ずコメントアウトして無効にしておいてください。(52-fe19上で設定)
listen_addresses = '*'
wal_level = hot_standby
synchronous_commit = on
archive_mode = on
archive_command = 'cp %p /var/lib/pgsql/pg_archive/%f'
max_wal_senders=5
wal_keep_segments = 32
hot_standby = on
restart_after_crash = off
replication_timeout = 5000
wal_receiver_status_interval = 2
max_standby_streaming_delay = -1
max_standby_archive_delay = -1
synchronous_commit = on
restart_after_crash = off
hot_standby_feedback = on
pg_hba.conf ファイルを設定します。(セキュリティは全く考慮していません) (52-fe19上で設定)
host all all 127.0.0.1/32 trust
host all all 192.168.0.0/16 trust
host replication all 192.168.0.0/16 trust
PostgreSQLを起動します。(52-fe19上で実行)
$ pg_ctl -D . start
サーバは起動中です。
53-fe19 にデータをコピーします。(53-fe19上で実行)
# su - postgres
$ pg_basebackup -h 192.168.0.152 -U postgres -D /var/lib/pgsql/data -X stream -P
手動でレプリケーション接続できるか試します。53-fe19に/var/lib/pgsql/data/recovery.confを作成します。
standby_mode = 'on'
primary_conninfo = 'host=192.168.1.152 port=5432 user=postgres'
restore_command = 'cp /var/lib/pgsql/pg_archive/%f %p'
recovery_target_timeline = 'latest'
53-fe19のPostgreSQLを起動します。(53-fe19上で実行)
$ pg_ctl -D /var/lib/pgsql/data/ start
52-fe19上で以下のSQLを使ってレプリケーションの状態を確認します。
$ psql -c "select client_addr,sync_state from pg_stat_replication;"
client_addr | sync_state
---------------+------------
192.168.1.153 | async
(1 行)
無事レプリケーション接続できました。では、一旦両ノードのPostgreSQLを停止します。(両ノードで実行)
$ pg_ctl -D /var/lib/pgsql/data stop
$ exit
Corosyncの設定
corosyncの設定ファイル/etc/corosync/corosync.confを用意します。(両ノードで作成)
quorum {
provider: corosync_votequorum
expected_votes: 2
}
aisexec {
user: root
group: root
}
service {
name: pacemaker
ver: 0
use_mgmtd: yes
}
totem {
version: 2
secauth: off
threads: 0
rrp_mode: active
clear_node_high_bit: yes
token: 4000
consensus: 10000
rrp_problem_count_timeout: 3000
interface {
ringnumber: 0
bindnetaddr: 192.168.0.0
mcastaddr: 226.94.1.1
mcastport: 5405
}
interface {
ringnumber: 1
bindnetaddr: 192.168.1.0
mcastaddr: 226.94.1.1
mcastport: 5405
}
}
logging {
fileline: on
to_syslog: yes
syslog_facility: local1
syslog_priority: info
debug: off
timestamp: on
}
Corosyncを起動します。(両ノードで実行)
# systemctl start corosync.service
/var/log/messages に以下のようなメッセージが出ればcorosyncの起動成功です。
[MAIN ] main.c:275 Completed service synchronization, ready to provide service.
ちなみに私の環境では、52-fe19でこのログが出続けていますが、原因はよくわかりません。。。とりあえず動いているようなのでこのまま先に進みます。(おぃ! )
Incrementing problem counter for seqid 2087 iface 192.168.0.152 to [1 of 10]
次はPacemkaerの起動・設定に入っていきます。