首页 > 数据库 >在副本集和分片集群上构建 MongoDB 索引

在副本集和分片集群上构建 MongoDB 索引

时间:2024-04-19 13:22:36浏览次数:26  
标签:副本 MongoDB 均衡器 索引 构建 分片 net 节点

1.限制

留有足够的内存来容纳工作集是非常重要的。不一定所有索引都要放在内存中。

在 v4.0 之前,索引键的限制应小于 1024 字节。从 v4.2 版开始,这一限制被取消。

索引名也是如此,在使用 fcv 4.0 及以下版本的数据库中,索引名的最大长度为 127 字节。在 db v4.2 和 fcv 4.2 中,这一限制有所减少。

任何给定的单个集合中只能创建 64 个索引。

 

2.副本集滚动构建索引

从 MongoDB 4.4 及更高版本开始,索引构建会在所有数据承载节点上同时进行。对于不能容忍索引构建导致性能问题的工作负载,我们可以采用滚动索引构建策略。

 

注:

·唯一索引

要使用以下过程创建唯一索引,必须在此过程中停止对集合的所有写入。如果无法在此过程中停止对集合的所有写入,请不要使用下面的过程。

·日志大小

确保 oplog 足够大,以便完成索引或重新索引操作,而不至于落后太多而无法赶上。

 

滚动构建的过程

(1)关闭一个辅助节点,用其它端口号,以 standalone 的方式重启。

在这一步,每次只关闭一个辅助节点。禁用配置文件中的复制参数,并将 disableLogicalSessionCacheRefresh 设置成 true:

net:
   bindIp: localhost,<hostname(s)|ip address(es)>
   port: 27217
#   port: 27017
#replication:
#   replSetName: myRepl
setParameter:
   disableLogicalSessionCacheRefresh: true

只需要做以上的调整,其它参数保持不变。完成这一步后保存退出,并重启 mongodb 实例。

sudo systemctl start mongod

现在,mongodb 运行在 27217 端口上。

(2)构建索引

登录数据库,创建索引。例如:

mongo –port 27217 -u 'username'  –authenticationDatabase admin

> use student
switched to db student

> db.studentData.createIndex( { StudentID: 1 } );
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}

(3)以副本集成员的方式重启该节点

索引创建结束后,就可以将该节点加回副本集了。

重新使用第一步中被注释掉的参数,重启节点。

net:
   bindIp: localhost,<hostname(s)|ip address(es)>
   port: 27017
replication:
   replSetName: myRepl

保存后重启。

sudo systemctl start mongod

这样,重启后又重新变成复制集的成员了。

(4)按照上面的步骤,重复操作剩余的辅助节点。

建议是等上一个辅助节点追上延迟后,再对下一个节点做操作。

(5)在主节点上创建索引

一旦所有辅助节点的索引构建活动结束,就使用与上述相同的流程在最后一个剩余节点上创建索引。

 

连接到主节点并发出 rs.stepDown();一旦成功降级,它就成为次节点,并选出新的主节点。按照步骤一至三建立索引即可。

3.分片集群滚动构建索引

分片集群滚动构建索引和副本集滚动构建方式类似。但是有以下不同点

(1)首先要先关闭均衡器。

为了在分片集群中以滚动方式创建索引,有必要停止均衡器,以免最终出现不一致的索引。

 

连接到 mongos 实例并运行 sh.stopBalancer() 来停用均衡器。

如果正在进行迁移,均衡器只会在正在进行的迁移完成后才会停止。

我们可以使用下面的命令检查均衡器是否已停止:

sh.getBalancerState()

如果均衡器已经被停止了,状态会是 false 。

(2)要确认集合的分布

为了以滚动的方式建立索引,有必要知道集合在哪些分片上。

连接到其中一个 mongos 并刷新缓存,这样我们就能获得要建立索引的分片内集合的最新分布信息。

 

示例:

我们要在学生数据库中的 studentData 集合中创建索引。我们将运行以下命令来获取该集合的最新分布信息。

db.adminCommand( { flushRouterConfig: "students.studentData" } );
db.records.getShardDistribution();
会获得如下类似的分片信息:
Shard shardA at shardA/s1-mongo1.net:27018,s1-mongo2.net:27018,s1-mongo3.net:27018
data : 1KiB docs : 50 chunks : 1
estimated data per chunk : 1KiB
estimated docs per chunk : 50
Shard shardC at shardC/s3-mongo1.net:27018,s3-mongo2.net:27018,s3-mongo3.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

