Docs HomeMongoDB Manual

mongos

MongoDB mongos instances route queries and write operations to shards in a sharded cluster. MongoDB mongos实例将查询和写入操作路由到分片集群中的分片mongos provides the only interface to a sharded cluster from the perspective of applications. 从应用程序的角度来看,mongos为分片集群提供了唯一的接口。Applications never connect or communicate directly with the shards.应用程序从不与分片直接连接或通信。

The mongos tracks what data is on which shard by caching the metadata from the config servers. mongos通过缓存config服务器中的元数据来跟踪哪个分片上的数据。The mongos uses the metadata to route operations from applications and clients to the mongod instances. mongos使用元数据将操作从应用程序和客户端路由到mongod实例。A mongos has no persistent state and consumes minimal system resources.mongos没有持久状态,并且消耗最少的系统资源。

The most common practice is to run mongos instances on the same systems as your application servers, but you can maintain mongos instances on the shards or on other dedicated resources. 最常见的做法是在与应用程序服务器相同的系统上运行mongos实例,但您可以在分片或其他专用资源上维护mongos示例。See also Number of mongos and Distribution.另请参阅mongos的数量和分布

Routing And Results Process路由和结果流程

A mongos instance routes a query to a cluster by:mongos实例通过以下方式将查询路由到集群

  1. Determining the list of shards that must receive the query.确定必须接收查询的分片列表。
  2. Establishing a cursor on all targeted shards.在所有目标分片上建立游标。

The mongos then merges the data from each of the targeted shards and returns the result document. Certain query modifiers, such as sorting, are performed on each shard before mongos retrieves the results.mongos然后合并来自每个目标分片的数据,并返回结果文档。在mongos检索结果之前,会对每个分片执行某些查询修饰符,例如排序

Aggregation operations聚合操作 running on multiple shards may route results back to the mongos to merge results if they don't need to run on the database's primary shard.如果不需要在数据库的主分片上运行,那么在多个分片上运行可能会将结果路由回mongos以合并结果。

There are two cases in which a pipeline is ineligible to run on mongos.有两种情况下,管道没有资格在mongos上运行。

The first case occurs when the merge part of the split pipeline contains a stage which must run on a primary shard. 第一种情况发生在拆分管道的合并部分包含必须在主分片上运行的阶段时。For instance, if $lookup requires access to an unsharded collection in the same database as the sharded collection on which the aggregation is running, the merge is obliged to run on the primary shard.例如,如果$lookup需要访问与运行聚合的分片集合位于同一数据库中的未排序集合,则合并必须在主分片上运行。

The second case occurs when the merge part of the split pipeline contains a stage which may write temporary data to disk, such as $group, and the client has specified allowDiskUse:true. 第二种情况发生在拆分管道的合并部分包含可以将临时数据写入磁盘的阶段(如$group),并且客户端已指定allowDiskUse:true时。In this case, assuming that there are no other stages in the merge pipeline which require the primary shard, the merge runs on a randomly-selected shard in the set of shards targeted by the aggregation.在这种情况下,假设合并管道中没有其他阶段需要主分片,则合并在聚合目标分片集中随机选择的分片上运行。

For more information on how the work of aggregation is split among components of a sharded cluster query, use explain:true as a parameter to the aggregate() call. 有关如何在分片集群查询的组件之间分配聚合工作的更多信息,请使用explain:true作为aggregate()调用的参数。The return includes three json objects. mergeType shows where the stage of the merge happens ("primaryShard", "anyShard", or "mongos"). 返回包含三个json对象。mergeType显示合并阶段发生的位置("primaryShard""anyShard""mongos")。splitPipeline shows which operations in your pipeline have run on individual shards. 显示管道中的哪些操作已在单个分片上运行。shards shows the work each shard has done.显示了每个分片所做的工作。

In some cases, when the shard key or a prefix of the shard key is a part of the query, the mongos performs a targeted operation, routing queries to a subset of shards in the cluster.在某些情况下,当分片键或分片键的前缀是查询的一部分时,mongos会执行定向操作,将查询路由到集群中的分片子集。

mongos performs a broadcast operation for queries that do not include the shard key, routing queries to all shards in the cluster. mongos对不包括分片键的查询执行广播操作,将查询路由到集群中的所有分片。Some queries that do include the shard key may still result in a broadcast operation depending on the distribution of data in the cluster and the selectivity of the query.根据集群中数据的分布和查询的选择性,一些包含分片键的查询可能仍会导致广播操作。

See Targeted Operations vs. Broadcast Operations for more on targeted and broadcast operations.有关定向操作和广播操作的更多信息,请参阅定向操作与广播操作的对比

mongos can support hedged reads to minimize latencies. See hedged reads for more information.mongos可以支持对冲读取以最大限度地减少延迟。有关更多信息,请参阅对冲读取

