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

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 在使用MongoDB时,在创建索引会涉及到在复制集(replication)以及分片(Shard)中创建,为了最大限度地减少构建索引的影响,在副本和分片中创建索引,使用滚动索引构建过程。

在使用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>
复制代码


  1. 在其他从节点中重复1、2、3步骤的过程操作。
  2. 主节点创建索引,当所有从节点都有新索引时,降低主节点,使用上述过程作为单机模式重新启动它,并在原主节点上构建索引:


  • 使用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构建索引。
复制代码


  1. 在包含集合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()方法来降低主节点为从节点,成功降级后,当前主节点成为从节点,副本集成员选择新主节点,并进行从节点创建方式进行创建索引。


  1. 在其他受影响的分片重复C步骤;
  2. 重启Balancer,一旦全部分片创建完索引,重启Balancer:sh.startBalancer()。


总结


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



相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
1月前
|
存储 NoSQL 关系型数据库
MongoDB索引知识
MongoDB索引知识
32 1
MongoDB索引知识
|
1月前
|
存储 NoSQL MongoDB
MongoDB 索引限制
10月更文挑战第22天
45 2
|
1月前
|
NoSQL MongoDB 索引
MongoDB 高级索引
10月更文挑战第22天
36 2
|
2月前
|
NoSQL MongoDB 索引
MongoDB 覆盖索引查询
10月更文挑战第21天
36 1
|
2月前
|
存储 NoSQL 前端开发
MongoDB 分片
10月更文挑战第17天
44 2
|
2月前
|
存储 NoSQL MongoDB
MongoDB 索引
MongoDB 索引
34 3
|
1月前
|
存储 NoSQL MongoDB
【赵渝强老师】部署MongoDB复制集
本文介绍了如何在单个节点上搭建MongoDB复制集环境,通过监听不同端口实现多节点配置。详细步骤包括创建数据目录、编辑配置文件、启动节点、初始化复制集、查看状态以及测试主从库的读写操作。文中还提供了视频讲解和代码示例,帮助读者更好地理解和操作。
|
1月前
|
存储 NoSQL MongoDB
【赵渝强老师】MongoDB复制集的体系架构
MongoDB的复制集是一种集群技术,由一个Primary节点和多个Secondary节点组成,实现数据的高可用性。Primary节点处理写入请求,Secondary节点同步数据。当Primary节点故障时,Secondary节点可通过选举成为新的Primary节点。视频讲解和示意图详见正文。
|
7天前
|
存储 JSON NoSQL
学习 MongoDB:打开强大的数据库技术大门
MongoDB 是一个基于分布式文件存储的文档数据库,由 C++ 编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它与 MySQL 类似,但使用文档结构而非表结构。核心概念包括:数据库(Database)、集合(Collection)、文档(Document)和字段(Field)。MongoDB 使用 BSON 格式存储数据,支持多种数据类型,如字符串、整数、数组等,并通过二进制编码实现高效存储和传输。BSON 文档结构类似 JSON,但更紧凑,适合网络传输。
36 15
|
15天前
|
存储 NoSQL 关系型数据库
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
我们的风控系统引入阿里云数据库MongoDB版后,解决了特征类字段灵活加减的问题,大大提高了开发效率,极大的提升了业务用户体验,获得了非常好的效果
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板