pgpoolを使ってDBをレプリケーションしてみよう

サーバに障害が発生したときのために、レプリカサーバ(以前は障害対策サーバと呼んでいた)にデータをコピーして実際に障害が発生したらコピー時のデータを反映、DNSの参照先を障害対策サーバに変更する・・・といった方法で行こうと思っていたが・・・

MySQLはrsyncコマンドで同期できそうだけど、postgresqlについては、僕の技術では手間がかかりすぎて面倒だということがわかった。それで、データはなるべく同期できるといいなーっていろいろネットで検索していたら、いくつか出てきた・・

1.postgresforest

初心者の僕にはちょっと難しい感じがしたので、パス。

2.pgcluster

ハイパースレッド環境でレプリケーションサーバが停止するらしい。
引用元:http://pgcluster.projects.postgresql.org/jp/index.html
なので、こっちもパス。

3.pgpool-ii

ネットで検索すると一番よくでてくる。
これにしよう。

というわけで、pgpool-iiをダウンロード。
http://pgfoundry.org/frs/download.php/2423/pgpool-II-2.2.5.tar.gz

展開。

# tar -zxvf pgpool-II-2.2.5.tar.gz

インストール。

# ./configure

・・・略

checking for strerror… yes
checking for strftime… yes
checking for strtok… yes
checking for asprintf… yes
checking for gai_strerror… yes
checking for hstrerror… yes
checking for pstat… no
checking for setproctitle… no
checking for pg_config… no
checking for PQexecPrepared in -lpq… no
configure: error: libpq is not installed or libpq is old

エラーが出た。
libpqがないとダメらしい。
なので、

# yum install postgres-devel

で、ライブラリをインストール後、再度挑戦。

# ./configure

・・・略

checking for strdup… yes
checking for strerror… yes
checking for strftime… yes
checking for strtok… yes
checking for asprintf… yes
checking for gai_strerror… yes
checking for hstrerror… yes
checking for pstat… no
checking for setproctitle… no
checking for pg_config… pg_config
checking for PQexecPrepared in -lpq… yes
checking for PQprepare… yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating parser/Makefile
config.status: creating pcp/Makefile
config.status: creating config.h
config.status: executing depfiles commands

エラーは出なくなったんで続きを。

# make
・・・略
# make install
・・・略

pgpool-iiの設定ファイルは「/usr/local/etc」以下に存在しているので、

# vi /usr/local/etc/pgpool.conf

listen_addresses = ‘localhost’
port = 9999
pcp_port = 9898
socket_dir = ‘/tmp’
pcp_socket_dir = ‘/tmp’
backend_socket_dir = ‘/tmp’
pcp_timeout = 10
num_init_children = 32
max_pool = 4
child_life_time = 300
connection_life_time = 0
child_max_connections = 0
client_idle_limit = 0
authentication_timeout = 60
logdir = ‘/tmp’
pid_file_name = ‘/var/run/pgpool/pgpool.pid’

ここらへんから、レプリケーション関係だろう・・

replication_mode = true
load_balance_mode = false
replication_stop_on_mismatch = false
replicate_select = false

これでいいんかな・・・
あとは、データベースサーバの設定。

backend_hostname0 = ‘192.168.100.252’ 複製先ノード
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = ‘/data’

まあ、こんなもんで、とりあえず動かしてみよう。

# phpool -n
で、エラーが出て起動しない。

2009-11-26 17:30:49 ERROR: pid 25520: could not open pid file as /var/run/pgpool/pgpool.pid. reason: No such file or directory

いつもどおりインターネットで検索すると、pgpoolを起動するときにpidファイルを作成するみたいで、パーミッションの問題でそれができないということらしい。

なので、例によって。

# mkdir /var/run/pgpool/
# chown apache pgpool

で、pgpooladminから起動、再起動、停止が問題なくできるようになった。
次は、ノードのステータスについて。
「稼働中。接続無し」となっているので、これをなんとかする。
Screenshot-pgpoolステータス - Mozilla Firefox 3 Beta 5

別サーバ(192.168.100.252)から、pgpoolへpsqlコマンドで接続。
# su – postgres
# psql -h 192.168.100.250 -p 9999 -l
とりあえず、中が見れたのでOK.

で、次は具体的にレプリケーションできるか見てみる。

pgpoolが動いているサーバ(192.168.100.250)で、
# createdb -p 9999 imamura
とすると、
192.168.100.250と
192.168.100.252の
2台のサーバに同じ「imamura」というdbが作成された。
なので、ひとまずOK.

「phpPgAdmin」からの操作によるレプリケーションはできるんだろうか。
疑問に思ったんでやってみたけど、ダメだったので、
phpPgAdminの設定を変更。

# vi /etc/phpPgAdmin/config.inc.php

で、

$conf[‘servers’][0][‘port’] = 9999;

に変更。
で、phpPgAdminからdb作成。
一応レプリケーションできた。
とりあえず今のところOK・・・

でも、これWEBアプリケーション上の変更も、レプリケーションできるんだろうか・・・

もしかして、postgresqlの接続ポートを9999に変更しなくちゃならないとか・・・だったら告知しないといけないな。
というか変更しないとダメみたい。

著者:bouya Imamura