サーバに障害が発生したときのために、レプリカサーバ(以前は障害対策サーバと呼んでいた)にデータをコピーして実際に障害が発生したらコピー時のデータを反映、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から起動、再起動、停止が問題なくできるようになった。
次は、ノードのステータスについて。
「稼働中。接続無し」となっているので、これをなんとかする。
別サーバ(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に変更しなくちゃならないとか・・・だったら告知しないといけないな。
というか変更しないとダメみたい。
このページを共有する