MongoDB 上的分片和复制之间的区别

Saa*_*adi 113 mongodb

我只是对分片和复制的工作方式感到困惑。

根据我在文档中找到的定义:

复制:MongoDB 中的副本集是一组维护相同数据集的 mongod 进程。

分片:分片是一种跨多台机器存储数据的方法。

根据我的理解,如果我有 75 GB 的数据,然后通过使用复制(3 个服务器),它将在每台服务器上存储 75GB 数据,这意味着服务器 1 上有 75GB,服务器 2 上有 75GB,服务器 3 上有 75GB。(如果我错了,请纠正我)。

并且通过使用分片,它将在服务器 1 上存储为 25GB 数据,在服务器 2 上存储为 25GB 数据,在服务器 3 上存储为 25GB 数据。(对?)。

但是后来我在教程中遇到了这一行:

分片存储数据。为了提供高可用和数据一致性,在生产分片集群中,每个分片都是一个副本集

一个副本集大小为75GB,而分片大小为25GB,那么它们如何等价呢?

这让我很困惑。我想我错过了一些明显的东西。请帮我解决一下这个。

Phi*_*ipp 158

一个副本集意味着你有MongoDB中的多个实例,其中每个镜子都彼此的数据。一个副本集由一个 Master(也称为“Primary”)和一个或多个 Slave(也称为 Secondary)组成。任何从服务器都可以提供读取操作,因此您可以通过向副本集添加更多从服务器来提高读取性能(前提是您的客户端应用程序能够实际使用不同的集合成员)。但是写操作总是发生在副本集的主节点上,然后传播到从节点,所以当你添加更多的从节点时,写操作不会变得更快。

副本集还提供容错能力。当副本集的一个成员出现故障时,其他成员接管。当master宕机时,slave会选举一个新的master。出于这个原因,建议生产部署始终使用 MongoDB 作为至少三台服务器的副本集,其中两台保存数据(第三台是无数据的“仲裁器”,当确定新主服务器时需要它其中一名奴隶倒下了)。

片集群意味着集群的每个分片(也可以是副本集)负责处理一部分数据。每个请求,包括读取和写入,都由数据所在的集群提供服务。这意味着可以通过向集群添加更多分片来提高读写性能。哪个文档驻留在哪个分片上由每个集合的分片决定。应该选择数据可以均匀分布在所有集群上的方式,这样对于最常见的查询来说,分片键所在的位置很清楚(例如:当您经常查询时user_name,分片键应该包括字段,user_name因此每个查询只能委托给具有该文档的一个分片)。

缺点是容错性受到影响。当集群的一个分片出现故障时,其上的任何数据都无法访问。出于这个原因,集群的每个成员也应该是一个副本集。这不是必需的。当您不关心高可用性时,分片也可以是没有复制的单个 mongod 实例。但是对于生产用途,您应该始终使用 replication

那么这对你的例子意味着什么?

                            Sharded Cluster             
             /                    |                    \
      Shard A                  Shard B                  Shard C
        / \                      / \                      / \
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+
|Primary| |Secondary|    |Primary| |Secondary|    |Primary| |Secondary|
|  25GB |=| 25GB    |    | 25 GB |=| 25 GB   |    | 25GB  |=| 25GB    |   
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+
Run Code Online (Sandbox Code Playgroud)

当您想将 75GB 的数据拆分为 3 个 25GB 的分片时,您至少需要将 6 个数据库服务器组织成三个副本集。每个副本集由两台服务器组成,它们拥有相同的 25GB 数据。

您还需要用于三个副本集的仲裁器的服务器以及集群的 mongos 路由器和配置服务器。仲裁器非常轻量级,仅在副本集成员出现故障时才需要,因此它们通常可以与其他东西共享相同的硬件。但是 Mongos 路由器和配置服务器应该是冗余的并且在它们自己的服务器上。

  • @SaadSaadi [文档中描述了初选过程](http://docs.mongodb.org/manual/core/replica-set-elections/)。辅助节点需要 10 到 12 秒才能注意到主节点已关闭。初选本身通常只需要几毫秒。副本集是只读的,而没有主副本。在此期间应用程序写入数据的任何尝试都将失败。 (5认同)
  • 非常感谢您的详细回答...还有一个问题...如果在执行写入或读取操作时主节点关闭,那么..1)从辅助节点中选择主节点的延迟是多少,2)在此延迟期间,数据将临时存储在哪里? (3认同)

sys*_*138 25

  • 拆分的分区的数据集成离散的部分。
  • 复制复制数据集。

这两个东西可以叠加,因为它们是不同的。使用两者意味着您将跨多组副本分片您的数据集。换句话说,你复制碎片;没有分片的数据集是单个“分片”。

具有 3 个分片和 3 个副本的 Mongo 集群将有 9 个节点。

  • 3 组 3 节点副本。
  • 每个副本集拥有一个分片。


小智 12

通过sharding,您可以将您的收藏分成几个部分。
复制您的数据库意味着您制作数据集的镜像。


小智 5

在交付的功能方面。分片提供可扩展性和并行性。复制提供可用性