文档章节

MongoDB系列-在复制集(replication)以及分片(Shard)中创建索引

c
 ccww_
发布于 10/21 20:56
字数 1769
阅读 57
收藏 1

关注我,可以获取最新知识、经典面试题以及微服务技术分享

  在使用MongoDB时,在创建索引会涉及到在复制集(replication)以及分片(Shard)中创建,为了最大限度地减少构建索引的影响,在副本和分片中创建索引,使用滚动索引构建过程。如果不使用滚动索引构建过程:

  • 主服务器上的前台索引构建需要数据库锁定。它复制为副本集辅助节点上的前台索引构建,并且复制工作程序采用全局数据库锁定,该锁定将读取和写入排序到索引服务器上的所有数据库。
  • 主要的后台索引构建复制为后台索引构建在辅助节点上。复制工作程序不会进行全局数据库锁定,并且辅助读取不会受到影响。
  • 对于主服务器上的前台和后台索引构建,副本集辅助节点上的索引操作在主节点完成构建索引之后开始。
  • 在辅助节点上构建索引所需的时间必须在oplog的窗口内,以便辅助节点可以赶上主节点。 那么该如何创建呢?具体步骤呢?请看接下来的具体过程。

1. 在副本集创建索引

准备

  必须在索引构建期间停止对集合的所有写入,否则可能会在副本集成员中获得不一致的数据。

具体过程

在副本集中以滚动方式构建唯一索引包括以下过程:

  1. 停止一个Secondary节点(从节点)并以单机模式重新启动,可以使用配置文件更新配置以单机模式重新启动:
  • 注释掉replication.replSetName选项。
  • 将net.port更改为其他端口。将原始端口设置注释掉。
  • 在setParameter部分中将参数disableLogicalSessionCacheRefresh设置为true。

例如:

    //修改配置
    net:
    bindIp: localhost,<hostname(s)|ip address(es)>
    port: 27217
    #port: 27017
    #replication:
    #replSetName: myRepl
    setParameter:
    disableLogicalSessionCacheRefresh: true
    //重新启动
    mongod --config <path/To/ConfigFile>
  1. 创建索引:在单机模式下进行索引创建

  2. 重新开启Replica Set 模式:索引构建完成后,关闭mongod实例。撤消作为独立启动时所做的配置更改,以返回其原始配置并作为副本集的成员重新启动。

     //回退原来的配置:net:
     bindIp: localhost,<hostname(s)|ip address(es)>
     port: 27017
     replication:
     replSetName: myRepl
     //重新启动:
     mongod --config <path/To/ConfigFile>
    
  3. 在其他从节点中重复1、2、3步骤的过程操作。

  4. 主节点创建索引,当所有从节点都有新索引时,降低主节点,使用上述过程作为单机模式重新启动它,并在原主节点上构建索引:

    • 使用mongo shell中的rs.stepDown()方法来降低主节点为从节点,
    • 成功降级后,当前主节点成为从节点,副本集成员选择新主节点,并进行从节点创建方式进行创建索引。

2. 分片集群创建唯一索引

准备

  创建唯一索引,必须在索引构建期间停止对集合的所有写入。 否则,您可能会在副本集成员中获得不一致的数据。如果无法停止对集合的所有写入,请不要使用以下过程来创建唯一索引。

具体过程

