2013-02-06 35 views
6

对于扩展/故障转移,mongodb使用“副本集”,其中有一个主服务器和一个或多个辅助服务器。主要用于写入。辅助用于读取。这几乎是SQL编程中使用的主从模式。 如果小学二年级的副学生取而代之的话。 因此,水平缩放和故障转移的问题得到了解决。但是,这不是一个允许分解的解决方案。一个真正的碎片仅包含整个数据的一部分,因此如果副本集中的次要碎片是碎片,那么如果它没有为请求提供服务所需的所有数据,它如何能够成为主要碎片?MongoDB如何同时执行分片和复制?

我们不需要为每个碎片设置一个副本集吗?

这显然是一个初学者的问题,所以一个链接,视觉上或以其他方式说明如何做这将是有益的。

+0

该分片将有数据需要满足发送给它的请求,是的,你可以有一个副本每个碎片,这里是一个食谱教程:http://cookbook.mongodb.org/operations/convert-replica- set-to-replicated-shard-cluster/ – Sammaye

回答

3

您的假设是正确的,每个分片包含一个单独的副本集。当写入请求进入时,MongoS根据分片键为它找到合适的分片,并将数据写入该分片中包含的副本集的主节点。这会导致写入扩展,因为(精心挑选的)分片键应该将写入分配到所有分片上。

+0

谢谢!它可以以相反的方式完成吗?副本集群中的每个服务器都是分片的。详细说明:假设我们有一个副本集。伟大的我们有能力服务更多的读取,我们得到了故障转移。现在我们的问题是每个服务器(我称之为服务器)上的数据量变得相当大。所以我们在每台服务器上分割数据。这与你所描述的相反吗?还是从实施的角度来看,它们都是一样的“东西”? –

+0

@alexsundukovskiy我不确定你的意思,但是你不能将一个副本集合本身 – Sammaye

+0

@alexsundukovskiy让我们假设SHARD_KEY有可能的值{A,B,C,D},并且你有2个分片。每个分片都有由3台机器组成的副本集。现在,理论上你的文件应该均匀分布在你的SHARD_KEY上,即SHARD_KEY = A,SHARD_KEY = B等文件的数量应该相等。假设这种快乐情况持续一段时间。然后,开始发生以下两件事之一:(继续下面) –

0

您通常会映射单独的分片以分离副本集。 有关MongoDB sharding的概述,请参阅http://docs.mongodb.org/manual/core/sharded-clusters/

+0

谢谢,我想知道它是否曾经发生过其他事情。换句话说,我们可以让副本集中的每个节点分片吗?如果不是这样做有什么问题? –

+0

我不知道我理解你的问题。您在数据库中分割集合,分片在副本集上运行。 MongoDB没有分割节点的概念。你当然可以选择分割所有数据库中的所有集合,但这可能是过度的,取决于你的工作量。 – epc

+0

假设我们有一个副本集。伟大的我们有能力服务更多的读取,我们得到了故障转移。现在我们的问题是每个服务器(我称之为节点)上的数据量变得相当大。所以我们在每台服务器上分割数据。这与你所描述的相反吗?还是从实施的角度来看,它们都是一样的“东西”? –

1

分片是主副本(副本集)的主副本,所以是的,您必须在每个副本中设置副本集。

整个数据的一部分保存在主数据库中,并与副数据库共享以保持一致性。如果小学毕业,中学将被选为新小学,并具有与其前任相同的数据以立即开始服务。这意味着分片数据仍然存在并且不会丢失。

+1

一个碎片是分片收集的数据的范围,副本可以存在没有碎片和@Sammaye我不明白怎么副本集可以在分片环境自身存在的碎片可以在没有副本存在 – Sammaye

+0

。 (你的意思是它不一定是非分片环境中的分片?)当我们说“分片”时,我们不是说复制集是更大数据范围的一部分吗?关于碎片能够存在没有副本集我同意。但是他并没有这样做,因此我调整了他对复制品情景的回答,而不是单个单位。 –

+0

分片的定义并不总是在复制环境中,它听起来像分片中的“定义”存在于副本中。我仍然不确定你的“主要和次要总和”是什么意思,因为如果情况是这样的话,主要(碎片)就不会有重复的数据。该次级是主要的副本,碎片,好样的,取决于复制有 – Sammaye