結局hackしないとダメだった。
(ノ・・)ン。。。。。。(((●コロコロッ
前回の記事でmongodbをレプリケーションすることができた。
replicasets(レプリカセット)を有効にして実際に稼動している。
それではこれをアプリケーションサーバからアクセスするわけだが。
アプリケーションサーバはPHPだ。
PHPのmongodbモジュールであるPecl::mongoはver1.0.9からreplicasetオプションが追加されている。
http://www.php.net/manual/ja/mongo.construct.php
現在使用しているのは1.2.6なのでここはクリアしている。
フレームワークはfuelPHPを使っている。
ならばfuelPHPがreplica setsに対応していれば何の問題も無い。
ところがfuelPHP付属のMongo_DBはreplicaSetオプションに対応していない。
それどころかオプション項目はpersistent以外は使えないようだ。
(persistentオプションは1.2.0で削除されている)
fuel-mongo-odmというODMツールが対応しているっぽかったので試してみたが、
出来があまりよくなくて返ってハマる結果に。
https://github.com/philsturgeon/fuel-mongo-odm
ということで、
オリジナルがサポートするのを願いつつ、
Hackする方向で対応することにした。
[More:]
Hackする内容は一つだけ。
PECL::mongoにreplicaSetオプションを渡せるようにするだけ、
あとはconfigを書き換えれば自由に設定変更できる。
※2012/03/07追記
slaveサーバへのアクセスを許可するslaveOkの設定をする必要がありそうだ。
PECL::mongoのマニュアルにはないがソースコードにはあったので追加
/fuel/core/mongo/db.php 140行目付近
if ( ! empty($config['persistent']))
{
$options['persist'] = 'fuel_mongo_persist';
}
if ( ! empty($config['replicaSet']))
{
$options['replicaSet'] = $config['replicaSet'];
}
if ( ! empty($config['timeout']))
{
$options['timeout'] = $config['timeout'];
}
if ( ! empty($config['slaveOkay']))
{
$options['slaveOkay'] = $config['slaveOkay'];
}
$connection_string = "mongodb://";
configでは以下のような設定をする
replicaSetにはデータベース側で設定したレプリカセットの名前を使う。
/fuel/app/config/db.php
'mongo' => array(
// This group is used when no instance name has been provided.
'default' => array(
'hostname' => 'localhost',
'database' => 'test',
'replicaSet' => "repl",
'timeout' => 300,
'slaveOkay' => true,
),
),
---- 考察 ----
PECL::mongoの挙動を見るに難しい設定をしなくてもreplica setsを有効に使えるようだ。
マスターサーバを指定する必要がないのは素晴らしいなと思う。
これならば初回の接続でマスターサーバにコネクションが集中することがなさそうだ。
全アプリケーションサーバにarbiterOnlyのmongodbを設置しておくと、
最初の接続はローカルのDBという形を取れる。
その上で一番近いスレーブサーバにデータを取りに行き、
書き込みのときだけマスターに接続をするというのを自動的にやってくれる。
これならDBは3台もあれば十分対応できる。
timeoutは念のため設置した。
必要あるかどうかはまだわからないが、
デフォルトのタイムアウト時間が5秒なのでちょっと長いかと思った。
とりあえず300msで設定している。