mongos
mongos 通过缓存来自配置服务器的元数据来跟踪哪些数据在哪个分片上。 mongos 使用元数据将操作从应用程序和客户端路由到 mongod 实例。 mongos 没有持久状态并且消耗最少的系统资源。
最常见的做法是在与应用程序服务器相同的系统上运行 mongos 实例,但您可以在分片或其他专用资源上维护 mongos 实例。 另见 mongos 数量和分布。
MongoDBmongos
实例将查询和写入操作路由到分片集群中的分片。mongos
从应用程序的角度为分片集群提供唯一的接口。应用程序从不直接与分片连接或通信。
mongos
通过缓存来自配置服务器的元数据来跟踪哪些数据在哪个分片上。mongos
使用元数据将操作从应用程序和客户端路由到mongod
实例。mongos
没有持久 状态并且消耗最少的系统资源。
最常见的做法是mongos
在与应用程序服务器相同的系统上运行mongos
实例,但您可以在分片或其他专用资源上维护mongos
实例。另见mongos
数量和分布。
路由和结果过程
- 确定必须接收查询的分片列表。
- 在所有目标分片上建立游标。
然后 mongos
合并来自每个目标分片的数据并返回结果文档。 在 mongos
检索结果之前,在每个分片上执行某些查询修饰符,例如排序。
在 3.6 版更改:对于在多个分片上运行的聚合操作,如果操作不需要在数据库的主分片上运行,则这些操作可能会将结果路由回 mongos
,然后合并结果。
在两种情况下,管道不符合在 mongos
上运行的条件。
第一种情况发生在拆分管道的合并部分包含必须在主分片上运行的阶段时。 例如,如果 $lookup
需要访问与运行聚合的分片集合位于同一数据库中的未分片集合,则合并必须在主分片上运行。
第二种情况发生在拆分管道的合并部分包含一个可能将临时数据写入磁盘的阶段,例如 $group
,并且客户端已指定 allowDiskUse:true
。 在这种情况下,假设合并管道中没有其他阶段需要主分片,则合并将在聚合所针对的分片集中随机选择的分片上运行。
有关聚合工作如何在分片集群查询的组件之间拆分的更多信息,请使用 explain:true
作为 aggregate()
调用的参数。 返回将包括三个 json 对象。 mergeType
显示合并发生的阶段(“primaryShard”、“anyShard”或“mongos”)。 splitPipeline
显示管道中的哪些操作已在各个分片上运行。 shards
显示每个分片已完成的工作。
在某些情况下,当分片键或分片键的前缀是查询的一部分时,mongos
执行 针对性操作,将查询路由到集群中的分片子集。
mongos
执行一个广播操作对于不包含分 片键的查询,将查询路由到集群中的所有分片。某些确实包含分片键的查询可能仍会导致广播操作,具体取决于集群中数据的分布和查询的选择性。
看目标行动与广播行动有关目标和广播操作的更多信息。
从MongoDB 4.4开始,mongos
可以支持对冲读取以尽量减少延迟。看对冲读取想要查询更多的信息。
mongos
如何处理查询修饰符
排序
如果查询结果未排序,mongos
实例将打开一个结果游标,该游标是分片上所有游标的“循环法”结果。
限制
如果查询使用 limit()
游标方法限制了结果集的大小,则mongos
实例将该限制传递给分片,然后在将结果返回给客户端之前将限制重新应用到结果。
跳过
如果查询使用skip()
游标方法指定要跳过的记录数,mongos
则不能将跳过传递给分片,而是从分片中检索未跳过的结果,并在组装完整结果时跳过适当数量的文档。
当与 a 结合使用时limit()
, mongos
会将limit加上skip()
的值 传递给分片,以提高这些操作的效率。
读取首选项和分片
对于分片集群,在从分片读取时mongos
应用读取首选项。所选节点受读取首选项和 replication.localPingThresholdMs
设置的约束,并针对每个操作重新评估。
有关读取首选项和分片集群的详细信息,请参阅 读取首选项和分片。
对冲读取
从 4.4 版本开始,mongos
实例可以对冲使用非primary
读取偏好的读取。通过对冲读取,mongos
实例将读取操作路由到每个查询分片的两个副本集节点,并从每个分片的第一个响应者返回结果。为对冲读取操作而发送的附加读取使用maxTimeMSForHedgedReads
的 maxTimeMS
值。
以下操作支持对冲读取:
collStats
count
dataSize
dbStats
distinct
filemd5
find
listCollections
listIndexes
planCacheListFilters
对冲阅读和阅读偏好
对冲读取在每个操作中指定为读取首选项的一部分。非primary
阅读偏好支持对冲阅读。请参阅对冲阅读偏好选项。
- 要为非
primary
读取首选项指定对冲读取,请参阅驱动程序阅读首选项 API 文档。 - 读取首
nearest
选项默认启用对冲读取选项。
有关读取首选项和分片集群以及节点选择的详细信息,请参阅读取首选项和碎片。
启用/禁用对冲读取的支持
默认情况下,mongos
实例支持使用对冲读取。要关闭mongos
实例对对冲读取的支持,请参阅readHedgingMode
参数。如果对冲读取支持是off
,则无论为读取首选项指定的选项mongos
如何,都不使用对冲读取。hedge
对冲读取诊断
命令serverStatus
及其对应 mongosh
方法db.serverStatus()
返回 hedgingMetrics
。
确认连接到mongos
实例
要检测您的客户端连接到的 MongoDB 实例是否为mongos
,请使用hello
命令。当客户端连接到 amongos
时,hello
返回一个msg
包含包含字符串的字段 的文档isdbgrid
。例如:
{
"isWritablePrimary" : true,
"msg" : "isdbgrid",
"maxBsonObjectSize" : 16777216,
"ok" : 1,
...
}
如果应用程序改为连接到 mongod
,则返回的文档不包含该isdbgrid
字符串。
目标行动与广播行动
通常,分片环境中最快的查询是那些 使用分片键和来自配置服务器的集群元数据mongos
路由到单个分片的查询。这些有针对性的行动使用分片键值定位满足查询文档的分片或分片子集。
对于不包含分片键的查询,mongos
必须查询所有分片,等待它们的响应,然后将结果返回给应用程序。这些“分散/聚集”查询可以是长时间运行的操作。
广播业务
mongos
实例向集合的所有分片广播查询,除非mongos
可以确定哪个分片或分片子集存储此数据。
在mongos
收到所有分片的响应后,它会合并数据并返回结果文档。广播操作的性能取决于集群的整体负载,以及网络延迟、单个分片负载和每个分片返回的文档数量等变量。只要有可能,支持导致以下结果的操作针对性操作超过那些导致广播操作的。
多次更新操作始终是广播操作。
和方法是广播操作updateMany()
, deleteMany()
除非查询文档完整指定分片键。
针对性操作
mongos
可以将包含分片键或复合分片键前缀的查询路由到特定分片或一组分片。mongos
使用分片键值定位其范围包括分片键值的 块,并将查询定向到包含该块的分片。
例如,如果分片键是:
{ a: 1, b: 1, c: 1 }
该mongos
程序可以在特定分片或一组分片中路由包含完整分片键或以下任一分片键前缀的查询:
{ a: 1 }
{ a: 1, b: 1 }
所有insertOne()
操作都针对一个分片。数组中的每个文档都insertMany()
指向单个分片,但不能保证数组中的所有文档都插入到单个分片中。
所有updateOne()
, replaceOne()
和deleteOne()
操作必须包含分片键或_id
在查询文档中。如果在没有分片键或_id
.
根据集群中数据的分布和查询的选择性,mongos
可能仍然会执行一个广播操作来满足这些查询。
索引使用
当分片收到查询时,它会使用最有效的索引来完成该查询。使用的索引可以是分 片键索引或分片上存在的另一个合格索引。
分片集群安全
使用内部/节点身份验证来实施集群内安全并防止未经授权的集群组件访问集群。您必须使用适当的安全设置启动每个mongod
或mongos
在集群中以强制执行内部身份验证。
从 MongoDB 5.3 开始,SCRAM-SHA-1 不能用于集群内身份验证。仅 支持SCRAM-SHA-256。
在以前的 MongoDB 版本中,SCRAM-SHA-1 和 SCRAM-SHA-256 都可以用于集群内身份验证,即使没有明确启用 SCRAM。
有关部署安全分片集群的教程,请参阅使用密钥文件身份验证部署分片集群。
集群用户
分片集群支持基于角色的访问控制 (RBAC),用于限制对集群数据和操作的未授权访问。您必须使用选项启动 mongod
集群中的每个服务器,包括配置服务器,--auth
以强制执行 RBAC。或者,为集群间安全实施内部/节点身份验证也可以通过 RBAC 实现用户访问控制。
强制执行 RBAC 后,客户必须指定一个--username
, --password
, 和 --authenticationDatabase
当连接到mongos
以访问集群资源时。
每个集群都有自己的集群用户。这些用户不能用于访问单个分片。
有关启用将用户添加到启用 RBAC 的 MongoDB 部署的教程,请参阅启用访问控制。
元数据操作
mongos
"majority"
对影响分片集群元数据的以下操作使用写关注:
附加信息
燃料电池汽车兼容性
当mongos
尝试连接到mongod
其 功能兼容版本 (fCV)大于mongos
. 例如,您不能将 MongoDB 4.0版本连接mongos
到fCV设置为4.2的4.2分 片集群。但是,您可以将 MongoDB 4.0版本 连接到4.2分片集群,并将fCV设置为4.0 。mongos
连接池
从 MongoDB 4.2 开始,MongoDB 添加了参数 ShardingTaskExecutorPoolReplicaSetMatching
. 这个参数决定了 mongod
/mongos
实例的连接池到分片集群的每个节点的最小大小。该值在运行时可能会有所不同。
mongod
并mongos
为分片集群中的每个副本集维护到每个副本集的连接池。默认情况下,这些池的连接数至少是与主池的连接数。
要修改,请参阅ShardingTaskExecutorPoolReplicaSetMatching
。
将聚合管道与集群一起使用
有关分片如何与聚合一起工作的更多信息,请阅读实用的 MongoDB 聚合 电子书。
参见
原文 - Router (mongos)
译者:陆文龙