【问题标题】:reading data from specific nodes in mongo replica set从 mongo 副本集中的特定节点读取数据
【发布时间】:2016-03-30 00:40:10
【问题描述】:

我有一个包含三个成员的副本集。我是否可能只想从两个辅助节点之一读取?我使用以下代码,其中 ip 是辅助节点之一,但我仍然看到流量已部署到其他节点。

Mongo mongo = new MongoClient("171.21.43.34");

【问题讨论】:

  • 确实可以从辅助文件中读取。您只需在连接字符串中指定您的意图。见docs.mongodb.org/manual/core/read-preference。您始终可以直接从任何节点读取。
  • 除非您设置读取首选项,否则即使指定“辅助”的地址(您实际上不应该这样做)并不意味着这是 only 连接的节点。因为这个是一个副本集,驱动程序无论如何都会“自我发现”所有成员节点。所以读取首选项是这里的“国王”。此外,如果您的成员不是“平衡的”(即一个比另一个更强大的服务器),这可以再次这是一件非常糟糕的事情,因为您最终会在较慢的节点上出现“滞后”,这实际上可能导致落后于 oplog。
  • 是的,我支持@BlakesSeven。除非您有特殊需要,否则不应直接从副本集中的特定辅助节点读取。例如指定一个特定的辅助服务器作为报告服务器左右。

标签: mongodb mongodb-replica-set


【解决方案1】:

最好的方法是使用 mongodb 手册中所述的标签。

https://docs.mongodb.com/manual/tutorial/configure-replica-set-tag-sets/

conf = rs.conf()
conf.members[0].tags = { "offline": "false"}
conf.members[1].tags = { "offline": "false"}
conf.members[2].tags = { "offline": "true"}
rs.reconfig(conf)

在客户端中,您只需将 readpreference 设置为该标签

    MongoClientOptions options = MongoClientOptions
                    .builder()
                    .connectionsPerHost(config.connectionLimit)
                    .readPreference(TaggableReadPreference.secondaryPreferred(new TagSet(new Tag("offline", "true"))))
                    .socketTimeout(config.socketTimeout)
                    .connectTimeout(config.connectionTimeout)
                    .build();
    mongo = new MongoClient(NewsDAOConfig.parseAddresses(config.mongoAddress), options);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 2021-08-13
    • 2021-06-12
    • 2020-12-27
    • 2014-02-01
    • 2016-08-15
    • 1970-01-01
    相关资源
    最近更新 更多