How mongos Handles Query Modifiersmongos如何处理查询修饰符

Sorting排序

If the result of the query is not sorted, the mongos instance opens a result cursor that "round robins" results from all cursors on the shards.如果查询的结果没有排序,mongos实例会打开一个结果游标,该游标从分片上的所有游标中“round-robins”得到结果。

Limits限制

If the query limits the size of the result set using the limit() cursor method, the mongos instance passes that limit to the shards and then re-applies the limit to the result before returning the result to the client.如果查询使用limit()游标方法限制结果集的大小,mongos实例会将该限制传递给分片,然后在将结果返回给客户端之前将该限制重新应用于结果。

Skips跳过

If the query specifies a number of records to skip using the skip() cursor method, the mongos cannot pass the skip to the shards, but rather retrieves unskipped results from the shards and skips the appropriate number of documents when assembling the complete result.如果查询使用skip()游标方法指定了要跳过的记录数,则mongos无法将跳过传递给分片,而是从分片中检索未跳过的结果,并在组装完整结果时跳过适当数量的文档。

When used in conjunction with a limit(), the mongos passes the limit plus the value of the skip() to the shards to improve the efficiency of these operations.当与limit()一起使用时,mongos限制加上skip()的值传递给分片,以提高这些操作的效率。

Read Preference and Shards读取首选项和分片

For sharded clusters, mongos applies the read preference when reading from the shards. 对于分片集群,mongos在从分片读取时应用读取首选项。The member selected is governed by both the read preference and replication.localPingThresholdMs settings, and is re-evaluated for each operation.所选成员由读取首选项replication.localPingThresholdMs设置控制,并为每个操作重新评估。

For details on read preference and sharded clusters, see Read Preference and Shards.有关读取首选项和分片群集的详细信息,请参阅读取首选项与分片

Hedged Reads对冲读取

Starting in version 4.4, mongos instances can hedge reads that use non-primary read preferences. 从4.4版本开始,mongos实例可以对冲使用非primary读取首选项的读取。With hedged reads, the mongos instances route read operations to two replica set members per each queried shard and return results from the first respondent per shard. 使用对冲读取,mongos实例将读取操作路由到每个查询的分片的两个副本集成员,并返回每个分片的第一个响应者的结果。The additional read sent to hedge the read operation uses the maxTimeMS value of maxTimeMSForHedgedReads.为对冲读取操作而发送的附加读取使用maxTimeMSForHedgedReadsmaxTimeMS值。

Hedged reads are supported for the following operations:套期保值读数支持以下操作:

Hedged Reads and Read Preference对冲读取与读取偏好

Hedged reads are specified per operation as part of the read preference. 对冲读取是作为读取偏好的一部分按操作指定的。Non-primary read preferences support hedged reads. primary读取偏好支持对冲读取。See Hedged Read Preference Option.请参阅对冲读取偏好选项

For details on read preference and sharded clusters as well as member selection, see Read Preference and Shards.有关读取首选项和分片群集以及成员选择的详细信息,请参阅读取首选项与分片

Enable/Disable Support for Hedged Reads启用/禁用对冲读取支持

By default, mongos instances support using hedged reads. 默认情况下,mongos实例支持使用对冲读取。To turn off a mongos instance's support for hedged reads, see the readHedgingMode parameter. 要关闭mongos实例对对冲读取的支持,请参阅readHedgingMode参数。If the hedged read support is off, mongos does not use hedged reads regardless of the hedge option specified for the read preference.如果对冲读取支持关闭,无论为读取偏好指定的hedge选项如何,mongos都不会使用对冲读取。

Hedged Reads Diagnostics套期保值读取诊断

The command serverStatus and its corresponding mongosh method db.serverStatus() return hedgingMetrics.命令serverStatus及其相应的mongosh方法db.serverStatus()返回hedgingMetrics

Confirm Connection to mongos Instances确认连接到mongos实例

To detect if the MongoDB instance that your client is connected to is mongos, use the hello command. 要检测客户端连接的MongoDB实例是否为mongos,请使用hello命令。When a client connects to a mongos, hello returns a document with a msg field that holds the string isdbgrid. 当客户端连接到mongos时,hello会返回一个包含字符串isdbgridmsg字段的文档。For example:例如:

{
"isWritablePrimary" : true,
"msg" : "isdbgrid",
"maxBsonObjectSize" : 16777216,
"ok" : 1,
...
}

If the application is instead connected to a mongod, the returned document does not include the isdbgrid string.如果应用程序连接到mongod,则返回的文档不包括isdbgrid字符串。

Targeted Operations vs. Broadcast Operations定向操作与广播操作的对比

