1

PHP ドライバー 1.3.2 と mongodb 2.2 を使用して、readPreference を使用して、レプリカ セット内のセカンダリの 1 つに集計クエリを送信しようとしています。何を試しても、集計クエリはプライマリ サーバーで実行されます。

基本的な例:

$db = new \MongoClient('rs1.example:27017,rs2.example:27017,rs3.example:27017', array('replicaSet' => 'myRs') );
$db->setReadPreference( \MongoClient::RP_SECONDARY );
$results = $db->tracking->sessions->aggregate( array( ... ) );

有効MongoLogにして、次の結果を得ました。

集計方法は次を示します。REPLSET INFO: - connection: type: PRIMARY

代わりに find を使用すると、次のように表示されます。REPLSET INFO: - connection: type: SECONDARY

これはphpドライバーのバグですか?他の誰かがこれに遭遇しますか?Jiraのバグとして追加する前に、SOに投げると思いました。

4

1 に答える 1

1

PHP ドライバーを介したすべてのコマンド クエリは、現在、プライマリ サーバーに送信されます。これに関連する古いチケットがいくつかあります。これは、count コマンドをセカンダリに送信するリクエストに由来しますが、読み取り専用であることを確認するためにコマンドをホワイトリストと照合する必要があるという重要な変更でした。この修正を追跡する現在のチケットはPHP-535で、あなたがオープンした問題PHP-662にリンクしています。

すぐに回避策が必要な場合は、コレクションを直接呼び出しfind()て、通常は に引数として渡すのと同じ配列引数を渡すことができます。Kristina は、この JIRA コメントでこのソリューションを文書化しました。彼女はその例で使用しましたが、読み取り設定でも機能するはずです。$cmd$commandMongoDB::command()find()slaveOkay()

于 2013-01-16T01:19:08.730 に答える