MongoDB分片集群使用说明
需要事先说明一下MongoDB的片键分类
MongoDB支持两种类型的shard key:
1.Hashed(哈希):数据库根据指定的字段值,算出一个哈希值,然后根据这个哈希值把数据写入相应的服务器中。
好处:数据会分布得比较均匀。
缺点:当我们使用mongos查找时,由于数据过于分散,所以自然查找效率会变慢,消耗也会变大,如果我们使用场景是大量的写入,同时查询较少时,会比较推荐使用哈希。
2.Ranged(范围):按照指定字段的范围进行划分,它把数据切分成连续的几个区间。取值相近的纪录会放进同一个 shard 服务器。
好处:查询连续取值纪录时,查询效率可以得到保证。当数据库查询语句发送到 mongos 中时,mongos 会很快的找到目标 shard,而且不需要将语句发送到所有的 shard 上,一般只需要少量的 shard 就可以完成查询操作。
缺点:不能保证数据的平均分配,在数据插入和修改时会产生比较严重的性能瓶颈。
MongoDB分片集群使用说明
分片设置
在为集合collection分片前,我们需要先给对应集合的数据库赋予分片的功能,可以使用下列命令给数据库开启分片功能。
> use admin; //必须进入admin库 > sh.enableSharding("Test") 或 > db.runCommand({enableSharding:"Test"}) //给Test库开启分片功能,在做该操作时,其实库就会被自己创建了
Hashed(哈希)
采用哈希算法设置shard key
Ranged其实就是把{"id":"hashed"}修改成{"id":1}即可
# 将 Test 库中的 Vast 里的 _id 为key,hash模式进行分片
> sh.shardCollection("Test.vast",{"_id":"hashed"})
或
> db.runCommand({shardCollection:"Test.Vast","key":{"_id":"hashed"},numInitialChunks:1024}) //可选项numInitialChunks:可以预创建指定数量的chunk块,用以在生产环境减少chunk块初始分裂频率,
#此时,要是你有其他库的数据,就可以将其进行导入了
因为我没有,所以手动进入对应库对设置的集合插入数据验证
> use Test > for(i=0;i<=100;i++){db.vast.insert({"id":i,"age":i})}
这时候我们的数据就会被合理的分配到了各个shard上,可以登录相关shard节点,使用db.vast.count()统计下节点上的该集合数量是多少。
需要注意的是,因为我们shard是副本集的方式,所以过程其实是数据分配到了shard的主(PRIMARY)节点上,然后从(SECONDARY)节点去主节点进行同步数据。
chunk操作
查看chunk信息
> use config
> db.chunks.find()
很奇怪,在我部署的这个mongodb里没有config.settings这个集合,是我开启了Balancer后才有的settings
Balancer操作
启动/关闭Balancer
> use config > sh.startBalancer()
> sh.stopBalancer()
查看Balancer是否已开启
> sh.getBalancerState()
查看是否有chunk在迁移
> sh.isBalancerRunning()
MongoDB分片集群其它操作
新增shard节点
> use admin > db.runCommand({addshard:"shard1/192.168.36.137:22001,192.168.36.138:22001,192.168.36.139:22001"}) // shard名称/该shard的节点
查看当前所有shard节点信息
mongos> use config
mongos> db.shards.find() { "_id" : "shard1", "host" : "shard1/192.168.36.137:22001,192.168.36.138:22001", "state" : 1 } { "_id" : "shard2", "host" : "shard2/192.168.36.138:22002,192.168.36.139:22002", "state" : 1 }
查看当前所有数据库分布信息
mongos> use config mongos> db.databases.find() { "_id" : "testdb", "primary" : "shard1", "partitioned" : true } { "_id" : "test", "primary" : "shard2", "partitioned" : true } { "_id" : "pric", "primary" : "shard2", "partitioned" : true } { "_id" : "HashTest", "primary" : "shard1", "partitioned" : true } { "_id" : "student", "primary" : "shard1", "partitioned" : true } { "_id" : "xuexiao", "primary" : "shard1", "partitioned" : true } { "_id" : "testdba", "primary" : "shard1", "partitioned" : true }
查看MongoDB集群信息
> sh.status()
持续更新。。。。。