Generally, the fastest queries in a sharded environment are those that mongos route to a single shard, using the shard key and the cluster meta data from the config server. 通常,在分片环境中,最快的查询是mongos使用配置服务器中的分片键和集群元数据路由到单个分片的查询。These targeted operations use the shard key value to locate the shard or subset of shards that satisfy the query document.这些定向操作使用分片键值来定位满足查询文档的分片或分片子集。

For queries that don't include the shard key, mongos must query all shards, wait for their responses and then return the result to the application. 对于不包括分片键的查询,mongos必须查询所有分片,等待它们的响应,然后将结果返回给应用程序。These "scatter/gather" queries can be long running operations.这些“分散/聚集”查询可能是长时间运行的操作。

Broadcast Operations广播操作

mongos instances broadcast queries to all shards for the collection unless the mongos can determine which shard or subset of shards stores this data.mongos实例向集合的所有分片广播查询,除非mongos可以确定哪个分片或分片的子集存储这些数据。

Read operations to a sharded cluster. Query criteria does not include the shard key. The query router ``mongos`` must broadcast query to all shards for the collection.

After the mongos receives responses from all shards, it merges the data and returns the result document. mongos接收到所有分片的响应后,会合并数据并返回结果文档。The performance of a broadcast operation depends on the overall load of the cluster, as well as variables like network latency, individual shard load, and number of documents returned per shard. 广播操作的性能取决于集群的总体负载,以及网络延迟、单个分片负载和每个分片返回的文档数等变量。Whenever possible, favor operations that result in targeted operation over those that result in a broadcast operation.只要可能,优先于导致定向操作的操作,而不是导致广播操作的操作。

Multi-update operations are always broadcast operations.多更新操作始终是广播操作。

The updateMany() and deleteMany() methods are broadcast operations, unless the query document specifies the shard key in full.updateMany()deleteMany()方法是广播操作,除非查询文档完全指定了分片键。

Targeted Operations定向操作

mongos can route queries that include the shard key or the prefix of a compound shard key a specific shard or set of shards. 可以路由包括分片键或复合分片键前缀的查询,即特定的分片或一组分片。mongos uses the shard key value to locate the chunk whose range includes the shard key value and directs the query at the shard containing that chunk.使用分片键值来定位其范围包括分片键值的区块,并将查询指向包含该区块的分片

Read operations to a sharded cluster. Query criteria includes the shard key. The query router ``mongos`` can target the query to the appropriate shard or shards.

For example, if the shard key is:例如,如果分片关键帧为:

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

The mongos program can route queries that include the full shard key or either of the following shard key prefixes at a specific shard or set of shards:mongos程序可以在特定的分片或一组分片上路由包括完整分片键或以下任何一个分片键前缀的查询:

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

All insertOne() operations target to one shard. 所有insertOne()操作都以一个分片为目标。Each document in the insertMany() array targets to a single shard, but there is no guarantee all documents in the array insert into a single shard.insertMany()数组中的每个文档都以单个分片为目标,但不能保证数组中的所有文档都插入到单个分片中。

All updateOne(), replaceOne() and deleteOne() operations must include the shard key or _id in the query document. 所有updateOne()replaceOne()deleteOne()操作都必须在查询文档中包含分片键_idMongoDB returns an error if these methods are used without the shard key or _id.如果使用这些方法时不带分片键或_id,MongoDB将返回一个错误。

Depending on the distribution of data in the cluster and the selectivity of the query, mongos may still perform a broadcast operation to fulfill these queries.根据集群中数据的分布和查询的选择性,mongos仍然可以执行广播操作来完成这些查询。

Index Use索引使用

When a shard receives a query, it uses the most efficient index available to fulfill that query. 当分片接收到查询时,它会使用最有效的索引来完成该查询。The index used may be either the shard key index or another eligible index present on the shard.所使用的索引可以是分片键索引,也可以是分片上存在的另一个合格索引。

Sharded Cluster Security分片集群安全

Use Internal/Membership Authentication to enforce intra-cluster security and prevent unauthorized cluster components from accessing the cluster. 使用内部/成员身份验证来加强集群内的安全性,并防止未经授权的集群组件访问集群。You must start each mongod or mongos in the cluster with the appropriate security settings in order to enforce internal authentication.您必须使用适当的安全设置启动集群中的每个mongodmongos,以便强制执行内部身份验证。

Starting in MongoDB 5.3, SCRAM-SHA-1 cannot be used for intra-cluster authentication. Only SCRAM-SHA-256 is supported.从MongoDB 5.3开始,SCRAM-SHA-1不能用于集群内身份验证。仅支持SCRAM-SHA-256

In previous MongoDB versions, SCRAM-SHA-1 and SCRAM-SHA-256 can both be used for intra-cluster authentication, even if SCRAM is not explicitly enabled.在以前的MongoDB版本中,SCRAM-SHA-1和SCRAM-SHA-256都可以用于集群内身份验证,即使SCRAM没有明确启用。