以看出,students.studentData 存在于 shardA 和 shardC 上,我们需要分别在 shardA 和 shardC 上建立索引。

(3)以 standalone 方式启动之前,还要注释掉分片相关的参数

涉及修改端口号、注释掉复制参数、分片参数、设置 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

重启后创建索引

(4)最后要启动均衡器

sh.startBalancer()

标签:副本,MongoDB,均衡器,索引,构建,分片,net,节点
From: https://www.cnblogs.com/abclife/p/18123549

相关文章

  • 副本和就删码
    分类按照存储的结构存储可以分为集中式存储和分布式存储集中式存储传统集中式存储采用控制器+硬盘柜的方式,通过冗余的双控制器提供数据管理和读写能力(也有超过2个控制器的多控存储,多见于高端存储),通过控制器自带的硬盘槽位或扩展硬盘柜提供存储空间,如下图。集中式存储的硬盘......
  • TapData 正式上线 MongoDB 生态合作伙伴专栏,提供更专业的企业级实时数据集成解决方案
    近日,MongoDB官方正式将TapData加入MongoDB生态合作伙伴名录专栏,该项目旨在帮助用户发现MongoDB合作伙伴提供的优质集成和解决方案,本次入选的100+名单便筛选自数千家合作企业。此次合作达成,标志着TapData在现代应用数据集成领域的产品能力和稳定性已获得行业的广泛认可......
  • 运行MongoDB 报错GLIBC_2.14 not found
    Linux环境下安装完mongodb,运行./mongod报错如下#./mongod./mongod:/lib64/libc.so.6:version`GLIBC_2.14'notfound(requiredby./mongod)使用rpm-qa|grep glibc查看系统当前的glibc版本为2.12使用如下命令查看系统glibc最高支持的版本为2.12#strings/lib64/libc.s......
  • mongodb启动失败问题解决
    解决办法sudochown-Rmongod:mongod/var/lib/mongochown-Rmongod:mongod/var/log/mongodb/chown-Rmongod:mongod/tmp/mongodb-27017.sock或者可以使用mongod--config/etc/mongod.conf参考:MongoDBloadsbutbreaks,returningstatus=14-AskUbuntumon......
  • MongoDB复制集
    MongoDB的复制集复制集及原理MongoDB复制集的主要意义在于实现服务高可用复制集的现实依赖于两个方面的功能:数据写入时将数据迅速复制到另一个独立节点上在接受写入的节点发生故障时自动选举出一个新的替代节点复制集在实现高可用的同时,还有以下作用:数据分发:将数据从......
  • k8s快速创建MongoDB
    1.创建MongoDBpvc文件如果不需要持久存储可以忽略kind:PersistentVolumeClaimapiVersion:v1metadata:name:mongodb-datanamespace:t1-zdblspec:storageClassName:nfs-client#这里使用的存储类accessModes:-ReadWriteManyresources:reques......
  • docker部署mongodb
    docker部署mongodb拉取镜像dockerpullmongo启动mongo(dockerrun和dockercompose)dockerrun--auth:需要密码才能访问容器服务。-eMONGO_INITDB_ROOT_USERNAME:设置用户名-eMONGO_INITDB_ROOT_PASSWORD:设置密码dockerrun--restart=always--namemongodb-v~/dock......
  • 前端大文件分片上传
    1.分片上传整体流程开始上传:前端启动文件分片上传。后端返回唯一标识。分片上传:获取到上传的文件,然后设置一个固定的分片大小,将文件切成多个小片,计算出每一个分片的MD5值(32位)。将每个分片的内容和MD5标识符一同上传至服务器。服务端接收每个分片及相关信息后,通过对每个分片进行校......
  • redis自学(35)搭建分片集群
    分片集群结构主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:l 海量数据存储问题l 高并发写的问题使用分片集群可以解决上述问题,分片集群特征:l 集群中有多个master,每个master保存不同数据,因此能存多少取决于master节点的数量,解决了海量数据存储的......
  • video 分片加载
    API使用:MediaSource+SourceBufferhttpRangeseek进度跳转client.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=devic......