为独立 MongoDB 编写的应用程序是否可以在不进行任何更改的情况下用于副本集或分片集群?

Will an application written for standalone MongoDB work for replica-set or sharded cluster without any changes?

目前我们正在使用没有任何复制或分片的独立 mongodb,现在我们正在考虑转向复制集以用于生产目的。

为独立 mongodb 编写的应用程序是否可以在没有任何更改的情况下用于副本集或分片副本集,或者是否有一些 standalone/replica-set 具体mongodb ?

中的功能

如果 MongoDB 使用默认端口(27017 用于独立 mongodmongos),您根本不需要触及您的客户端应用程序,它可以在任何一个案例.

当然,当您连接到 MongoDB 时,分片集群会有更多选项,但默认值就可以了。

Will an application written for standalone mongodb will work for replica-set or sharded replica-set without any changes or are there some standalone/replica-set specific features in mongodb ?

当应用程序要 运行 在副本集或分片集群上时,需要考虑以下事项。此外,副本集和分片集群有一些在独立部署中不可用的功能(请参阅底部的 事务和更改流 主题)。


副本集

副本集是具有多个数据库服务器的集群 - 每个服务器上都有复制的数据。副本集的拓扑结构有一个主节点(或成员),其余成员是辅助节点(可以有其他特殊用途的节点,如仲裁者)。

副本集的数据冗余和故障转移功能为您的应用程序提供了额外的功能 - 例如,即使服务器关闭,应用程序也始终 运行s。

默认情况下,数据始终写入主节点并从中读取。您可以配置数据可以从辅助节点读取,也可以从您的应用程序读取 - 这是 Read Preference. This configuration can be used by the applications accessing a replica-set in some scenarios (see Read Preference Use Cases)。这用于副本集,不用于独立部署。

另外,参见 Replica Set Read and Write Semantics

From the perspective of a client application, whether a MongoDB instance is running as a single server (i.e. “standalone”) or a replica set is transparent. However, MongoDB provides additional read and write configurations for replica sets.

然后,还有一些东西,例如 Connection String URI,它对副本集和分片集群使用不同的格式 - 应用程序使用它来连接。


分片集群

应用程序不应该 运行 在分片集群部署中。它将需要设计级别的更改 - 并将影响查询。分片是关于在碎片之间分配数据。请注意,在分片集群中,每个分片都是一个副本集。分片数据库可以有分片和未分片的集合。分片集合是分布式数据。

要创建分片集合,您必须考虑 shard key - 这是您的应用程序访问分片集合的最重要方面。分片键确定查询如何访问特定分片以获取数据。因此,您的应用程序必须考虑分片键——需要使用分片键使用来创建查询。分片键主要影响应用程序查询的性能。

此外,在分片集群环境中,应用程序通过 mongos 路由器访问数据库,而不是直接通过服务器。

在使用分片数据库和访问应用程序时还有许多其他更好的方面 - 这个话题太宽泛了,无法在这里讨论。从独立集群到分片集群是一种架构变化。由于从独立迁移到副本集而可能影响应用程序的一些方面也适用于此(因为每个分片都是一个副本集)。

另请参阅 Operational Restrictions in Sharded Clusters - 这些特定于分片集群,不适用于独立部署。


事务和更改流

transactions and change streams 等功能仅适用于副本集和分片集群(不适用于 单个独立服务器)。这为您的应用程序提供了额外的功能,可以解决复杂的业务逻辑和场景。