## レプリカセット

レプリカセットに接続するには、セットに属するサーバーをひとつ以上指定して、 さらに replicaSet オプションを使います。 複数のサーバーを指定するときには、カンマで区切ります。

例1 レプリカセットのシードリスト

`<?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"));
?>`

PHP ドライバは、指定したサーバー群に問い合わせてどれがプライマリなのかを調べます。 リストにあげたサーバーのうち少なくともひとつに接続でき、 プライマリが見つかってさえいれば接続が成功したとみなされます。 どのサーバーにも接続できない、あるいはプライマリが見つからないといった場合は MongoConnectionException がスローされます。

ヒント

レプリカセットのシードリストは、常に複数のメンバーに適用しなければいけません。 高可用性を確保するには、データセンターごとに少なくとも一つシードを用意すべきです。

警告

シードリスとで指定したホスト名は、レプリカセットの設定で指定した名前と 必ず 一致しなければいけません。 ドライバは、レプリカセットの設定で指定したホスト名だけを使って、 持続的接続用のハッシュを作るからです。

シードリストでは IP アドレスを使い、レプリカセットの設定にはホスト名を使っていたとすると、 レプリカセットの報告するホスト名と違うシードリスト接続はすべて破棄します。 事実上、これらのシードリスト接続は、リクエストのたびに作り直されることになり、 持続的接続の利点を大きく損ねてしまいます。

警告

異なるレプリカセットに同じ名前で接続することはできません。 これは単一のスクリプト内だけの話ではないので、個々のレプリカセットにはそれぞれ別の名前をつけておくようにしましょう。 これはつまり、次のようなことはできないということです。

例2 レプリカセット名の重複

`<?php
$m = new MongoClient("mongodb://devserver1,devserver2,devserver3/?replicaSet=repset");
$m = new MongoClient("mongodb://prodserver1,prodserver2,prodserver3/?replicaSet=repset");
?>`

それぞれ、別の名前をつかる必要があります。

例3 異なるレプリカセットの正しい使いかた

`<?php
$m = new MongoClient("mongodb://devserver1,devserver2,devserver3/?replicaSet=devset");
$m = new MongoClient("mongodb://prodserver1,prodserver2,prodserver3/?replicaSet=prodset");
?>`

プライマリが使えなくなったときに、セカンダリがプライマリになるには数秒かかります。 その間は、この接続では一切のデータベース操作ができなくなります (セカンダリに接続して読み込みを行うことは可能です)。 したがって、この間 (» 20-60 秒) に何らかの読み書き操作をすると例外が発生します。 セカンダリへの接続は可能で、読み込みはできます。

> 注意:

> デフォルトの 優先読み込み では、プライマリからだけ読み込みます。サーバーを選択するときにプライマリが見つからなければ、 その読み込みは失敗します。

> 読み込みについて高可用性が要求されるアプリケーションでは、優先読み込み設定を `MongoClient::RP_PRIMARY_PREFERRED` にしておくことをおすすめします。 これは、プライマリが使えない場合にだけセカンダリからの読み込みを実行する設定です。

新しいプライマリが選ばれると、読み込みや書き込みの操作時にドライバが新しいプライマリを検出できるようになります。 そして、ドライバがデータベース接続を切り替えて通常の操作を続行できるようになります。

セカンダリの health や state のチェックは 5 秒おきに行うか (mongo.ping_interval で変更可能)、あるいは 5 秒以上経過した後の次の操作のときに行います。 ドライバからサーバーに到達できない問題が発生したときにも設定を再チェックします。

レプリカセットのフェイルオーバーは 60 秒おきにチェックします (mongo.is_master_interval で変更可能)。また、確認付き書き込みを利用している際に書き込みに失敗したときにもフェイルオーバーします。

警告

セカンダリのデータはプライマリに比べて古くなっている可能性があります。 `MongoClient::RP_PRIMARY` 以外の優先読み込みを選ぶ場合は、 最新ではないデータでもアプリケーション側で対応できるようにしておかないといけません。

レプリカセットについての詳細は、 » コアドキュメント を参照ください。

### 参考

- 優先読み込み
- Write Concerns

### 変更履歴

バージョン | 説明
--- | ---
1.0.9 | レプリカセットへの接続と自動フェイルオーバーに対応しました。