8

在副本集配置中使用 mongodb 时(1 个仲裁器,1 个主节点,2 个从节点);如何设置对辅助节点执行读取并将主节点仅用于写入的首选项?我将 MongoDb 2.0.4 与 Morphia 一起使用。我看到有一个 slaveOk() 方法,但我不确定它是如何工作的。

吗啡http://code.google.com/p/morphia/

详细信息 我的 Mongo 设置了以下选项:

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

我正在尝试使用以下内容(这可能是答案-btw):

数据存储 ds = getDatastore();
Query<MyEntity> 查询 = 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 回答