Mongo DB - 独立模式和单节点副本集的区别

42

我需要使用MongoDB事务,最近我了解到事务不适用于Mongo独立模式,而只适用于复制集(Mongo DB with C# - document added regardless of transaction)。
另外,我读到独立模式不适合生产环境。

所以我发现只需在mongod.cfg中定义一个复制集名称就足以将MongoDB作为复制集而不是独立运行。
更改后,MongoDB事务开始工作。
但是,虽然我没有真正使用复制功能,但使用它作为复制集有点奇怪,因此我想确保我正在使用有效的配置。

所以我的问题是:

  1. 如果我不需要复制、负载均衡或任何其他可扩展性功能(如上所述我需要允许事务),那么作为1节点复制集运行MongoDB是否存在任何问题/劣势?
  2. 如果独立运行与作为1节点复制集运行之间存在差异,则其功能和性能差异是什么?
  • 我已经阅读过独立模式不适用于生产环境,尽管它听起来是最基本的配置。我了解到这个配置在大多数情况下都不使用,但有时您可能想将其用作本地机器上标准的数据库。那么为什么不推荐使用独立模式?是因为不够稳定还是其他原因?

  • 5
    谢谢您的提问。我也遇到了同样的问题,您的问题及其答案对我很有帮助。 - Dinindu Kanchana
    2个回答

    20

    假设我不需要复制、负载平衡或其他可扩展功能,只作为单节点副本集运行Mongo是否会有问题/劣势?

    由于没有正式的副本集,因此您将没有高可用性。因此不建议在生产部署中使用。但是在开发中使用是可以的。

    请注意,副本集的主要功能是提供高可用性而不是扩展性。

    作为独立节点和单节点副本集运行可能有哪些功能和性能差异?

    单节点副本集将具有操作日志。这意味着您将使用更多磁盘空间来存储操作日志,并且任何插入/更新操作也将写入操作日志中(写入放大)。

    那么为什么不推荐独立模式?它不够稳定,还是其他原因?

    MongoDB在生产环境中的设计是考虑到副本集部署,目的是:

    • 在节点故障时保持高可用性
    • 无需停机即可进行滚动维护/升级
    • 可能扩展读取
    • 可能在不参与高可用性节点的特殊目的节点上复制数据
    简而言之,MongoDB旨在设计成一种容错的分布式数据库(水平伸缩),而不是典型的SQL单体数据库(垂直伸缩)。其想法是,如果您失去一个副本集中的节点,其他节点将立即接管。大多数情况下,您的应用程序甚至不知道数据库端发生了故障。相比之下,在单体数据库服务器出现故障时,会立即破坏您的应用程序。

    1
    我可以获得可扩展性和高可用性的好处,但如果我只需要文档数据库而不是关系型数据库呢? 我的情况是每台机器都需要一个本地数据库,因为它必须在离线/网络中断时工作,所以我不能依赖网络连接来访问数据。这就是为什么每台机器都需要安装一个独立/单节点副本集。 问题是它能否正常工作,或者这些配置存在错误? - Metheny
    它能够正常工作。它没有任何漏洞。然而,由于MongoDB最初是为安装在服务器硬件上而设计的,您可能需要调整默认设置以更好地适应您的用例。 - kevinadi
    1节点副本集的好处在于可以使用事务。 - Gregory Pakosz

    10

    我认为kevinadi回答得很好,但我还想补充一点。

    独立部署是在单个服务器上运行的mongod实例,但它不是复制集的一部分。独立实例用于测试和开发,但在生产环境中始终建议使用复制集。

    单节点复制集将拥有oplog,记录其数据集的所有更改。这意味着您将使用更多的磁盘空间来存储oplog,并且任何插入/更新操作也将写入oplog(写扩散)。 它还支持时点恢复。

    如果您想将独立数据库转换为副本集,请按照【将独立部署转换为复制集】进行操作。

    事务已在MongoDB 4.0版本中引入。从4.0版本开始,针对需要在多个文档更新之间具有原子性或在多个文档读取之间具有一致性的情况,MongoDB为复制集提供了多文档事务。该事务在独立部署中不可用,因为它需要oplog来在集群内维护强一致性。


    由于我们需要事务,因此单节点副本集不会成为问题,只需要额外的操作日志,不是吗? - John

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接