8

レプリカセット構成でmongodbを使用する場合(アービター1つ、プライマリ1つ、スレーブ2つ)。セカンダリに対して読み取りが実行され、書き込み専用にプライマリを残す設定を設定するにはどうすればよいですか?私はMorphiaでMongoDb2.0.4を使用しています。slaveOk()メソッドがあるようですが、それがどのように機能するかはわかりません。

モルヒネhttp://code.google.com/p/morphia/

詳細 MyMongoには、次のオプションが設定されています。

mongo.slaveOk();
mongo.setWriteConcern(WriteConcern.SAFE);

私は次のものを使おうとしています(これは答え-btwかもしれません):

データストアds=getDatastore();
Query <MyEntity> query = ds.find(MyEntity.class).field( "entityId")。equal(entityId);
query.queryNonPrimary(); // ReadPrefererence.secondary()と同等に見えます
MyEntityエンティティ=query.get();
4

4 に答える 4

7

たくさんの血と汗をかいた後の正解は次のとおりです。

  • すべての読み取り/クエリがセカンダリにヒットすることを優先するには、slaveOk()のみを設定する必要があります
  • 選択した読み取りのみを優先するには、セカンダリを使用します。slaveOk()を設定せず、クエリごとに代わりにqueryNonPrimary(を使用します。

次のように、レプリカセットを使用する場合は、適切な書き込みの懸念事項を設定することもお勧めします。

mongo.setWriteConcern(WriteConcern.REPLICAS_SAFE);

于 2013-01-31T17:11:20.607 に答える
2

現在の方法(Javaドライバー2.8以降による)は

MongoOptions options = new MongoOptions();
options.setReadPreference(ReadPreference.secondaryPreferred());

それから

mongo = new com.mongodb.Mongo(Arrays.asList(address1, address2), options);

これにより、すべての接続でセカンダリの使用が優先されますが、セカンダリがダウンしているか、何らかの理由で使用できない場合は、プライマリをバックアップとして使用します。

于 2013-06-27T09:30:20.360 に答える
1

「SECONDARY」読み取り設定を使用する http://www.mongodb.org/display/DOCS/Read+Preferences+and+Tagging+in+The+Java+Driver

"SECONDARY:使用可能な場合はセカンダリノードから読み取り、それ以外の場合はエラー。"

于 2013-01-29T16:43:08.747 に答える
0

Javaドライバー3.6の場合、メソッドは次のようになります。

    MongoClientOptions l_opts =
            MongoClientOptions
            .builder()
            .readPreference( ReadPreference.secondary() )
            .build();

    ServerAddress l_addr = new ServerAddress( "localhost", 27017 );

    try
    (
            MongoClient l_conn = new MongoClient( l_addr, l_opts );
    )
    {
       ...
于 2018-02-01T06:39:52.033 に答える