pgpool-ii の設定。
ubuntuにpgpool-iiを入れる。postgresql-8.1はaptitude でインストールしている。pgpool-iiはapt出来ないので、自分でビルドした。
まず、pgpool の管理用データベースを作る。これがないと話にならないので真っ先に作る。
管理用データベースpgpoolにSCHEMAとTABLEを作る
#>createdb pgpool #>psql -f /usr/local/pgpool/share/sysytem_db.sql pgpool
dblinkが必要なので aptitudeから contribを入れた
/usr/lib/postgresql/8.1/lib/dblink.so /usr/share/postgresql/8.1/contrib/dblink.sql
があることを確認してデータベースpgpoolに対して実行
#>psql -p 5432 -f dblink.sql pgpool CREATE FUNCTION CREATE FUNCTION ... CREATE TYPE CREATE FUNCTION ...
なんかいっぱいFUNCTIONが出来た。
/usr/local/pgpool/etc/pgpool.conf を書き換える。 Debianの設定にする。(ubuntuはDebian)
# Unix domain socket path. (The Debian package defaults to # /var/run/postgresql.) socket_dir = '/var/run/postgresql' # Unix domain socket path for pgpool communication manager. # (Debian package default to /var/run/postgresql) pcp_socket_dir = '/var/run/postgresql' # Unix domain socket path for the backend. Debian package default to /var/run/postgresql! backend_socket_dir = '/var/run/postgresql'
pgpool が使うシステムデータベースを設定。system_db_user='postgres'を確認しつつ、レプリケーションデータベースを指定する。管理用データベースはすでに作成済み
# system DB info system_db_hostname = 'localhost' system_db_port = 5432 system_db_dbname = 'pgpool' system_db_schema = 'pgpool_catalog' system_db_user = 'postgres' system_db_password = '' # backend_hostname, backend_port, backend_weight # here are examples
pgpoolの認証ユーザーを決めてやる
/usr/local/pgpool/etc/pcp.conf
# USERID:MD5PASSWD pgpool:ba777e4c2f15c11ea8ac3be7e0440aa0 postgres:e8a48653851e28c69d0506508fb27fc5
pgpool-II を起動する
#>sudo /usr/local/bin/pgpool -n &
ココまでで、接続をテストする。(コネクションプーリング機能のみ)
#>psql -p 9999 -U postgres
次に、レプリケーションするので、replication_modeを書き換える
# Replication mode replication_mode = true
レプリケーションするpostmasterを設定する。
#DB1 backend_hostname0 = '' #Unixドメインソケットで通信する backend_port0 = 5433 #ポートは5433 backend_weight0 = 1 #値の大きい方が優先度が高い #DB2 backend_hostname1 = '' backend_port1 = 5433 backend_weight1 = 1
レプリケーションするpostmasterを立ち上げる。同一マシン内で複数Postmasterを起動する
pgpoolが動いているシステムpostgresとは別に、レプリケーションのテスト用にPostmasterを二つ立ち上げる
#>/usr/lib/postgresql/8.1/bin/postmaster -p 5433 -D /home/pgpool/db/psql-01 #>/usr/lib/postgresql/8.1/bin/postmaster -p 5433 -D /home/pgpool/db/psql-02
それぞれのPostmasterのユーザーと、データベースを設定する。
#>createuser ** #>createdb
pgpoolを再起動する
#>sudo pgpool stop #>sudo pgpool -n &
作成済みデータベースへ接続してみる
#> psql -p 9999 test
レプリケーションを体験するためのデータベースを作る
#>createdb repli -p 9999
レプリケーションを体験する
#>psql -p 9999 &>CREATE TABLE test1( i, integer ); &>INSERT INTO test1 VALUES( 1 ); &>\q
レプリケーション出来てるか確認する
#>psql -p 5433 &>SELECT * FROM test1;
おおおお出来た。
フラッシュメモリでディスクアレイ
1GBのフラッシュメモリでRAID0を構成してスワップに使うとどれくらい早くなるんだろう。2GBのUSBフラッシュメモリが5000円程度で入手できる。Ubuntuのハイバネート機能を使うときにUSBフラッシュメモリに保存すると起動が瞬時になるんじゃないか?試してみたいモノだ。
RAMディスクやMemCacheも良いけど、DBのストレージをUSBフラッシュメモリに作るのも良いんじゃないか。これも試してみたいモノだ。
USBメモリでソフトウェアRAID組めたらいいのにな。ハードRAIDは絶対無理だろう(w
WEB+DB PressのPgpool-ii 紹介
本文では、postgresユーザーで実行と書いてあるが、サンプルコードや図は、pgpoolユーザーで実行してるようにも思える。http://pgpool.sraoss.jp/index.php?pgpool-II%2Fdocument のPPTによると、pgpoolでデモを行っている。どうやらpgpoolでテストした方が良さそうだ。
pgpool-iiがおもしろそう
pgpool-ii がおもしろそうなので、インストールを試みたけれど。ちょっと待って。pgpool-iiをインストしたってブログがあまり見あたらない。落とし穴いっぱいありそうで怖いなぁ。。。。引っかかる記事は発表しました的な記事ばっかり。だれかドツボにはまった記事とかあればいいんだけど。見あたらないなぁ。かといってpgpoolは安定していなさそうだしSlonyは規模大きすぎるし。ウーん
パラレルクエリはおもしろそうだ。pgpoolをカスケードして仮想postgresqlサーバーをレプリケーションさせるのもおもしろそうなのだが。
如何せん情報が。。。
とりあえず、ubuntuで動かしてみる。
postgresql8.1はubuntuのapt-getで用意したモノ。libpqやlibpq-fe.hの位置がバラバラだったので。参った
#>mkdir /usr/local/pgpool-ii #>tar zxvf pgpool-II-1.0.1.tar.gz #>cd pgpool-II-1.0.1 #>./configure --with-pgsql-lib-dir=/usr/lib/ --with-pgsql-includedir=/usr/include/postgresql/ --prefix=/usr/local/pgpool-ii #>make #>sudo make install
共有モジュールと、ヘッダファイルを指定してやる必要がある。これは、pgpoolがPostgresqlに問い合わせしたり、SQLを解釈したりするのに使ってるんだろうなぁ。
APCとZend Optimizerを同時に入れていた。
APCとZendOptimizerは同時に動かないはず。両方入れて、php.iniで設定外したはずが。そのまま。PHPが初回ロードはうまくいくが2回目から動かないのでおかしいなと思ってた。Apacheの設定を探した。よく考えたらキャッシュをうまくハンドル出来ないので2回目からエラーで落ちるわけだ。
ウノウラボを参考に、eAccelerator+Zend Optimizerにした。
参考 http://labs.unoh.net/2006/05/phpweb.html
インストールのために、使ったコマンド
#>tar jxvf eaccelerator-0.9.5.tar.bz2 #>cd eaccelerator-0.9.5/ #>phpize #>./configure --enable-eaccelerator=shared --with-php-config=/usr/bin/php-config #>make #>sudo make install
php.ini を編集
[eaccelerator] zend_extension="/usr/lib/php5/eaccelerator.so" eaccelerator.shm_size = "32" eaccelerator.cache_dir = "/var/tmp" eaccelerator.enable = "1" eaccelerator.optimizer = "1" eaccelerator.check_mtime = "1" eaccelerator.debug = "0" eaccelerator.filter = "" eaccelerator.shm_max = "0" eaccelerator.shm_ttl = "0" eaccelerator.shm_prune_period = "0" eaccelerator.shm_only = "0" eaccelerator.compress = "1" eaccelerator.compress_level = "9" eaccelerator.keys = "shm_and_disk" eaccelerator.sessions = "shm_and_disk" eaccelerator.content = "shm_and_disk" [Zend Optimizer]
so の場所は、php の extension_dir になる。
phpinfo(); pear config-show
とかでわかる。
キャッシュ用のtemporaryを用意してやる。permissionが書き込み可能なら別に何処で良いけど。
これが重要なのだけれど、Zend Optimzierの設定は eAcceleratorの後ろに書いてやる。なぜかこれをしないと動作しない。
あとで気づいたのだが、APCの設定の後に、eAccelerator その後に Zend Optimizerを書いたらなぜか動作した。APCとeAccleratorとZendが同時に動いてる。ちょっと気持ち悪い。これは、どういう動きになるんだろうな。キャッシュはどうなるなるんだろう。バイトコードキャッシュを複数使って早くなる?そんなわけないよなぁ。。。
Xcacheなるキャッシュもあるらしい。
PHPの高速化モジュールの動作はこんな感じ。
JSPがServletに変換され、Classにコンパイルされるように、PHPがバイトコードにコンパイルされ、コンパイル済みを実行する。それを早くするらしい。JavaでいうClassを作るわけだね。ロード済みファイルをメモリに常駐させて何度もロードせずに、アクセスを高速化するらしい。ApplicationScopeにあるJavaBeansみたいなもんかなぁ。javacがやってくれるような、ソースの最適化をして高速化を図る。ってのもあるようだ。
eAccelerator はロード済みファイルのメモリキャッシュ
バイトコードキャッシュはAPC
ZendOptimizerはソースの最適化
がそれぞれの特徴だったと思うけど、バイトコードキャッシュはどのモジュールでもやってるっぽいし。細かい動作はわからない。。。
Smarty入れてるならHTMLレンダリングのバイトコードキャッシュは効きそうだなぁ。
Class毎に分割してるなら、eAccerlarorが効きそうだ。
apache bench でベンチしたいけれど、実験してみたいアプリがない。
そのうち試そう。
ubuntuにinitdb
ubuntu のディレクトリ構造がイマイチつかめてない。postgresql をaptitude でインストールしたのだけれど。initdbは自動実行されてるので、initdbでデータベースディレクトリを作成する。initdbが行方不明。探してみたら、/usr/lib/postgresql/8.1/binにあった。このinitdbはどのaptパッケージについてきたモノなんだろう。。。。