MongoDB - 分片和非分片集合

10

我有些困惑这是如何运作的。

在对MySQL进行分片时,我们通常会将一些表(通常是包含参考数据的小表)整个放在每个分片中,以便进行连接操作。

如果在MongoDB的分片设置中,我们有一些不需要进行分片的小型集合,那么它们会发生什么情况?它们会被发送到每个分片中,还是只停留在第一个分片中?

如果在具有多个应用服务器的重度分片系统中,所有进程都在访问一个服务器,那么这可能会成为潜在的瓶颈。


你必须手动指定(命令)哪些集合是分片的。对于较小的集合,不要进行分片,这样它将仅保留在一个分片中。任何针对该集合执行的查询都只会被发送到持有该集合的分片。参考:http://docs.mongodb.org/manual/tutorial/deploy-shard-cluster/#sharding-setup-shard-collection - Abhishek Kumar
未分片的集合将驻留在第一个分片上,这可能会成为瓶颈。有关分发这些集合的讨论已经存在,但目前MongoDB尚未实现。 - Sammaye
1个回答

2
在MongoDB中,使用自动分片功能时,分片集合会在所有分片上均匀地分布。
对于那些不太可能进行分片的集合(未分片),您可以指定一个主分片来存储它们。这个主分片是针对特定数据库的,因此它是在数据库级别上的。可以移动并且对于不同的数据库可以有所不同。
还有一个分片标记的概念,通过它可以影响分片集合在哪里存储。基本上,您可以将集合或集合的一部分约束为存储在特定一组分片上。(参考

我不确定标签感知分片是否适用于非分片集合,从未测试过。然而,根据非分片集合的块永远不会平衡这一事实来判断,我认为不适用。 - Sammaye
这就是为什么我写了“您可以影响分片集合的放置位置”,不过有人可能会说您倾向于将分片集合完全放在一个分片上,这几乎(可能完全)等同于非分片集合的行为。我相当确定您无法标记未分片的集合。 - attish
谢谢大家。这就是我所担心的。对我来说,这有点潜在的威胁。当然,在Mongo中,您不需要担心连接,这是将较小的表复制到各个分片的主要原因之一。处理它们的另一种方法是设置不同的复制环境。我猜在Mongo环境中,您倾向于不使用唯一键来进行状态等操作,而是使用实际要出现在报告中的状态等。除非您想更改状态文本,否则这只是一个问题。 - CargoMeister
在索引和分片方面需要小心。一旦集合被分片,唯一索引将不再按预期工作,因此,如果您只是自动对任意集合进行分片,而没有考虑唯一索引,可能会导致某些问题。 - nilskp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接