MongoDB mongos
实例路由查询并将操作写入分片群集中的分片。mongos
从应用程序的角度来看,它提供了分片群集的唯一接口。应用程序永远不会与分片直接连接或通信。
该mongos
轨道是什么样的数据上碎片从缓存元数据配置服务器。在mongos
使用来自应用程序和客户端的元数据来路由操作
mongod
实例。A mongos
没有持久
状态,并且消耗最少的系统资源。
最常见的做法是mongos
在与应用程序服务器相同的系统上运行实例,但是您可以mongos
在碎片或其他专用资源上维护
实例。
所述mongos
然后合并来自每个目标碎片的数据,并返回结果的文档。某些查询修饰符(例如sorting)在检索结果之前
对诸如主碎片之类的碎片执行mongos
。
在版本3.6中进行了更改:对于在多个分片上运行的聚合操作,如果这些操作不需要在数据库的主分片上运行,则这些操作可能会将结果路由回到mongos
合并结果的位置。
在两种情况下,没有资格在其上运行管道
mongos
。
第一种情况发生在拆分管道的合并部分包含必须在主碎片上运行的阶段时。例如,如果$lookup
需要访问与运行聚合的分片集合在同一数据库中的未分片集合,则合并必须在主分片上运行。
第二种情况发生在拆分管道的合并部分包含一个阶段,该阶段可以将临时数据写入磁盘时,例如
$group
,并且客户端已指定allowDiskUse:true
。在这种情况下,假设在合并管道中没有其他需要主分片的阶段,则合并将在聚集目标的分片集中随机选择的分片上运行。
有关聚合工作如何在分片群集查询的各个组件之间分配的更多信息,请explain:true
用作aggregation()
调用的参数。返回将包括三个json对象。mergeType
显示合并阶段发生的位置(“ primaryShard”,“ anyShard”或“ mongos”)。
splitPipeline
显示管道中的哪些操作在单个分片上运行。shards
显示每个分片已完成的工作。
在某些情况下,当分片键或分片键的前缀是查询的一部分时,会mongos
执行
目标操作,将查询路由到集群中的分片的子集。
mongos
对不包含分片
键的查询执行广播操作,将查询路由到集群中的所有分片。确实包含分片键的某些查询可能仍会导致广播操作,具体取决于群集中数据的分布和查询的选择性。
mongos
处理查询修饰符¶mongos
实例的连接¶要检测您的客户端连接到的MongoDB实例是否为mongos
,请使用isMaster
命令。当客户端连接到时mongos
,isMaster
返回带有msg
包含字符串的字段
的文档isdbgrid
。例如:
如果将应用程序连接到mongod
,则返回的文档不包含isdbgrid
字符串。
通常,分片环境中最快的查询是mongos
使用分片密钥和配置服务器中的群集元数据路由到单个分片的查询
。这些目标操作使用分片键值来定位满足查询文档的分片或分片子集。
对于不包含分mongos
片键的查询,必须查询所有分片,等待它们的响应,然后将结果返回给应用程序。这些“分散/聚集”查询可能是长时间运行的操作。
mongos
实例广播查询,所有碎片的收集,除非在mongos
能够确定碎片的商店,其碎片或子集这些数据。
mongos
收到所有分片的响应后,它将合并数据并返回结果文档。广播操作的性能取决于群集的总体负载,以及诸如网络延迟,单个分片负载以及每个分片返回的文档数之类的变量。在可能的情况下,应优先选择会导致目标操作的操作,而不是会导致广播操作的操作。
多次更新操作始终是广播操作。
该updateMany()
和
deleteMany()
方法是广播业务,除非查询文件规定足额片键。
mongos
可以路由包含分片密钥或复合分片密钥的前缀,特定分片或一组分片的查询。mongos
使用分片密钥值来定位
块,其范围包括片键值,并在引导查询碎片包含该块。
例如,如果分片键为:
该mongos
程序可以路线查询,其中包括在碎片的特定碎片或一套完整的片键或以下两种片键的前缀:
所有insertOne()
操作都针对一个分片。insertMany()
数组中的每个文档都针对单个分片,但是不能保证数组中的所有文档都插入到单个分片中。
所有updateOne()
,
replaceOne()
而deleteOne()
业务必须包括片键或_id
查询文件内。如果使用的这些方法没有分片键或,则MongoDB返回错误_id
。
使用内部/成员身份验证来加强集群内部的安全性,并防止未经授权的集群组件访问集群。您必须使用适当的安全设置启动每个集群mongod
或mongos
在集群中启动,以强制执行内部身份验证。
有关部署安全的分片群集的教程,请参阅使用密钥文件身份验证部署分片群集。
分片群集支持基于角色的访问控制 (RBAC),用于限制对群集数据和操作的未授权访问。您必须使用选项启动mongod
群集中的每个
服务器,包括配置服务器,--auth
以强制执行RBAC。另外,为群集间安全性强制执行内部/成员身份验证,还可以通过RBAC进行用户访问控制。
随着RBAC执行,客户端必须指定--username
,
--password
以及
--authenticationDatabase
连接到时mongos
以访问群集资源。
每个集群都有自己的集群用户。这些用户不能用来访问各个分片。
mongos
"majority"
对以下影响分片群集元数据的操作使用写关注:
从MongoDB 4.0开始,mongos
尝试连接功能兼容版本(fCV)大于的mongod
实例
时,二进制文件将崩溃。例如,您无法将MongoDB 4.0版本连接到fCV设置为4.2 的4.2分片群集。但是,您可以将MongoDB 4.0版本连接
到fCV设置为4.0 的4.2分片群集。mongos
mongos
mongos
从MongoDB 4.2开始,MongoDB将ShardingTaskExecutorPoolReplicaSetMatching
确定mongos
实例连接池的最小大小(在运行时可能变化)
的参数添加
到分片群集的每个成员。
默认情况下,对于分片群集中的每个副本集(即,分片副本集和配置服务器),mongos
维护与每个辅助副本集的连接池至少等于其与主副本集的连接池的大小。