ホーム > フラッグblog > ページ用コンテンツ > pgpool2によるPostgreSQLの冗長化テスト
Date 2011/04/13   ページ用コンテンツ

pgpool2によるPostgreSQLの冗長化テスト

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

でフロントとバックを入れ替えて起動してやると バック → フロント にデータがコピーされるのかもしれません。
その後また戻すとか。


そのへんの実験は今度やってみたいと思います。

 

この記事をシェアする

TOP

Flagsystem