增加分片节点
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
更多信息参考官方文档