一些MongoDB集群维护使用方法

本文详细介绍MongoDB分片部署的全过程,包括增加分片节点、分片数据库及集合的操作方法,以及如何调整数据块大小和手动切割数据块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

增加分片节点

1.按照mongodb_structure_and_deplyment.md中副本集的部署步骤部署一个副本集(如:rs1,假设其中一个节点的主机名为hostname,端口为port)。

2.登陆任意一个mongos。

3.进入admin数据库,切换具有clusterManger及以上权限的用户(如:root)

use admin
db.auth("root", "<password>")

4.增加节点
sh.addShard(“rs1/hostname:port”)

增加或删除集群中某个副本集中的节点

1.首先部署好将要操作的节点,注意将配置文件中auth=true去掉

2.启动该节点
mongod -f
3.进入副本集中的primary节点,进行root授权

mongo --port <port>
use admin
db.auth("root", "<password>")

4.添加新节点

rs.add("<host>:<port>")

对数据进行分片

MongoDB的分片是在集合层面进行的,因此需要从控制每个集合是否可以被分片以及怎样分片。

1.使一个数据库A可以被分片:

sh.enableSharding("A")

2.分片数据库A中的集合b:

sh.shardCollection("A.b", shardKey)

分片一个集合的前提是这个集合建立了索引,建立索引:
db.b.createIndex({“name” : 1, age : 1})
其中name, age是集合b中的field,1 或者 -1控制以升序或者降序建索引

其中shardKey必须是以index为前缀的存在于集合中每个文档的若干个域以升序建索引,或者一个域用hashed,如:

"name" : "hashed"

在使集合可以被分片之后,数据不会被马上分片,要等到一个块上的数据超过了chunksize后才会分片,设置chunksize(默认chunksize为64MB)

use config
db.settings.save({_id : "chunksize", value : <sizeInMB>})

shardKey的选择要慎重,要保证数据分布的均匀性,高随机性等。

shardKey设置之后无法修改

人为对数据进行切割

在极少数情况下,需要人为对数据进行切割,比如数据块出现了jumbo标记。

对数据进行人为切割的方法有两个:

sh.splitFind(namespace, query)
sh.splitAt(namespace, query)


sh.splitFind(“records.people”, {“zipcode”, “63109”})
sh.splitAt(“records.people”, {“zipcode”, “63109”})
两个函数都是根据第二个参数query查询到第一个符合条件的文档D所在的块C。所不同的是,splitFind将C分割成两个一样大的快。splitAt从查询到的D处,将C分成两个块,不保证两个块一样大。

数据块的平衡

MongoDB会自动对各个分片节点的数据块数量进行平衡,保持数据块最多节点和数据块最少节点的数据块之差小于Migration Threshold。在数据块之差没有达到迁移阈值之前,不会发生数据块迁移。

开启自动平衡

MongoDB的自动平衡是默认开启的,控制自动平衡的方法是

sh.enableBalancing(<true or false>)

运行
sh.status()
可以看到类似信息:

balancer:
    Currently enabled: yes
    Currently running: no

更多信息参考官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值