See Deploy Sharded Cluster with Keyfile Authentication for a tutorial on deploying a secured sharded cluster.有关部署安全分片集群的教程,请参阅使用键文件身份验证部署分片集群

Cluster Users群集用户

Sharded clusters support Role-Based Access Control (RBAC) for restricting unauthorized access to cluster data and operations. 共享集群支持基于角色的访问控制(RBAC),用于限制对集群数据和操作的未经授权的访问。You must start each mongod in the cluster, including the config servers, with the --auth option in order to enforce RBAC. 必须使用--auth选项启动集群中的每个mongod,包括配置服务器,才能强制执行RBAC。Alternatively, enforcing Internal/Membership Authentication for inter-cluster security also enables user access controls via RBAC.或者,为集群间安全性实施内部/成员身份验证也可以通过RBAC实现用户访问控制。

With RBAC enforced, clients must specify a --username, --password, and --authenticationDatabase when connecting to the mongos in order to access cluster resources.在实施RBAC的情况下,客户端在连接到mongos时必须指定--username--password--authenticationDatabase才能访问集群资源。

Each cluster has its own cluster users. These users cannot be used to access individual shards.每个集群都有自己的集群用户。这些用户不能用于访问单个分片。

See Enable Access Control for a tutorial on enabling adding users to an RBAC-enabled MongoDB deployment.请参阅启用访问控制以获取有关启用向启用RBAC的MongoDB部署添加用户的教程。

Metadata Operations元数据操作

mongos uses "majority" write concern for the following operations that affect the sharded cluster metadata:对以下影响分片集群元数据的操作使用"majority"写关注:

Command命令Method方法Note备注
addShardsh.addShard()
createdb.createCollection()
dropdb.collection.drop()
dropDatabasedb.dropDatabase()Changed in MongoDB 3.6在MongoDB 3.6中更改
enableShardingsh.enableSharding()
movePrimary
renameCollectiondb.collection.renameCollection()
shardCollectionsh.shardCollection()
removeShard
setFeatureCompatibilityVersion

Additional Information附加信息

fCV CompatibilityfCV兼容性

The mongos binary cannot connect to mongod instances whose feature compatibility version (fCV) is greater than that of the mongos. mongos二进制文件无法连接到功能兼容性版本(fCV)高于mongosmongod实例。For example, you cannot connect a MongoDB 4.0 version mongos to a 4.2 sharded cluster with fCV set to 4.2. 例如,不能将MongoDB 4.0版本的mongos连接到fCV设置为4.2的4.2分片集群。You can, however, connect a MongoDB 4.0 version mongos to a 4.2 sharded cluster with fCV set to 4.0.但是,您可以将MongoDB 4.0版本的mongos连接到一个fCV设置为4.0的4.2分片集群。

Full Time Diagnostic Data Capture Requirements全职诊断数据采集要求

mongod includes a Full Time Diagnostic Data Capture mechanism to assist MongoDB engineers with troubleshooting deployments. mongod包括一个全职诊断数据捕获机制,以帮助MongoDB工程师进行故障排除部署。If this thread fails, it terminates the originating process. 如果这个线程失败,它将终止发起进程。To avoid the most common failures, confirm that the user running the process has permissions to create the FTDC diagnostic.data directory. 为了避免最常见的故障,请确认运行进程的用户具有创建FTDC诊断数据目录的权限。For mongod the directory is within storage.dbPath. 对于mongod,目录位于storage.dbPath中。For mongos it is parallel to systemLog.path.对于mongos,它与systemLog.path并行。

Connection Pools连接池

Starting in MongoDB 4.2, MongoDB adds the parameter ShardingTaskExecutorPoolReplicaSetMatching. 从MongoDB 4.2开始,MongoDB添加了参数ShardingTaskExecutorPoolReplicaSetMatchingThis parameter determines the minimum size of the mongod / mongos instance's connection pool to each member of the sharded cluster. 此参数确定mongod/mongos实例到分片集群每个成员的连接池的最小大小。This value can vary during runtime.此值在运行时可能会发生变化。

mongod and mongos maintain connection pools to each replica set secondary for every replica set in the sharded cluster. mongodmongos为分片集群中的每个副本集维护到每个副本集的连接池。By default, these pools have a number of connections that is at least the number of connections to the primary.默认情况下,这些池具有的连接数至少是到主池的连接数。

To modify, see ShardingTaskExecutorPoolReplicaSetMatching.要进行修改,请参阅分片ShardingTaskExecutorPoolReplicaSetMatching

Using Aggregation Pipelines with Clusters将聚合管道与集群一起使用

For more information on how sharding works with aggregations, read the sharding chapter in the Practical MongoDB Aggregations e-book.有关分片如何使用聚合的更多信息,请阅读实用MongoDB聚合电子书中的分片章节。