PHPでMongoDB レプリカセットにアクセスする

MongoDBのレプリカセットでいままでどうしても気になっていたことがありまして、
レプリカセットのマスタ・スレーブで障害が起こってマスタが入れ替わったとき。
PHPのアプリ側でどうやって判断したらよいのか悩ましく思っていました。

よくよくPHPのマニュアルをみたらちゃんと複数のサーバを記述する方法があるのですね。

http://php.net/manual/ja/mongo.connecting.rs.php

上記PHPマニュアルページから引用

<?php
// 複数のサーバーをシードリストとして使います (推奨)
$m = new MongoClient("mongodb://rs1.example.com:27017,rs2.example.com:27017/?replicaSet=myReplSetName");

// 単一のサーバーをシードリストとして使います
$m = new MongoClient("mongodb://rs1.example.com:27017", array("replicaSet" => "myReplSetName"));

// 複数のサーバーをシードリストとして使います
$m = new MongoClient("mongodb://rs1.example.com:27017,rs2.example.com:27017", array("replicaSet" => "myReplSetName"));
?>

とどのつまるところmongodbへ接続する際にサーバを二つ指定して接続するとあとはいいようにドライバで判断してくれるようでした。

優先読み込み設定

MongoClientのマニュアルを見ると
マスタとスレーブの読込優先度を設定することができるらしい。

何も設定を行わないとプライマリに設定されているサーバのみ読み込みを行います。

こんな感じで接続

$m = new MongoClient('mongodb://rs1.example.com,rs2.example.com', array(
    'replicaSet' => 'rs',
));
// スレーブを優先読み込み
$m->setReadPreference(MongoClient::RP_SECONDARY_PREFERRED, array());

PHPのマニュアルはこちら
http://www.php.net/manual/ja/class.mongoclient.php

とりあえずスレーブに読み込み優先させておけば書込はマスタへ、
読込はスレーブへという比較的簡単な付加分散と対障害対応ができそうです。