【问题标题】:How to perform read operations from primary only如何仅从主节点执行读取操作
【发布时间】:2013-01-29 05:00:21
【问题描述】:

我们将 Mongo DB 用于基于 Java Java EE 的应用程序。 我们使用一个主和两个辅助作为 Mongo DB 集群的一部分 作为我们架构的一部分,Mongo DB 不断被读取/更新/写入。

因此,当我们从 Mongo DB 执行提取操作时,我们会收到脏读(零值)。

为了解决这个问题,我尝试将其配置为读取操作始终从主节点本身获取,而写入/更新可以转到主节点/次节点。

如果这可能,请告诉我(始终从主要读取并使用主要/次要的任何东西进行写入/更新)

这样的设计会有什么负面影响吗?

【问题讨论】:

  • “任何负面影响” - 显然,您的主节点现在是瓶颈,因为它必须同时处理读取和写入。如果网络已经饱和,或者您进行了昂贵的更新(阻止了读者),那么您就有麻烦了。
  • 另外,您只能写入主文件。你不能写到中学。
  • 谢谢,有道理,我会排除这种尝试。
  • 知道如何避免脏读吗??
  • 我认为Dirty Reads 意味着程序在其他人提交写入之前获得了未提交的数据。但在你的情况下,看起来你想尽快得到别人写的数据。如果我明白你的意思,也许你可以将数据的 ASAP 部分移动到一些超级牛驱动的大内存和快速磁盘主机,一个节点,没有辅助节点。

标签: java mongodb jakarta-ee


【解决方案1】:

由于 mongoDB 在插入中使用分阶段写入,即使在单个节点中,写入操作也可能存在延迟。 http://docs.mongodb.org/manual/reference/glossary/#term-journal

使用写关注来避免问题(脏数据):http://api.mongodb.org/java/2.6/com/mongodb/WriteConcern.html

您可以阅读有关写入操作的更多信息: http://docs.mongodb.org/manual/core/write-operations/

其中指出不建议在生产环境中使用不带错误检查的写入。

【讨论】:

    【解决方案2】:

    要排除从属读取,您必须设置相应的ReadPreference。请参阅有关Mongo 连接类的文档。

    类似这样的:

     mongo.setReadPreference(ReadPreference.primary());
    

    但是,文档说,默认情况下,所有读取都应该已经进入主节点:

    默认情况下,所有读写操作都将在主节点上进行,但可以通过更改读取首选项从辅助节点读取:

    您确定您没有在应用中打开从属读取吗?

    【讨论】:

    • 谢谢,但如果我这样做,如你所说,会有负面影响知道吗??因为主人被瓶颈了??
    • @PreethiJain:这就是价格。您想扩展读取 - 添加从属。您想要扩展写入 - 添加分片。
    • 是的,我确定我们没有在应用程序上打开从属读取。感谢您的回复。
    猜你喜欢
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多