3

私が理解するのに苦労していることの 1 つは、現在の Mongo 構成をセットアップするときに、現在アービトレーターを備えた 2 つのサーバーがあることです。

まず、マスターにレコードを作成しました。セカンダリに行って見つけようとしたところ、次のようなエラーが発生していました。

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

Slave OKに関するmongoのWebサイトを読んだところ、セカンダリサーバーで設定する必要があることがわかりました

rs.slaveOk();

ただし、サーバーにクエリを実行するときにPHPでこれを行う理由を完全には理解していません。または、私がその点をすべて誤解している場合。

基本的に、サーバーのプールがあり、それらに接続することを計画していました。

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

これは次にマスターに接続します..しかし、これは読み取り負荷を分散するようには見えません..読み取り負荷を分散して両方のサーバーにまたがり、クエリを高速化するにはどうすればよいですか?

前もって感謝します

4

1 に答える 1

10

これは、レプリカ セットに接続するための受け入れ可能な方法です。指定されたサーバーが起動していると仮定すると、ドライバー接続はクラスター内の残りのサーバーを検出し、許可されている場合はそれらにクエリを送信し、フェイルオーバー イベントを通じて "PRIMARY" の指定に従います。ただし、「シード」サーバーの 1 つがダウンしても接続が成功するように、この「シード リスト」に他のサーバーを追加することをお勧めします。

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

PRIMARYに読み取り負荷の一部を共有させるための1つの提案は、クエリにslaveOkとしてフラグを立てるときにランダム化することです-ここでの議論を参照してください

PHP でクエリを slaveOk としてフラグを立てるには、このビットをいくつかのレベル (接続、データベース、コレクション、またはクラスター) で設定できます -- API の詳細は こちら接続プール内の接続の半分に、slaveOk ビットが設定されていることを確認してください。

それが役立つことを願っています!

于 2011-10-21T19:49:33.190 に答える