mongos

mongos 通过缓存来自配置服务器的元数据来跟踪哪些数据在哪个分片上。 mongos 使用元数据将操作从应用程序和客户端路由到 mongod 实例。 mongos 没有持久状态并且消耗最少的系统资源。

最常见的做法是在与应用程序服务器相同的系统上运行 mongos 实例,但您可以在分片或其他专用资源上维护 mongos 实例。 另见 mongos 数量和分布。

MongoDBmongos实例将查询和写入操作路由到分片集群中的分片。mongos从应用程序的角度为分片集群提供唯一的接口。应用程序从不直接与分片连接或通信。

mongos通过缓存来自配置服务器的元数据来跟踪哪些数据在哪个分片上。mongos使用元数据将操作从应用程序和客户端路由到mongod 实例。mongos没有持久 状态并且消耗最少的系统资源。

最常见的做法是mongos在与应用程序服务器相同的系统上运行mongos实例,但您可以在分片或其他专用资源上维护mongos实例。另见mongos数量和分布。

路由和结果过程

实例通过以下方式将mongos查询路由到集群

  1. 确定必须接收查询的分片列表。
  2. 在所有目标分片上建立游标。

然后 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 实例将读取操作路由到每个查询分片的两个副本集节点,并从每个分片的第一个响应者返回结果。为对冲读取操作而发送的附加读取使用maxTimeMSForHedgedReadsmaxTimeMS值。

以下操作支持对冲读取:

对冲阅读和阅读偏好

对冲读取在每个操作中指定为读取首选项的一部分。非primary 阅读偏好支持对冲阅读。请参阅对冲阅读偏好选项。

有关读取首选项和分片集群以及节点选择的详细信息,请参阅读取首选项和碎片。

启用/禁用对冲读取的支持

默认情况下,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`` 必须向集合的所有分片广播查询。

mongos收到所有分片的响应后,它会合并数据并返回结果文档。广播操作的性能取决于集群的整体负载,以及网络延迟、单个分片负载和每个分片返回的文档数量等变量。只要有可能,支持导致以下结果的操作针对性操作超过那些导致广播操作的。

多次更新操作始终是广播操作。

和方法是广播操作updateMany()deleteMany()除非查询文档完整指定分片键。

针对性操作

mongos可以将包含分片键或复合分片键前缀的查询路由到特定分片或一组分片。mongos使用分片键值定位其范围包括分片键值的 ,并将查询定向到包含该块的分片。

对分片集群的读取操作。 查询条件包括分片键。 查询路由器“mongos”可以将查询定位到适当的分片或分片。

例如,如果分片键是:

{ a: 1, b: 1, c: 1 }

mongos程序可以在特定分片或一组分片中路由包含完整分片键或以下任一分片键前缀的查询:

{ a: 1 }
{ a: 1, b: 1 }

所有insertOne()操作都针对一个分片。数组中的每个文档都insertMany()指向单个分片,但不能保证数组中的所有文档都插入到单个分片中。

所有updateOne(), replaceOne()deleteOne() 操作必须包含分片_id在查询文档中。如果在没有分片键或_id.

根据集群中数据的分布和查询的选择性,mongos可能仍然会执行一个广播操作来满足这些查询。

索引使用

当分片收到查询时,它会使用最有效的索引来完成该查询。使用的索引可以是分 片键索引或分片上存在的另一个合格索引。

分片集群安全

使用内部/节点身份验证来实施集群内安全并防止未经授权的集群组件访问集群。您必须使用适当的安全设置启动每个mongodmongos在集群中以强制执行内部身份验证。

从 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"对影响分片集群元数据的以下操作使用写关注:

命令 方法 笔记
addShard sh.addShard()
create db.createCollection()
drop db.collection.drop()
dropDatabase db.dropDatabase() 在 MongoDB 3.6 中更改
enableSharding sh.enableSharding()
movePrimary
renameCollection db.collection.renameCollection()
shardCollection sh.shardCollection()
removeShard
setFeatureCompatibilityVersion

附加信息

燃料电池汽车兼容性

mongos尝试连接到mongod功能兼容版本 (fCV)大于mongos. 例如,您不能将 MongoDB 4.0版本连接mongosfCV设置为4.2的4.2分 片集群。但是,您可以将 MongoDB 4.0版本 连接到4.2分片集群,并将fCV设置为4.0 。mongos

连接池

从 MongoDB 4.2 开始,MongoDB 添加了参数 ShardingTaskExecutorPoolReplicaSetMatching. 这个参数决定了 mongod/mongos实例的连接池到分片集群的每个节点的最小大小。该值在运行时可能会有所不同。

mongodmongos为分片集群中的每个副本集维护到每个副本集的连接池。默认情况下,这些池的连接数至少是与主池的连接数。

要修改,请参阅ShardingTaskExecutorPoolReplicaSetMatching

将聚合管道与集群一起使用

有关分片如何与聚合一起工作的更多信息,请阅读实用的 MongoDB 聚合 电子书。

参见

原文 - Router (mongos)

译者:陆文龙

Copyright © 上海锦木信息技术有限公司 all right reserved,powered by Gitbook文件修订时间: 2023-09-01 17:10:26

results matching ""

    No results matching ""