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


77

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

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

分片:分片是一种用于在多台计算机之间存储数据的方法。

根据我的理解,如果有75 GB的数据然后通过复制(3台服务器),它将在每个服务器上存储75GB的数据,这意味着Server-1上为75GB,Server-2上为75GB,server-3上为75GB。如果我错了)..并通过分片将其存储为服务器1上的25GB数据,服务器2上的25Gb数据和服务器3上的25GB数据。(对吗?)...但是后来我在本教程

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

由于副本集为75GB,而分片集为25GB,那么它们如何等效……这让我非常困惑……我认为我在此方面缺少了一些很棒的东西。请帮助我。

Answers:


111

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

副本集还提供容错功能。当副本集的成员之一发生故障时,其他成员接任。当主机发生故障时,从机将选举一个新的主机。因此,建议进行生产性部署时,始终将MongoDB用作至少三台服务器的副本集,其中两台用于保存数据(第三台是无数据“仲裁器”,在确定新主服务器时需要使用“仲裁器”。一名奴隶掉了下来。

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

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

那么这对您的示例意味着什么?

                            Sharded Cluster             
             /                    |                    \
      Shard A                  Shard B                  Shard C
        / \                      / \                      / \
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+
|Primary| |Secondary|    |Primary| |Secondary|    |Primary| |Secondary|
|  25GB |=| 25GB    |    | 25 GB |=| 25 GB   |    | 25GB  |=| 25GB    |   
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+

如果要将75GB的数据分成3个25GB的碎片,则需要至少6个数据库服务器,这些服务器按三个副本集组织。每个副本集由两个具有相同25GB数据的服务器组成。

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


2
非常感谢您提供详细的答案...另一个问题...如果在执行写入或读取操作时主数据库已关闭,则..1)从辅助数据库中选择主数据库的延迟是多少?2)在此延迟期间,数据将被临时存储在哪里?
2013年

4
@SaadSaadi 文档中描述了主要的选举过程。辅助节点需要10到12秒的时间才能注意到辅助节点已关闭。初选本身通常只需几毫秒。没有主副本集时,副本集为只读。在此期间,任何来自应用程序的写数据尝试都将失败。
菲利普

1
@Philipp:仅有两条评论:(1)不能修改分片键(即无法使用其他键进行分片),(2)可以从副本集的辅助节点读取,但一致性取决于写操作(在为了保持一致,w选项应等于不可行的副本集sth,因为每个分片可能有意具有不同的副本集大小或由于节点故障而导致)。
Mike Argyriou 2015年

@Philipp您能否在dba.stackexchange.com/questions/208482/…上回答进一步的后续问题?
user3198603'6

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

这两个东西可以堆叠,因为它们是不同的。同时使用这两种方法意味着您将在多组副本之间共享数据集。换句话说,您可以复制分片。没有分片的数据集就是单个“分片”。

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

  • 3组3节点副本。
  • 每个副本集包含一个单独的分片。

对于一个大文件,是将其存储到一个分片还是多个分片(因此跨节点)?
托尼

请注意,在MongoDB 3.4或更高版本中,您还需要mongoDB服务器进行配置,并需要一个附加服务器来充当mongos路由器。这样,示例中的3x3群集总数便达到了13台服务器。
dthrasher

9

通过分片,可以将集合分为几个部分。
复制数据库意味着您要镜像数据集。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.