关注我,能够获取最新知识、经典面试题以及微服务技术分享面试
在使用MongoDB时,在建立索引会涉及到在复制集(replication)以及分片(Shard)中建立,为了最大限度地减小构建索引的影响,在副本和分片中建立索引,使用滚动索引构建过程。若是不使用滚动索引构建过程:shell
那么该如何建立呢?具体步骤呢?请看接下来的具体过程。**数据库
必须在索引构建期间中止对集合的全部写入,不然可能会在副本集成员中得到不一致的数据。缓存
在副本集中以滚动方式构建惟一索引包括如下过程:服务器
例如:微服务
//修改配置 net: bindIp: localhost,<hostname(s)|ip address(es)> port: 27217 #port: 27017 #replication: #replSetName: myRepl setParameter: disableLogicalSessionCacheRefresh: true //从新启动 mongod --config <path/To/ConfigFile>
从新开启Replica Set 模式:索引构建完成后,关闭mongod实例。撤消做为独立启动时所作的配置更改,以返回其原始配置并做为副本集的成员从新启动。学习
//回退原来的配置:net: bindIp: localhost,<hostname(s)|ip address(es)> port: 27017 replication: replSetName: myRepl //从新启动: mongod --config <path/To/ConfigFile>
主节点建立索引,当全部从节点都有新索引时,下降主节点,使用上述过程做为单机模式从新启动它,并在原主节点上构建索引:spa
建立惟一索引,必须在索引构建期间中止对集合的全部写入。 不然,您可能会在副本集成员中得到不一致的数据。若是没法中止对集合的全部写入,请不要使用如下过程来建立惟一索引。.net
1.中止Balancer:将mongo shell链接到分片群集中的mongos实例,而后运行sh.stopBalancer()以禁用Balancer。若是正在进行迁移,系统将在中止平衡器以前完成正在进行的迁移。code
2.肯定Collection的分布:刷新该mongos的缓存路由表,以免返回该Collection旧的分发信息。刷新后,对要构建索引的集合运行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构建索引。
3.在包含集合Chunks的分片建立索引
C1.中止从节点,并以单机模式从新启动:对于受影响的分片,中止从节点与其中一个分区相关联的mongod进程,进行配置文件/命令模式更新后从新启动。
配置文件:
在setParameter部分中将参数disableLogicalSessionCacheRefresh设置为true。
net: bindIp: localhost,<hostname(s)|ip address(es)> port: 27218 # port: 27018 #replication: # replSetName: shardA #sharding: # clusterRole: shardsvr setParameter: skipShardingConfigurationChecks: true disableLogicalSessionCacheRefresh: true //重启: mongod --config <path/To/ConfigFile>
C2.建立索引:直接链接到在新端口上做为独立运行的mongod实例,并为此实例建立新索引。
//例如:在record Collection的username建立索引 db.records.createIndex( { username: 1 } )
C3.恢复C1的配置,并做为 Replica Set成员启动:索引构建完成后,关闭mongod实例。 撤消做为单机模式时所作的配置更改,以返回其原始配置并从新启动。
配置文件模式:
在setParameter部分中删除参数disableLogicalSessionCacheRefresh。
net: bindIp: localhost,<hostname(s)|ip address(es)> port: 27018 replication: replSetName: shardA sharding: clusterRole: shardsvr 重启:mongod --config <path/To/ConfigFile>
4.在其余受影响的分片重复C步骤;
5.重启Balancer,一旦所有分片建立完索引,重启Balancer:sh.startBalancer()。
后续还有关于实践中复制集以及分片的搭建过程,复制集成员节点增长删除等一系列实战操做。
最后可关注公众号,一块儿学习,天天会分享干货,还有学习视频领取!