2011-10-21 7 views
3

私が理解するのが苦労しているのは、現時点でのMongo構成を設定しているときに、現在2つのサーバーが仲裁人となっていることです。Mongo DBのレプリカセットを照会する場合

最初に私はマスターのレコードを作成しました。私は、セカンダリサーバ上で、私は

rs.slaveOk(); 

を設定するために必要なことがわかったモンゴのウェブサイトについてのSlave OKに読み込むと

error: { "$err" : "not master and slaveok=false", "code" : 13435 } 

:それを見つけることを試みたと私はのように見えたエラーを受けた後、二次に行ってきましたしかし、私はPHPをサーバーに照会するときにこれを行う理由を完全に理解していません。または私がポイントをすべて一緒に誤解している場合。しかし、これは読み取り負荷を分散するためには表示されません。..

$m = new Mongo("mongodb://localhost:27017", array("replicaSet" => "myReplSetName"));?> 

これは、マスターに接続します:基本的に

私は、サーバーのプールを持っている、と私はそのようなとして、それらに接続する上で計画していましたそうすれば、どのようにして両方のサーバーにまたがってクエリをすばやく作成できるように読み込み負荷を分散できますか?

ありがとうございました

+0

好奇心が強い:Doctrine MongoDBやSymfony2を使用していますか? –

答えて

10

これは、レプリカセットに接続するための適切な方法です。指定されたサーバーが稼働していると仮定すると、ドライバー接続はクラスター内の残りのサーバーを検出し、許可されたときに照会を指示し、フェイルオーバー・イベントを通じて「PRIMARY」指定に従います。ただし、この「シードリスト」に他のサーバーを追加することをお勧めします。そのため、「シード」サーバーの1つがダウンしても接続が成功することがあります。

読み取りの配布に関して...この動作は、実際にはドライバの裁量で行われます。しかし一般的に受け入れられているセマンティクスは次のようなものです:もしslaveOkの読み込みが要求されていれば、その読み込みクエリは利用可能な場合にはSECONDARYサーバに行きます。それが利用可能でない場合に限り、それはPRIMARYに行くでしょう。書き込みクエリは、もちろん、常にPRIMARYに移動します。

読み取り負荷の一部をPRIMARYシェアを持つための1つの提案は、あなたがslaveOkとしてクエリフラグ時にランダム化することである

- フラグにsee the discussion here

PHPでslaveOkとしてクエリは、あなたはいくつかの時にこのビットを設定することができます - 接続、データベース、コレクション、またはクラスタ - API details hereこれは前述のランダム化手法を実装するいくつかの可能な方法を提供します。たとえば、接続プールの接続の半分がslaveOkビットを設定していることを確認します。

希望に役立ちます!

+1

シードリストにアービタを置いてはいけません。https://jira.mongodb.org/browse/PHP-392を参照してください。 –

関連する問題