1

したがって、書き込みを処理するために個別のデータベースを使用するという考えが気に入っています(たとえば、2 つの書き込みデータベースがあり、それぞれが読み取り用に 3 つのレプリカを持つことができます)。

    $mongo = new   Mongo("mongodb://localhost:27017",array('connect'=>true,'timeout'=>2000, 'persist'=>'test_mongodb_con','replicaSet'=>true));

そしてテストする...

    $user = array('email'=>'test@test.com','firstname'=>'test','lastname'=>'user','twitter'=>'@test','time'=>date('m:i:s'));

    $mongo->test->testuser->insert($user);

    $cursor = $mongo->test->testuser->find()->slaveOkay(true);

しかし、slaveOkay が true の場合の唯一の違いは、フラグ キーの値が 4 であることですが、実際に使用しているデータベースはわかりません。mongod はすべてのレプリカを認識しているため、それらを別々のポートに配置することは重要ですか?

このトピックを何時間も検索しましたが、私の質問に完全に答えるものは見つかりません。私はphpドキュメント、mongoドキュメントなどを読みました...まだ混乱しています。

4

1 に答える 1

6

MongoDBのレプリケーションとシャーディングには違いがあります。

レプリケーションを使用している場合、書き込みを受信して​​いるノードは1つだけです。プライマリノードです。ドライバーはレプリカセットに接続し、すべての書き込みは、その時点で発生したノードに関係なく、単一のプライマリノードに送信されます。

MongoDBを使用して書き込みを複数のノードに分散する場合は、シャーディングを設定する必要があります。シャーディングを使用すると、ドライバーはルータープロセス(「mongos」)に接続し、クラスター内の正しいノードに書き込みを自動的にルーティングします。

レプリケーションは、耐久性、フェイルオーバー、バックアップ、および(場合によっては)読み取りスケーリングに使用されます。

デフォルトでは、すべての読み取りはプライマリノードにも送信されます。'slaveOK'フラグ(Read Preferenceを優先して非推奨になりました)により、読み取りをセカンダリノードに送ることができます。これにより、古いデータを読み取る可能性を犠牲にして、クエリの負荷をプライマリノードから分散させることができます。

SlaveOKフラグがないと、書き込んだばかりのデータを読み戻すことが保証されます(それ以降に他の誰かが変更した場合を除く)。SlaveOKフラグを使用すると、そのような保証はありません。セカンダリは、プライマリより数秒、数分、さらには数時間遅れる可能性があります。

MongoDBを使用して書き込みスケーリングを実行する場合は、シャーディングを設定する必要があります。

于 2012-08-30T20:24:11.940 に答える