在分片群集上构建索引
在本页面
为了最大程度地减少在具有副本集分片的“分片群集”上构建索引的影响,请使用以下过程以滚动方式构建索引。有关在副本集部署上构建索引的信息,请参阅在副本集上构建索引。
分片群集部署的以下过程确实一次删除了一个分片副本集的成员。但是,此过程一次只会影响一个成员,而不会同时影响所有次要成员。
Considerations
Unique Indexes
要使用以下过程创建unique indexes,您必须在此过程中停止对集合的所有写操作。
如果在此过程中无法停止对集合的所有写操作,请不要使用此页面上的过程。而是通过在mongos上为分片群集发出db.collection.createIndex()在集合上构建唯一索引。
Oplog Size
确保oplog足够大,以允许完成索引编制或重新索引编制操作,而又不会落后太多。有关其他信息,请参见oplog sizing文档。
Prerequisites
-
用于构建唯一索引
- 要使用以下过程创建unique indexes,必须在索引构建过程中停止对集合的所有写操作。否则,最终可能导致整个副本集成员的数据不一致。如果无法停止对集合的所有写操作,请不要使用以下过程创建唯一索引。
Warning
如果无法停止对集合的所有写操作,请不要使用以下过程创建唯一索引。
Procedure
A.停止平衡器
将mongoShell 连接到分片群集中的mongos实例,然后运行sh.stopBalancer()以禁用平衡器:
sh.stopBalancer()
Note
如果正在进行迁移,则系统将在停止平衡器之前完成正在进行的迁移。
要验证是否禁用了平衡器,请运行sh.getBalancerState(),如果禁用了平衡器,则返回 false:
sh.getBalancerState()
B.确定集合的分布
从连接到mongos的mongo shell 中,刷新该mongos的缓存路由表,以避免返回该集合的陈旧分发信息。刷新后,对要构建索引的集合运行db.collection.getShardDistribution()。
例如,如果要在test
数据库中的records
集合上升序索引:
db.adminCommand( { flushRouterConfig: "test.records" } );
db.records.getShardDistribution();
该方法输出碎片分布。例如,考虑一个具有 3 个分片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
从输出中,您仅在shardA
和shardC
上构建test.records
的索引。
C.在包含集合块的碎片上构建索引
对于每个包含集合块的分片,请按照以下步骤在分片上构建索引。
C1.停止一台辅助服务器并独立运行
对于受影响的分片,停止与其辅助节点之一关联的mongod进程。进行以下配置更新后,重新启动:
If you are using a configuration file, make the following configuration updates:
-
Change the net.port to a different port. [1] Make a note of the original port setting as a comment.
-
Comment out the replication.replSetName option.
-
Comment out the sharding.clusterRole option.
-
Set parameter skipShardingConfigurationChecks (also available for MongoDB 3.6.3+, 3.4.11+, 3.2.19+) to
true
in the setParameter section. -
Set parameter
disableLogicalSessionCacheRefresh
totrue
in the setParameter section.
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.
If using command-line options, make the following configuration updates:
-
Remove --replSet.
-
Remove --shardsvr if a shard member and --configsvr if a config server member.
-
Set parameter skipShardingConfigurationChecks (also available for MongoDB 3.6.3+, 3.4.11+, 3.2.19+) to
true
in the --setParameter option. -
Set parameter
disableLogicalSessionCacheRefresh
totrue
in the --setParameter option.
For example, restart your shard replica set member without the --replSet and --shardsvr options. Specify a new port number and set both the skipShardingConfigurationChecks and disableLogicalSessionCacheRefresh
parameters to true:
mongod --port 27218 --setParameter skipShardingConfigurationChecks=true --setParameter disableLogicalSessionCacheRefresh=true
Other settings (e.g. --dbpath, etc.) remain the same.
[1] | *(1,2)*通过在其他端口上运行mongod,可以确保副本集的其他成员和所有 Client 端在构建索引时不会与该成员联系。 |
C2.构建索引
直接连接到在新端口上独立运行的mongod实例,并为此实例创建新索引。
例如,将mongo shell 连接到实例,然后使用db.collection.createIndex()方法在records
集合的username
字段上创建升序索引:
db.records.createIndex( { username: 1 } )
C3.重新启动程序 mongod 作为副本集成员
索引构建完成后,关闭mongod实例。撤消以独立版本启动时所做的配置更改,以返回其原始配置并重新启动。
Important
确保删除skipShardingConfigurationChecks参数和disableLogicalSessionCacheRefresh
参数。
例如,重新启动副本集分片成员:
If you are using a configuration file:
-
Revert to the original port number.
-
Uncomment the replication.replSetName.
-
Uncomment the sharding.clusterRole.
-
Remove parameter skipShardingConfigurationChecks in the setParameter section.
-
Remove parameter
disableLogicalSessionCacheRefresh
in the setParameter section.
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.
And restart:
mongod --config <path/To/ConfigFile>
If you are using command-line options:
-
Revert to the original port number.
-
Include --replSet.
-
Include --shardsvr if a shard member or --configsvr if a config server member.
-
Remove parameter skipShardingConfigurationChecks.
-
Remove parameter
disableLogicalSessionCacheRefresh
.
For example:
mongod --port 27018 --replSet shardA --shardsvr
Other settings (e.g. --dbpath, etc.) remain the same.
允许复制赶上该成员。
C4.对分片剩余的次要对象重复上述步骤
一旦该成员赶上该集合的其他成员,就一次对一个碎片的其余第二个成员重复此过程:
C5.在主数据库上构建索引
当分片的所有辅助数据库都具有新索引时,请降低分片的主数据库,使用上述过程以独立方式重新启动它,然后在前一个主数据库上构建索引:
-
使用mongo Shell 中的rs.stepDown()方法降级主要数据库。成功降级后,当前的主节点将成为辅助节点,副本集成员将选择新的主节点。
D.对其他受影响的碎片重复
完成为分片构建索引后,对其他受影响的分片重复C.在包含集合块的碎片上构建索引。
E.重新启动平衡器
一旦完成了受影响分片的滚动索引构建,请重新启动平衡器。
将mongo shell 连接到分片群集中的mongos实例,然后运行sh.startBalancer():
sh.startBalancer()