【问题标题】:How does MongoDB do both sharding and replication at the same time?MongoDB 如何同时进行分片和复制?
【发布时间】:2013-02-06 21:31:37
【问题描述】:

对于扩展/故障转移,mongodb 使用“副本集”,其中有一个主服务器和一个或多个辅助服务器。 Primary 用于写入。次要用于读取。这几乎是 SQL 编程中使用的主从模式。 如果主节点出现故障,则辅助节点集群中的辅助节点将取而代之。 因此,水平扩展和故障转移的问题得到了解决。但是,这似乎不是一个允许分片的解决方案。一个真正的分片只保存整个数据的一部分,所以如果副本集中的从属分片是分片,当它没有为请求提供服务所需的所有数据时,它怎么能成为主分片?

我们不是必须为每个分片设置一个副本集吗?

这显然是一个初学者问题,所以一个可以直观地或以其他方式说明如何完成的链接会很有帮助。

【问题讨论】:

  • 该分片将具有满足发送给它的请求所需的数据,是的,您可以为每个分片创建一个副本,这是一个食谱教程:cookbook.mongodb.org/operations/…

标签: mongodb replication sharding


【解决方案1】:

您的假设是正确的,每个分片都包含一个单独的副本集。当有写入请求进来时,MongoS 根据 shard key 为它找到正确的 shard,并将数据写入该 shard 中包含的副本集的 Primary。这会导致写入扩展,因为(精心选择的)分片键应该将写入分布在所有分片上。

【讨论】:

  • 谢谢!可以以相反的方式完成吗?副本集集群中的每个服务器都是分片的。详细描述:假设我们有一个副本集。太好了,我们获得了服务更多读取的能力,我们获得了故障转移。现在我们的问题是每台服务器(我称之为服务器)上的数据量变得相当大。所以我们对每台服务器上的数据进行分片。这不是和你描述的相反吗?还是从实现的角度来看,这都是同一个“东西”?
  • @alexsundukovskiy 我不确定你的意思,但你不能对副本集本身进行分片
  • @alexsundukovskiy 假设 SHARD_KEY 有可能的值 {A,B,C,D} 并且您有 2 个分片。每个分片都有由 3 台机器组成的副本集。现在,理论上,您的文档应该均匀分布在您的 SHARD_KEY 上,即到达 SHARD_KEY = A、SHARD_KEY = B 等的文档数量应该相等。假设这种快乐的情况持续了一段时间。然后,两件事之一开始发生:(下文继续)
  • 1) 文档总数开始变大,所有分片开始填满。您可以:(a)获得更大的机器(b)将分片数量(例如)从 2 个增加到 4 个。2)您最初对 SHARD_KEY 上的文档分布的假设是错误的,只有 shard #1 开始填满。在这种情况下,您需要选择一个新键或选择一个复合键。迁移到新密钥/复合密钥 (AFAIK) 的唯一方法是转储所有数据,基于新密钥创建新集合,然后将其全部移回。
  • 谢谢!感谢您的解释,现在设计师决定复制分片而不是分片“复制”是有道理的。
【解决方案2】:

分片是主次要副本(副本集)的总和,所以是的,您必须在每个分片中都有一个副本集。

整个数据的一部分保存在主数据库中,并与辅助数据库共享以保持一致性。如果主节点出现故障,辅助节点将被选为新的主节点,并具有与其前任相同的数据以立即开始服务。这意味着分片数据仍然存在并且没有丢失。

【讨论】:

  • 分片是分片集合的数据范围,副本可以没有分片存在,分片可以没有副本存在
  • @Sammaye 我无法理解副本集如何在分片环境中独立存在。 (您的意思是它不必是非分片环境中的分片吗?)当我们说“分片”时,我们不是说副本集是更大数据范围的一部分吗?关于分片能够在没有副本集的情况下存在的问题,我同意。但他的情况并非如此,因此我根据他的场景调整了我的答案,涉及复制品,而不是单个单元。
  • 确切地说,分片的定义并不总是在复制的环境中,听起来像分片的“定义”应该存在于副本中。我仍然不确定“主要和次要的总和”是什么意思,因为如果是这种情况,主要(分片)不会有重复的数据。辅助节点是主节点的副本,分片很好,取决于那里的复制
  • @Sammaye 是的,我使用“sum”的解释可能在那里令人困惑。我主要指的是实体方面的“总和”,而不是数据方面的,因为我想反驳那个人问的是if the secondary in a replica set is shard how can it qualify as primary。二级不是实际的分片,整个集合被认为是一个分片,但只有一个实体提供数据。谢天谢地,他解决了。
  • 好吧,是的,听起来不错:)
【解决方案3】:

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

【讨论】:

  • 谢谢,我想知道它是否会反过来发生。换句话说,我们可以将副本集中的每个节点都分片吗?如果不是这样做有什么问题?
  • 我不确定我是否理解您的问题。您在数据库中对集合进行分片,并且分片在副本集之上运行。 MongoDB 没有分片节点的概念。您当然可以选择对所有数据库中的所有集合进行分片,但是根据您的工作量,这可能有点过头了。
  • 假设我们有一个副本集。太好了,我们获得了服务更多读取的能力,我们获得了故障转移。现在我们的问题是每个服务器(我称为节点)上的数据大小变得相当大。所以我们对每台服务器上的数据进行分片。这不是和你描述的相反吗?还是从实现的角度来看,这都是同一个“东西”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 2015-08-26
  • 2013-11-12
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 2021-01-05
相关资源
最近更新 更多