On this page本页内容
Index builds can impact sharded cluster performance. 索引构建可能会影响分片集群的性能。By default, MongoDB 4.4 and later build indexes simultaneously on all data-bearing replica set members. 默认情况下,MongoDB 4.4和更高版本在所有承载数据的副本集成员上同时构建索引。Index builds on sharded clusters occur only on those shards which contain data for the collection being indexed. 基于分片集群的索引构建仅发生在包含要索引的集合数据的分片上。For workloads which cannot tolerate performance decrease due to index builds, consider using the following procedure to build indexes in a rolling fashion.对于不能容忍由于索引生成而导致性能下降的工作负载,请考虑使用以下过程以滚动方式生成索引。
Rolling index builds take at most one shard replica set member out at a time, starting with the secondary members, and builds the index on that member as a standalone. 滚动索引构建一次最多取出一个分片副本集成员,从辅助成员开始,并将该成员作为独立成员构建索引。Rolling index builds require at least one replica set election per shard.滚动索引构建要求每个分片至少选择一个副本集。
To create unique indexes using the following procedure, you must stop all writes to the collection during this procedure.要使用以下过程创建唯一索引,必须在此过程中停止对集合的所有写入。
If you cannot stop all writes to the collection during this procedure, do not use the procedure on this page. 如果在此过程中无法停止对集合的所有写入,请不要使用此页上的过程。Instead, build your unique index on the collection by issuing 相反,通过在db.collection.createIndex()
on the mongos
for a sharded cluster.mongos
上为分片集群发出db.collection.createIndex()
,在集合上构建您的唯一索引。
Ensure that your oplog is large enough to permit the indexing or re-indexing operation to complete without falling too far behind to catch up. 确保oplog足够大,以允许索引或重新索引操作完成,而不会落后太多而无法赶上。See the oplog sizing documentation for additional information.有关更多信息,请参阅oplog大小调整文档。
To create unique indexes using the following procedure, you must stop all writes to the collection during the index build. 要使用以下过程创建唯一索引,必须在索引生成期间停止对集合的所有写入。Otherwise, you may end up with inconsistent data across the replica set members. 否则,您可能会在副本集成员之间得到不一致的数据。If you cannot stop all writes to the collection, do not use the following procedure to create unique indexes.如果无法停止对集合的所有写入,请不要使用以下过程创建唯一索引。
If you cannot stop all writes to the collection, do not use the following procedure to create unique indexes.如果无法停止对集合的所有写入,请不要使用以下过程创建唯一索引。
db.collection.dropIndex()
from a mongos
to drop the index from the collection.mongos
发出db.collection.dropIndex()
以从集合中删除索引。The following procedure to build indexes in a rolling fashion applies to sharded clusters deployments, and not replica set deployments. 以下以滚动方式构建索引的过程适用于分片集群部署,而不是副本集部署。For the procedure for replica sets, see Rolling Index Builds on Replica Sets instead.有关副本集的过程,请参阅基于副本集的滚动索引构建。
Connect 将mongosh
to a mongos
instance in the sharded cluster, and run sh.stopBalancer()
to disable the balancer: mongosh
连接到分片集群中的mongos
实例,并运行sh.stopBalancer()
禁用平衡器:[1]
sh.stopBalancer()
If a migration is in progress, the system will complete the in-progress migration before stopping the balancer.如果正在进行迁移,系统将在停止平衡器之前完成正在进行的迁移。
To verify that the balancer is disabled, run 要验证平衡器是否已禁用,请运行sh.getBalancerState()
, which returns false if the balancer is disabled:sh.getBalancerState()
,如果平衡器已禁用,则返回false
:
sh.getBalancerState()
[1] | sh.stopBalancer() also disables auto-splitting for the sharded cluster.sh.stopBalancer() 还禁用分片集群的自动拆分。 |
From 从连接到mongosh
connected to the mongos
, refresh the cached routing table for that mongos
to avoid returning stale distribution information for the collection. mongos
的mongosh
,刷新该mongos
缓存的路由表,以避免返回集合的过时分发信息。Once refreshed, run 刷新后,为要构建索引的集合运行db.collection.getShardDistribution()
for the collection you wish to build the index.db.collection.getShardDistribution()
。
For example, if you want to an ascending index on the 例如,如果要对records
collection in the test
database:test
数据库中的records
集合建立升序索引:
db.adminCommand( { flushRouterConfig: "test.records" } ); db.records.getShardDistribution();
The method outputs the shard distribution. 该方法输出分片分布。For example, consider a sharded cluster with 3 shards 例如,考虑一个具有3个分片shardA
, shardB
, and shardC
and the db.collection.getShardDistribution()
returns the following:shardA
、shardB
和shardC
的分片集群,db.collection.getShardDistribution()
返回以下内容:
Shard shardA at shardA/s1-mongo1.example.net:27018,s1-mongo2.example.net:27018,s1-mongo3.example.net:27018 data : 1KiB docs : 50 chunks : 1 estimated data per chunk : 1KiB estimated docs per chunk : 50 Shard shardC at shardC/s3-mongo1.example.net:27018,s3-mongo2.example.net:27018,s3-mongo3.example.net:27018 data : 1KiB docs : 50 chunks : 1 estimated data per chunk : 1KiB estimated docs per chunk : 50 Totals data : 3KiB docs : 100 chunks : 2 Shard shardA contains 50% data, 50% docs in cluster, avg obj size on shard : 40B Shard shardC contains 50% data, 50% docs in cluster, avg obj size on shard : 40B
From the output, you only build the indexes for 从输出中,您只能在test.records
on shardA
and shardC
.shardA
和shardC
上构建test.records
的索引。
For each shard that contains chunks for the collection, follow the procedure to build the index on the shard.对于包含集合块的每个分片,请按照以下步骤在分片上构建索引。
For an affected shard, stop the 对于受影响的分片,请停止与其次要分片之一关联的mongod
process associated with one of its secondary. mongod
进程。Restart after making the following configuration updates:进行以下配置更新后重新启动:
If you are using a configuration file, make the following configuration updates:如果正在使用配置文件,请进行以下配置更新:
Change the 将net.port
to a different port. net.port
更改为其他端口。[2] Make a note of the original port setting as a comment.[2]记录原始端口设置作为注释。
Comment out the 注释掉replication.replSetName
option.replication.replSetName
选项。
Comment out the 注释掉sharding.clusterRole
option.sharding.clusterRole
选项。
Set parameter 在skipShardingConfigurationChecks
(also available for MongoDB 3.6.3+, 3.4.11+, 3.2.19+) to true
in the setParameter
section.setParameter
部分将参数skipShardingConfigurationChecks
(也适用于MongoDB 3.6.3+、3.4.11+、3.2.19+)设置为true
。
Set parameter 在disableLogicalSessionCacheRefresh
to true
in the setParameter
section.setParameter
部分中将参数disableLogicalSessionCacheRefresh
设置为true
。
For example, for a shard replica set member, the updated configuration file will include content like the following example:例如,对于分片副本集成员,更新的配置文件将包含如下示例所示的内容:
net: bindIp: localhost,<hostname(s)|ip address(es)> port: 27218 # port: 27018 #replication: # replSetName: shardA #sharding: # clusterRole: shardsvr setParameter: skipShardingConfigurationChecks: true disableLogicalSessionCacheRefresh: true
And restart:然后重新启动:
mongod --config <path/To/ConfigFile>
Other settings (e.g. 其他设置(如storage.dbPath
, etc.) remain the same.storage.dbPath
等)保持不变。
If using command-line options, make the following configuration updates:如果使用命令行选项,请进行以下配置更新:
Remove 如果是分片成员,请删除--shardsvr
if a shard member and --configsvr
if a config server member.--shardsvr
;如果是config
服务器成员,则删除--configsvr
。
Set parameter 在skipShardingConfigurationChecks
(also available for MongoDB 3.6.3+, 3.4.11+, 3.2.19+) to true
in the --setParameter
option.--setParameter
选项中将参数skipShardingConfigurationChecks
(也适用于MongoDB 3.6.3+、3.4.11+、3.2.19+)设置为true
。
Set parameter 在disableLogicalSessionCacheRefresh
to true
in the --setParameter
option.--setParameter
选项中将参数disableLogicalSessionCacheRefresh
设置为true
。
For example, restart your shard replica set member without the 例如,在不使用--replSet
and --shardsvr
options. --replSet
和--shardsvr
选项的情况下重新启动分片副本集成员。Specify a new port number and set both the 指定新端口号,并将skipShardingConfigurationChecks
and disableLogicalSessionCacheRefresh
parameters to true:skipShardingConfigurationChecks
和disableLogicalSessionCacheRefresh
参数设置为true
:
mongod --port 27218 --setParameter skipShardingConfigurationChecks=true --setParameter disableLogicalSessionCacheRefresh=true
Other settings (e.g. 其他设置(例如--dbpath
, etc.) remain the same.--dbpath
等)保持不变。
[2] | (1, 2) mongod on a different port, you ensure that the other members of the replica set and all clients will not contact the member while you are building the index.mongod ,可以确保副本集的其他成员和所有客户端在构建索引时不会联系该成员。 |
Connect directly to the 直接连接到新端口上作为独立运行的mongod
instance running as a standalone on the new port and create the new index for this instance.mongod
实例,并为此实例创建新索引。
For example, connect 例如,将mongosh
to the instance, and use the db.collection.createIndex()
method to create an ascending index on the username
field of the records
collection:mongosh
连接到实例,并使用db.collection.createIndex()
方法在records
集合的username
字段上创建升序索引:
db.records.createIndex( { username: 1 } )
mongod
as a Replica Set Membermongod
When the index build completes, shutdown the 索引构建完成后,关闭mongod
instance. Undo the configuration changes made when starting as a standalone to return to its original configuration and restart.mongod
实例。撤消以单机启动时所做的配置更改,以返回其原始配置并重新启动。
Be sure to remove the 确保删除skipShardingConfigurationChecks
parameter and disableLogicalSessionCacheRefresh
parameter.skipShardingConfigurationChecks
参数和disableLogicalSessionCacheRefresh
参数。
For example, to restart your replica set shard member:例如,要重新启动副本集分片成员:
If you are using a configuration file:如果正在使用配置文件:
Revert to the original port number.恢复到原始端口号。
Uncomment the 取消对replication.replSetName
.replication.replSetName
的注释。
Uncomment the 取消注释sharding.clusterRole
.sharding.clusterRole
。
Remove parameter 删除skipShardingConfigurationChecks
in the setParameter
section.setParameter
部分中的参数skipShardingConfigurationChecks
。
Remove parameter 删除disableLogicalSessionCacheRefresh
in the setParameter
section.setParameter
部分中的参数disableLogicalSessionCacheRefresh
。
net: bindIp: localhost,<hostname(s)|ip address(es)> port: 27018 replication: replSetName: shardA sharding: clusterRole: shardsvr
Other settings (e.g. 其他设置(如storage.dbPath
, etc.) remain the same.storage.dbPath
等)保持不变。
And restart:然后重新启动:
mongod --config <path/To/ConfigFile>
If you are using command-line options:如果使用命令行选项:
Revert to the original port number.恢复到原始端口号。
Include 如果是分片成员,则包含--shardsvr
if a shard member or --configsvr
if a config server member.--shardsvr
;如果是配置服务器成员,则包括--configsvr
。
Remove parameter 删除参数skipShardingConfigurationChecks
.skipShardingConfigurationChecks
。
Remove parameter 删除参数disableLogicalSessionCacheRefresh
.disableLogicalSessionCacheRefresh
。
For Example:例如:
mongod --port 27018 --replSet shardA --shardsvr
Other settings (e.g. --dbpath
, etc.) remain the same.
Allow replication to catch up on this member.允许复制以捕获此成员。
Once the member catches up with the other members of the set, repeat the procedure one member at a time for the remaining secondary members for the shard:一旦该成员赶上了集合中的其他成员,则对该分片的其余次要成员一次重复一个成员的过程:
When all the secondaries for the shard have the new index, step down the primary for the shard, restart it as a standalone using the procedure described above, and build the index on the former primary:当分片的所有辅助设备都具有新索引时,请关闭分片的主设备,使用上述过程将其作为独立设备重新启动,并在以前的主设备上构建索引:
rs.stepDown()
method in mongosh
to step down the primary. mongosh
中使用rs.stepDown()
方法来逐步降低主。mongod
as a Replica Set Membermongod
Once you finish building the index for a shard, repeat C. Build Indexes on the Shards That Contain Collection Chunks for the other affected shards.完成为一个分片构建索引后,重复C.在包含其他受影响分片的集合块的分片上构建索引。
Once you finish the rolling index build for the affected shards, restart the balancer.完成受影响分片的滚动索引构建后,重新启动平衡器。
Connect 将mongosh
to a mongos
instance in the sharded cluster, and run sh.startBalancer()
: mongosh
连接到分片集群中的mongos
实例,并运行sh.startBalancer()
:[3]
sh.startBalancer()
[3] | sh.startBalancer() also enables auto-splitting for the sharded cluster.sh.startBalancer() 还为分片集群启用自动拆分。 |
A sharded collection has an inconsistent index if the collection does not have the exact same indexes (including the index options) on each shard that contains chunks for the collection. 如果集合在包含集合块的每个分片上没有完全相同的索引(包括索引选项),则分片集合具有不一致的索引。Although inconsistent indexes should not occur during normal operations, inconsistent indexes can occur, such as:虽然在正常操作期间不应出现不一致的索引,但也可能出现不一致索引,例如:
unique
key constraint and one shard contains a chunk with duplicate documents. Starting in MongoDB 4.4 (and 4.2.6), the config server primary periodically checks for index inconsistencies across the shards for sharded collections. 从MongoDB 4.4(和4.2.6)开始,配置服务器主服务器定期检查分片集合的分片之间的索引不一致性。To configure these periodic checks, see 要配置这些定期检查,请参阅启用enableShardedIndexConsistencyCheck
and shardedIndexConsistencyCheckIntervalMS
.enableShardedIndexConsistencyCheck
和shardedIndexConsistencyCheckIntervalMS
。
The command 命令serverStatus
returns the field shardedIndexConsistency
to report on index inconsistencies when run on the config server primary.serverStatus
返回字段shardedIndexConsistency
,以报告在配置服务器主服务器上运行时的索引不一致。
To check if a sharded collection has inconsistent indexes, see Find Inconsistent Indexes across Shards.要检查分片集合是否具有不一致的索引,请参阅查找分片之间的不一致索引。