pgpool2によるPostgreSQL冗長化をやってみよう。
というわけで、現在のflagsystem.co.jpはBaserCMS + PostgresSQLでできているんですが、
これを勉強がてら冗長化してみようと思います。
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/view
wget ftp://ftp.sra.co.jp/pub/cmd/postgres/8.4.4/postgresql-8.4.4.tar.gz
tar -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=/etc
configureしようと思ったら怒られる。
どうも必要なパッケージがはいってないようなので、yumで一気に入れてしまいます。
yum -y install readline-devel zlib-devel
このへんはこちらを参考にしました。
http://www.kurobuti.com/blog/?p=2728
さて、インストールできたら起動スクリプトを書かないといけないんですが、
これはそもそもyumでいれたときに /etc/init.d/postgresql というのが出来ていますので
これをコピーして使います。
cp postgresql postgresql2
vi postgresql2
で、中身を変更
変更したのは以下のようなところ
2台目のportは5433でいきます。
PGPORT=5433
PGDATA=/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/data
postgres 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 = true
load_balance_mode = true
それから以下の#を外してバックエンド側のDBを指定します。
backend_hostname0 = 'localhost'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/data'
backend_hostname1 = 'localhost'
backend_port1 = 5433
backend_weight1 = 1
backend_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 basercms
psql 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
でフロントとバックを入れ替えて起動してやると バック → フロント にデータがコピーされるのかもしれません。
その後また戻すとか。
そのへんの実験は今度やってみたいと思います。
この記事をシェアする