pgpool2によるPostgreSQL冗長化をやってみよう。というわけで、現在のflagsystem.co.jpはBaserCMS + PostgresSQLでできているんですが、これを勉強がてら冗長化してみようと思います。 といっても、サーバー2台も用意できないし、ローカル環境でPostgreSQLを2つ立ち上げて、なんちゃって冗長化で行きたいと思います。まず今入っているPostgreSQLのバージョンがわかんなかったので調べる方法PostgreSQLのバージョンを調べるには http://www.ksknet.net/postgresql/postgresql_2.htmlで調べたところ 8.4.4とのこと。現在のPostgreSQLはyumでいれているのでportは5432で入っているはず。yumでport変えてもう一個インストール出来ないかGoogle先生に尋ねてみたんですが、どうもダメそうだったのでもうひとつはソースから入れることにします。PostgreSQL8.4.4のソースはこちらからダウンロードhttp://www.postgresql.jp/PostgreSQL/8_4/8_4_4/viewwget ftp://ftp.sra.co.jp/pub/cmd/postgres/8.4.4/postgresql-8.4.4.tar.gztar -zxvf postgresql-8.4.4.tar.gzで展開。cd postgresql-8.4.4./configure --prefix=/usr/local/pgsql/ --bindir=/usr/bin/ --libdir=/usr/lib/pgsql --datarootdir=/usr/share/pgsql --sysconfdir=/etcconfigureしようと思ったら怒られる。どうも必要なパッケージがはいってないようなので、yumで一気に入れてしまいます。yum -y install readline-devel zlib-develこのへんはこちらを参考にしました。http://www.kurobuti.com/blog/?p=2728さて、インストールできたら起動スクリプトを書かないといけないんですが、これはそもそもyumでいれたときに /etc/init.d/postgresql というのが出来ていますのでこれをコピーして使います。cp postgresql postgresql2vi postgresql2で、中身を変更変更したのは以下のようなところ2台目のportは5433でいきます。PGPORT=5433PGDATA=/var/pgsql/db/PGLOG=/var/pgsql/db/pgstartup.logこれで/etc/init.d/postgresql2 startとやると、起動成功ps aux | grep postgresで確認してみるとpostgres 1196 0.0 0.4 90780 2512 ? S 15:43 0:00 /usr/bin/postmaster -p 5432 -D /var/lib/pgsql/datapostgres 31737 0.0 0.7 109832 3968 ? S 14:08 0:00 /usr/bin/postmaster -p 5433 -D /var/pgsql/db/おー。ちゃんと二つ立ち上がってます。インストール場所をちゃんと揃えてやるといいんでしょうけれど、まぁ仕方がない。次にpgpool2のインストールに移ります。どこもソースから入れることしか書いてなかったんですが、なんとかyumで入れれないかなーと思ったらありました。http://d.hatena.ne.jp/zebevogue/20090120/1232438315このとおりやるとあっさりインストール完了。vi /etc/pgpool-II/pgpool.confでconfファイルをいじります。このへんを参考に http://ghosd.blog48.fc2.com/blog-entry-14.html今回の目的は冗長化なのでreplication_mode = trueload_balance_mode = trueそれから以下の#を外してバックエンド側のDBを指定します。backend_hostname0 = 'localhost'backend_port0 = 5432backend_weight0 = 1backend_data_directory0 = '/var/lib/pgsql/data'backend_hostname1 = 'localhost'backend_port1 = 5433backend_weight1 = 1backend_data_directory1 = '/var/pgsql/db/'これで保存して/etc/init.d/pgpool startとやると起動しました。ここから実験開始です。pgpoolはポートを指定してやるだけの簡単仕様です。まずportの違うPostgreSQLをどう確認するかよく解ってなかったんですが、ググルと-pで指定してやれば良いとのことsu - postgresでポスグレユーザーになってpsql -lとやるとフロントのDBが確認でき、psql -l -p 5433とやるとバックエンドのDBが確認できます。これはおもしろい。pg_dump basercms > basercms.dumpでダンプしたファイルをcreatedb -p 5433 basercmspsql basercms < basercsm.dumpバックエンドのDBにレストア完了。次にBaserCMSの設定ファイルを書き換えます。BaserCMSはあまり詳しくないのでどこに設定ファイルがあるかわからなかったのですが、こういう時は全文検索find /var/www/html/ |xargs grep '5432'とすると、設定ファイルが見つかります。/var/www/html/app/config/database.phpの中身をpgpoolのポートである9999に変更'port' => '9999',念のため最後にもう一度/etc/init.d/pgpool restartで立ち上がることを確認して・・BaserCMSで管理画面から日記を更新してみると 2台のDBが両方更新されています。これはおもしろい。そのあとフロントのDBプロセスをkillしてやると見た目上何事もなかったかのように動いてますが、更新がバックエンドのDBのみになりました。その後フロントのDBをたちあげなおしただけじゃ切り戻してくれなかったので、pgpoolを再起動するとフロントのDB側で同期が取られて再度立ち上がりました。とゆーことは、実際に障害が起こった場合はdump → restoreでバックからフロントにコピーして再起動するかもしくは/etc/pgpool-II/pgpool.confでフロントとバックを入れ替えて起動してやると バック → フロント にデータがコピーされるのかもしれません。その後また戻すとか。そのへんの実験は今度やってみたいと思います。