1.停止Balancer:将mongo shell连接到分片群集中的mongos实例,然后运行sh.stopBalancer()以禁用Balancer。如果正在进行迁移,系统将在停止平衡器之前完成正在进行的迁移。

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进程,进行配置文件/命令模式更新后重新启动。

    配置文件:

    • 将net.port更改为其他端口。 注释到原始端口设置。

    • 注释掉replication.replSetName选项。

    • 注释掉sharding.clusterRole选项。

    • 在setParameter部分中将参数skipShardingConfigurationChecks设置为true。

    • 在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实例。 撤消作为单机模式时所做的配置更改,以返回其原始配置并重新启动。

    配置文件模式:

    • 恢复为原始端口号。

    • 取消注释replication.replSetName。

    • 取消注释sharding.clusterRole。

    • 删除setParameter部分中的参数skipShardingConfigurationChecks。

    • 在setParameter部分中删除参数disableLogicalSessionCacheRefresh。

        net:
           bindIp: localhost,<hostname(s)|ip address(es)>
           port: 27018
        replication:
           replSetName: shardA
        sharding:
           clusterRole: shardsvr
        重启:mongod --config <path/To/ConfigFile>
      
  • C4.其他从节点分片重复C1、C2、C3过程创建索引。

  • C5.主节点创建索引:当所有从节点都有新索引时,降低主节点,使用上述过程作为单机模式重新启动它,并在原主节点上构建索引使用mongo shell中的rs.stepDown()方法来降低主节点为从节点,成功降级后,当前主节点成为从节点,副本集成员选择新主节点,并进行从节点创建方式进行创建索引。 4.在其他受影响的分片重复C步骤;

5.重启Balancer,一旦全部分片创建完索引,重启Balancer:sh.startBalancer()。

总结

  后续还有关于实践中复制集以及分片的搭建过程,复制集成员节点增加删除等一系列实战操作。

© 著作权归作者所有

c
粉丝 16
博文 29
码字总数 90432
作品 0
深圳
私信 提问
mongodb复制集+分片生产环境实践

三台机器操作系统环境如下: [mongodb@node1 ~]$ cat /etc/issueRed Hat Enterprise Linux Server release 6.6 (Santiago)Kernel r on an m[mongodb@node1 ~]$ uname -r2.6.32-504.el6.x86_6......

盖世英雄iii
2018/06/27
0
0
MongoDB(4.0)分片——大数据的处理之道

什么是分片 高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。 Mong...

cchenyz
2018/07/23
0
0
55最佳实践系列:MongoDB最佳实践

@郑昀汇总 创建日期:2012/9 Application Design: 1)如果发现query没使用你预期的索引,请用hint强制使用指定索引 主站商品中心所使用的文档字段很多,各种索引建得也不少。在沙创排查慢查...

旁观者-郑昀
2013/02/08
265
1
MongoDB集群部署 - 带访问控制的分片副本集

1. 前言   Ceilometer将meter、event等数据保存在MongoDB中,之前将MongoDB部署在控制节点上,使用三副本模式,时间长了发现meter数据爆炸式增长,区区2T的磁盘捉襟见肘,而想删除旧数据,...

Sai18
2018/08/16
0
0
MongoDB4.0搭建分布式集群-笔记

搭建之前先了解一下MongoDB分片群集主要有如下三个组件: Shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server 角色可以由几台服务器组成一个Peplica Set 承担,防止主...

Calon
2018/09/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 不要在领导修风扇的时候打开电扇

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :《Whats Up》 主唱妹子 Lina Perry 的嗓音实在太有力了,收放自如的自信才能唱出这么优秀的歌吧!#今日歌曲推荐# 《Whats Up》-...

小小编辑
今天
7
0
SpringBoot集成Elasticsearch并进行增删改查操作

一、创建工程 使用IntelliJ创建SpringBoot工程 SpringBoot版本为2.0.4 ElasticSearch为5.6.10 删掉蓝框中的文件(如上) 最后我们的目录结构(如下) 下面pom文件主要修改的是把spring boot从Int...

一字见心
今天
5
0
x001-版本介绍

python版本介绍 目前有2 和 3 有很多企业用的代码是2版本,随着技术的发展,以后用3的会成为大趋势 python3的安装 yum -y install wget gcc zlib-devel bzip2-devel openssl-devel ncurses-d...

侠客行之石头
今天
5
0
聊聊rocketmq的TransientStorePool

序 本文主要研究一下rocketmq的TransientStorePool TransientStorePool rocketmq-all-4.6.0-source-release/store/src/main/java/org/apache/rocketmq/store/TransientStorePool.java publi......

go4it
昨天
6
0
笔记

场外借贷, 质押 ,托管, 永续合约. 场外借贷,n签合同. 新功能 证券交易组负责中信证券机构及个人投资交易相关系统,服务机构及个人投资客户, 涉及到两融、期权、 期货、做市等境内境外创新业...

MtrS
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部