On this page本页内容
mongos
Handles Query Modifiersmongos
如何处理查询修饰符mongos
Instancesmongos
实例的连接MongoDB MongoDB mongos
instances route queries and write operations to shards in a sharded cluster. mongos
实例将查询和写入操作路由到分片集群中的分片。从应用程序的角度来看,mongos
provide 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
通过缓存配置服务器中的元数据来跟踪哪个分片上有哪些数据。The mongos
uses the metadata to route operations from applications and clients to the mongod
instances. mongos
使用元数据将操作从应用程序和客户端路由到mongod
实例。A mongos
has no persistentstate and consumes minimal system resources.mongos
没有persistentstate,消耗的系统资源最少。
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
的数量和发行版。
A mongos
instance routes a query to a cluster by:mongos
实例通过以下方式将查询路由到集群:
The 然后,mongos
then merges the data from each of the targeted shards and returns the result document. mongos
合并来自每个目标分片的数据,并返回结果文档。Certain query modifiers, such as sorting, are performed on each shard before 在mongos
retrieves the results.mongos
检索结果之前,会对每个分片执行某些查询修饰符,例如排序。
Changed in version 3.6.在版本3.6中更改。
mongos
where the results are then merged.mongos
,然后在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 will run 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 will include three json objects. 返回将包括三个json对象。mergeType
shows where the stage of the merge happens ("primaryShard", "anyShard", or "mongos"). mergeType
显示合并阶段发生的位置(“primaryShard”、“anyShard”或“mongos”)。splitPipeline
shows which operations in your pipeline have run on individual shards. splitPipeline
显示管道中的哪些操作已在单个分片上运行。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.有关定向和广播操作的更多信息,请参阅定向操作与广播操作。
Starting in MongoDB 4.4, 从MongoDB 4.4开始,mongos
can support hedge reads to minimize latencies. mongos
可以支持对冲读取以最小化延迟。See hedge reads for more information.更多信息请参见hedge reads。
mongos
Handles Query Modifiersmongos
如何处理查询修饰符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”。
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
实例会将该限制传递给分片,然后在将结果返回给客户端之前将该限制重新应用于结果。
If the query specifies a number of records to skip using the 如果查询使用skip()
cursor method, the mongos
cannotpass 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
will pass the limit plus the value of the skip()
to the shards to improve the efficiency of these operations.limit()
结合使用时,mongos
会将limit加上skip()
的值传递给分片,以提高这些操作的效率。
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.有关读取首选项和分片群集的详细信息,请参阅读取首选项和分片。
Starting in version 4.4, 从4.4版开始,mongos
instances can hedge reads that use non-primary
read preferences. mongos
实例可以对冲使用非主读取首选项的读取。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
.maxTimeMSForHedgedReads
的maxTimeMS
值。
Hedged reads are supported for the following operations:以下操作支持模糊读取:
Hedged reads are specified per operation as part of the read preference. 作为读取首选项的一部分,每个操作都会指定模糊读取。Non-非主要阅读首选项支持模糊阅读。primary
read preferences support hedged reads. See Hedged Read Preference Option.请参阅模糊阅读首选项选项。
primary
read preference, refer to the driver read preference API documentation.primary
读取首选项指定模糊读取,请参阅驱动程序读取首选项API文档。nearest
enables the hedged read option by default.nearest
会启用模糊读取选项。For details on read preference and sharded clusters as well as member selection, see Read Preference and Shards.有关读取首选项和分片群集以及成员选择的详细信息,请参阅读取首选项和分片。
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.mongos
不会使用对冲读取,无论为读取首选项指定了hedge
(对冲)选项。
The command 命令serverStatus
and its corresponding mongosh
method db.serverStatus()
return hedgingMetrics
.serverStatus
及其对应的mongosh
方法db.serverStatus()
返回hedgingMetrics
。
mongos
Instancesmongos
实例的连接To detect if the MongoDB instance that your client is connected to is 要检测客户端连接的MongoDB实例是否为mongos
, use the hello
command. mongos
,请使用hello
命令。When a client connects to a 当客户端字符串连接到mongos
, hello
returns a document with a msg
field that holds the string isdbgrid
. hello
时,isdbgrid
字符串将返回到该msg
字段。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
字符串。
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.这些目标操作使用shard键值来定位满足查询文档的shard或shard子集。
For queries that don't include the shard key, 对于不包含shard键的查询,mongos
must query all shards, wait for their responses and then return the result to the application. mongos
必须查询所有shard,等待它们的响应,然后将结果返回给应用程序。These "scatter/gather" queries can be long running 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
可以确定哪个分片或分片的子集存储此数据。
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()
方法是广播操作,除非查询文档完整地指定了shard键。
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.mongos
使用shard key值来定位其范围包括shard key值的块,并将查询指向包含该块的块。
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()
操作都必须在查询文档中包含shard key或_id
。MongoDB 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
仍然可以执行广播操作来完成这些查询。
If the query does not include the shard key, the 如果查询不包括分片键,mongos
must send the query to all shards as a "scatter/gather" operation. mongos
必须将查询作为“分散/聚集”操作发送到所有分片。Each shard will, in turn, use either the shard key index or another more efficient index to fulfill the query.每个分片将依次使用分片键索引或另一个更有效的索引来完成查询。
If the query includes multiple sub-expressions that reference the fields indexed by the shard key and the secondary index, the 如果查询包含多个子表达式,这些子表达式引用由分片键和辅助索引索引的字段,mongos
can route the queries to a specific shard and the shard will use the index that will allow it to fulfill most efficiently.mongos
可以将查询路由到特定分片,分片将使用允许其最有效地完成的索引。
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.mongod
或mongos
,以强制执行内部身份验证。
Starting in MongoDB 5.3, SCRAM-SHA-1 cannot be used for intra-cluster authentication. 从MongoDB 5.3开始,SCRAM-SHA-1不能用于集群内身份验证。Only SCRAM-SHA-256 is supported.仅支持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.有关部署安全分片集群的教程,请参阅使用密钥文件身份验证部署分片集群。
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 在实施RBAC的情况下,客户端在连接到--username
, --password
, and --authenticationDatabase
when connecting to the mongos
in order to access cluster resources.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部署的教程,请参阅启用访问控制。
mongos
uses "majority"
write concern for the following operations that affect the sharded cluster metadata:写下影响分片群集元数据的以下操作的注意事项:
Starting in MongoDB 4.0, the 从MongoDB 4.0开始,当试图连接到功能兼容性版本(fCV)高于mongos
binary will crash when attempting to connect to mongod
instances whose feature compatibility version (fCV) is greater than that of the mongos
. mongos
的mongod
实例时,mongos
二进制文件将崩溃。For example, you cannot connect a MongoDB 4.0 version 例如,不能将MongoDB 4.0版mongos
to a 4.2 sharded cluster with fCV set to 4.2. mongos
连接到fCV设置为4.2的4.2分片集群。You can, however, connect a MongoDB 4.0 version 但是,您可以将MongoDB 4.0版本的mongos
to a 4.2 sharded cluster with fCV set to 4.0.mongos
连接到fCV设置为4.0的4.2分片集群。
Starting in MongoDB 4.2, MongoDB adds the parameter 从MongoDB 4.2开始,MongoDB添加了参数ShardingTaskExecutorPoolReplicaSetMatching
. ShardingTaskExecutorPoolReplicaSetMatching
。This 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. mongod
和mongos
为分片集群中的每个副本集维护到每个副本集的连接池。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
。
For more information on how sharding works with aggregations, read the sharding chapter in the Practical MongoDB Aggregations e-book.有关分片如何与聚合一起工作的更多信息,请阅读实用MongoDB聚合电子书中的分片一章。