Mongo 数据库 - 独立副本集和 1 节点副本集之间的区别

Mongo DB - difference between standalone & 1-node replica set

我需要使用 Mongo 数据库事务,最近我了解到事务不适用于 Mongo 独立模式,但仅适用于副本集 ().
另外,我读到不建议将独立模式用于生产。

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

所以我的问题是:

  1. 是否有 problem/disadvantage 与 运行ning Mongo 作为 1 节点副本集,假设我真的不需要复制、负载平衡或任何其他可扩展功能? (如前所述,我需要它来允许交易)
  2. 运行ning 作为独立版本与 运行ning 作为 1 节点副本集之间的功能和性能差异是什么?
  3. 我了解到不建议将独立模式用于生产,尽管这听起来像是最基本的配置。我知道在大多数情况下不会使用此配置,但有时您可能希望将其用作本地计算机上的标准数据库。那么为什么不推荐单机模式呢?是不够稳定,还是其他原因?

Is there any problem/disadvantage with running Mongo as a 1-node replica set, assuming I don't really need the replication, load balancing or any other scalable functionality?

您没有适当的副本集提供的高可用性。因此不推荐用于生产部署。不过这对开发来说很好。

请注意,副本集的功能主要是关于高可用性而不是缩放。

What are the functionality and performance differences, if any, between running as standalone vs. running as a 1-node replica set?

A single-node 副本集会有操作日志。这意味着您将使用更多磁盘 space 来存储操作日志,并且任何 insert/update 操作也会写入操作日志(写入放大)。

So why is standalone mode not recommended? Is it not stable enough, or other reasons?

MongoDB 在生产中的设计考虑了副本集部署,用于:

  • 面对节点故障时的高可用性
  • 滚动 maintenance/upgrades,没有停机时间
  • 可能 scale-out 阅读
  • 在不属于高可用性节点的 special-purpose 节点中拥有数据副本的可能性

简而言之,MongoDB 被设计为 fault-tolerant 分布式数据库(水平扩展),而不是典型的 SQL 单一数据库(垂直扩展)。这个想法是,如果您丢失了副本集的一个节点,其他节点将立即接管。大多数时候,您的应用程序甚至不知道数据库端出现故障。相比之下,单一数据库服务器中的故障会立即中断您的应用程序。

觉得kevinadi回答的不错,不过还是想补充一下

独立是在单个服务器上运行但不属于副本集的 mongod 实例。用于测试和开发的独立实例,但始终建议在生产中使用副本集。

一个单节点副本集将有一个记录所有对其数据集的更改的操作日志。这意味着您将使用更多磁盘 space 来存储操作日志,并且任何 insert/update 操作也会写入操作日志(写放大)。它还支持时间点恢复。

如果您想将独立数据库转换为副本集,请遵循将独立数据库转换为副本集。

交易已在 MongoDB 4.0 版中引入。从 4.0 版本开始,对于需要更新多个文档的原子性或读取多个文档之间的一致性的情况,MongoDB 为副本集提供了多文档事务。该事务不能独立使用,因为它需要 oplog 来保持集群内的强一致性。