具有分片或副本集的 mongos 中的数据分布

JER*_*RRY 1 mongodb architecture

我是mongodb的新手。我已经设置了一个mongodb 架构,其中一个mongo shard(mongos)连接到三个shards(replica sets),三个配置服务器。架构如下所示: 建筑学

现在mongos与这些分片相连。mongos 中的数据将被拆分到这三个分片中。我怀疑的是它们是否shard 1包含与3 个分片完全相同的数据shard 2shard 3或者所有 3 个分片都有不同的数据。

Nei*_*unn 5

那么让我们看看这里在参考架构中代表的“角色”。请记住,这是架构的全部内容的“2 美分之旅”。

蒙古人


此进程是“路由器”,因为它充当“客户端”连接到分片集群的接口。您可以拥有多个mongos实例,因此您不仅限于“一个”。正如图中所指出的,它们与“配置服务器”进行通信,以便根据提交的查询或操作确定将请求发送到哪个“分片”。

配置服务器


这些是分片集群的“大脑”。本质上,它们包含“元数据”,它说明哪些“数据块”或“部分数据”出现在哪个“分片”上。它们以“合理冗余的方式”彼此保持一致,以便向mongos“路由器”提供该信息。

碎片


这里主要是一个“元”概念。尽管可以将单个服务器作为“分片”,但通常建议不要使用“副本集”作为分片节点。“分片”的目的是将数据“特定”保存到“定义的范围”。这通过在分片集群的“节点”之间“拆分”的“分片键”起作用。“拆分”的全部性质由位于已经描述的“配置服务器”上的“分片配置”决定。“分片”上的数据仅存在于该分片上,“无处可去”。

副本集


副本集的目的是不言自明的。它本质上是从给定的“主”节点“复制”数据,该节点是唯一接受“写入”操作的节点。这是对一个或多个“次要”节点进行的。你只需要一个“副本集的辅助节点”,但如果你这样做了,那么你真的需要另一个“仲裁者”节点来打破选举的僵局。

“选举”的意思是,当副本集的一个成员出现故障或以其他方式不可用时,将举行“选举”以确定哪个成员成为新的“主要”。这里需要“多数”投票,因此需要“奇数”的成员可以投票(并非所有成员类型都可以投票)。

概括


分片没有“重复”。可能有一段时间相同的数据同时出现在一个分片和另一个分片上,但这永远不会反映在“配置服务器”中(如果是,那么这就是损坏)。有一个称为“块迁移”的过程,这就是所有这一切的目的,其中分配给一个分片的数据“平衡”以存在于另一个分片上。但是前面提到的“元数据”是“原子更新的”,因此应该对真正的数据源实际驻留在何处有一致的看法。

“副本集”成员是有意复制的地方。这是为了数据冗余,如果一个成员出现故障,那么还有其他成员可以继续工作。他们“应该”有一个一致的观点,但这在很大程度上取决于你的应用程序中关于一致性“保证”的“写关注”。尽管如此,如果只是罕见的,可能会出现问题。(但云中的网络分区经常发生)。

“分片”的作用与副本集的“冗余”相反。他们的作用是“分发”数据。这意味着根据定义,数据不会在分片上“复制”(已经给出的时刻案例),因此一般 CRUD 操作是“分布式”或“有针对性的”,跨或定向到将要处理的相关“分片”为您的操作提供数据。

简而言之。分片用于“数据分发”,以便通过将工作负载“定位”到特定的“分片节点”或将工作负载“拆分”到多个节点来使操作具有可扩展性。任何适合您的应用目的。

分片节点之间总是有不同的数据,这就是它们存在的目的。

  • @Jerry 就像我说的那样,它是“2 美分版本”,因此它确实没有涵盖所有选项,但希望概述基础知识。如果您花时间消化它并自己测试各种内容,那么核心文档中的信息非常好。我什至会推荐 [univerity.mongodb.com](http://univerity.mongodb.com) 上的 **free**(如啤酒)课程(公然背书免责声明)。有两个以 DBA 为中心的产品很好地涵盖了这些概念。在已经做了几年之后,我什至捡到了额外的东西。注册。 (3认同)