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の設定にする。(ubuntuDebian)

# 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

pgpool-iiがおもしろそう

pgpool-ii がおもしろそうなので、インストールを試みたけれど。ちょっと待って。pgpool-iiをインストしたってブログがあまり見あたらない。落とし穴いっぱいありそうで怖いなぁ。。。。引っかかる記事は発表しました的な記事ばっかり。だれかドツボにはまった記事とかあればいいんだけど。見あたらないなぁ。かといってpgpoolは安定していなさそうだしSlonyは規模大きすぎるし。ウーん

パラレルクエリはおもしろそうだ。pgpoolをカスケードして仮想postgresqlサーバーをレプリケーションさせるのもおもしろそうなのだが。

如何せん情報が。。。

とりあえず、ubuntuで動かしてみる。

postgresql8.1はubuntuのapt-getで用意したモノ。libpqlibpq-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を解釈したりするのに使ってるんだろうなぁ。

configure: error: C++ preprocessor "/lib/cpp" fails sanity check

pgpool-IIを入れようとして、C++コンパイルできなくてはまる。C++コンパイラは入ってなかったのか

sudo aptitude install g++

で入れた。


デスクトップ用のubuntu日本語をサーバー用途に使うのはやっぱ無茶なのかな。デスクトップにつかうのには便利なんだけどねぇ。

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の高速化モジュールの動作はこんな感じ。

JSPServletに変換され、Classにコンパイルされるように、PHPバイトコードコンパイルされ、コンパイル済みを実行する。それを早くするらしい。JavaでいうClassを作るわけだね。ロード済みファイルをメモリに常駐させて何度もロードせずに、アクセスを高速化するらしい。ApplicationScopeにあるJavaBeansみたいなもんかなぁ。javacがやってくれるような、ソースの最適化をして高速化を図る。ってのもあるようだ。

eAccelerator はロード済みファイルのメモリキャッシュ
バイトコードキャッシュはAPC
ZendOptimizerはソースの最適化


がそれぞれの特徴だったと思うけど、バイトコードキャッシュはどのモジュールでもやってるっぽいし。細かい動作はわからない。。。


Smarty入れてるならHTMLレンダリングバイトコードキャッシュは効きそうだなぁ。
Class毎に分割してるなら、eAccerlarorが効きそうだ。

apache bench でベンチしたいけれど、実験してみたいアプリがない。

そのうち試そう。

ubuntuにinitdb

ubuntuディレクトリ構造がイマイチつかめてない。postgresqlaptitude でインストールしたのだけれど。initdbは自動実行されてるので、initdbでデータベースディレクトリを作成する。initdbが行方不明。探してみたら、/usr/lib/postgresql/8.1/binにあった。このinitdbはどのaptパッケージについてきたモノなんだろう。。。。