fuelphpをmongodbのreplicasetsレプリケーションに対応する方法

PHP, フレームワーク, mongodb, NoSQL, fuelphp

08:59:52, by dozo Email , 128 words, 545 views   Japanese (JP)

del.icio.us
結局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で設定している。

Trackback address for this post:

http://hain.jp/htsrv/trackback.php/253

Comments, Trackbacks:

No Comments/Trackbacks for this post yet...

Leave a comment:

Your email address will not be displayed on this site.
Your URL will be displayed.

Allowed XHTML tags: <p, ul, ol, li, dl, dt, dd, address, blockquote, ins, del, span, bdo, br, em, strong, dfn, code, samp, kdb, var, cite, abbr, acronym, q, sub, sup, tt, i, b, big, small>
(Line breaks become <br />)
(Set cookies for name, email and url)
(Allow users to contact you through a message form (your email will NOT be displayed.))
This is a captcha-picture. It is used to prevent mass-access by robots.

Please enter the characters from the image above. (case insensitive)

powered by b2evolution

shinobi

Neighbors
Relative
Favorites

極論istの技術屋を始めて早幾年。 流れの速い業界の波にもまれながらも精一杯生きている様をとくとごらんあれ。

Archives
スポンサー

Latest bookmark
Search

Categories

Who's Online?
Misc
Syndicate this blog XML

Valid XHTML 1.0! Valid CSS! Valid RSS 2.0! Valid Atom 1.0!