How to prefer reads on secondaries in MongoDb

我是研究僧i 提交于 2019-12-12 08:54:13

问题


When using mongodb in a replica set configuration (1 arbiter, 1 primary, 2 slaves); how do I set a preference that read be performed against the secondaries and leave the primary only for writes? I'm using MongoDb 2.0.4 with Morphia. I see that there is a slaveOk() method, but I'm not sure how that works.

Morphia http://code.google.com/p/morphia/

Details My Mongo is set with the following options:

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

I am attempting to use the following (this may be answer -btw):

Datastore ds = getDatastore();
Query<MyEntity> query = ds.find(MyEntity.class).field("entityId").equal(entityId);
query.queryNonPrimary(); // appears equivalent to ReadPrefererence.secondary()
MyEntity entity = query.get();

回答1:


The correct answer, after much blood and sweat is as follows:

  • To prefer all reads / queries hit the secondaries, only slaveOk() need be set
  • To prefer only selected reads use secondaries, do not set slaveOk() and use queryNonPrimary() instead per query

It is also a good practice to set an appropriate write concern when using replica sets, like so:

mongo.setWriteConcern(WriteConcern.REPLICAS_SAFE);



回答2:


It seems that the current method (as per Java driver 2.8+) is to do

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

then

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

This will make all connections prefer using secondaries, but will use the primary as a backup if the secondary is down or unavailable for some reason.




回答3:


Use the "SECONDARY" read preference http://www.mongodb.org/display/DOCS/Read+Preferences+and+Tagging+in+The+Java+Driver

"SECONDARY : Read from a secondary node if available, otherwise error."




回答4:


For the Java driver 3.6 the method is now

    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 );
    )
    {
       ...


来源:https://stackoverflow.com/questions/14587398/how-to-prefer-reads-on-secondaries-in-mongodb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!