数据库
首页 > 数据库> > 6.mongodb之sharding-cluster(分片集群)分片详细介绍

6.mongodb之sharding-cluster(分片集群)分片详细介绍

作者:互联网

1.分片键的选择

  

mongodb一般有两种分片策略:range和hash(哈希)

分片主要的事项:

  1.分片键是不可变

  2.分片键必须有索引

  3.分片建大小限制512bytes

  4.分片键用于路由查询

  5.mangodb不接受已经collection级分片的collection上插入无分片键的文档(也不支持空值插入)

 

2.range 分片策略和测试

  2.1 激活数据库分片功能

mongo --port 38017 admin
admin>  ( { enablesharding : "数据库名称" } )
eg:
admin> db.runCommand( { enablesharding : "test" } )

  2.2 指定分片键对集合分片

### 创建索引
use test
> db.vast.ensureIndex( { id: 1 } )
### 开启分片
use admin
> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )   ####### id:1指的是分片顺序按照从小到大 

  2.3 集合分片验证 

admin> use test
test> for(i=1;i<1000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
test> db.vast.stats()

  2.4 分片集合测试 

shard1:
mongo --port 38021
db.vast.count();

shard2:
mongo --port 38024
db.vast.count();

 

3.Hash分片集群

对oldboy库下的vast大表进行hash
创建哈希索引
(1)对于oldboy开启分片功能
mongo --port 38017 admin
use admin
admin> db.runCommand( { enablesharding : "oldboy" } )
(2)对于oldboy库下的vast表建立hash索引
use oldboy
oldboy> db.vast.ensureIndex( { id: "hashed" } )
(3)开启分片 
use admin
admin > sh.shardCollection( "oldboy.vast", { id: "hashed" } )
(4)录入10w行数据测试
use oldboy
for(i=1;i<100000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }   ####这个循环其实一共只有999999行数据
(5)hash分片结果测试
mongo --port 38021
use oldboy
db.vast.count();
mongo --port 38024
use oldboy
db.vast.count();

#######测试结果是 shar1:50393个文档 shar2:49606个文档

 

4. 分片集群的查询及管理

4.1 判断是否Shard集群
admin> db.runCommand({ isdbgrid : 1})
4.2 列出所有分片信息
admin> db.runCommand({ listshards : 1})
4.3 列出开启分片的数据库
admin> use config
config> db.databases.find( { "partitioned": true } )
或者:
config> db.databases.find() //列出所有数据库分片情况
4.4 查看分片的片键
config> db.collections.find().pretty()
{
    "_id" : "test.vast",
    "lastmodEpoch" : ObjectId("58a599f19c898bbfb818b63c"),
    "lastmod" : ISODate("1970-02-19T17:02:47.296Z"),
    "dropped" : false,
    "key" : {
        "id" : 1
    },
    "unique" : false
}
4.5 查看分片的详细信息 
admin> sh.status()   ##########一般用这个命令进行查看
4.6 删除分片节点(谨慎)

(1)确认blance是否在工作
sh.getBalancerState()
(2)删除shard2节点(谨慎)
mongos> db.runCommand( { removeShard: "shard2" } )
注意:删除操作一定会立即触发blancer。

 

5. balancer

  5.1 介绍:

mongos的一个重要功能,自动巡查所有shard节点上的chunk的情况,自动做chunk迁移。
什么时候工作?
1、自动运行,会检测系统不繁忙的时候做迁移
2、在做节点删除的时候,立即开始迁移工作
3、balancer只能在预设定的时间窗口内运行

有需要时可以关闭和开启blancer(备份的时候)
mongos> sh.stopBalancer()
mongos> sh.startBalancer()

  5.2 自定义 自动平衡进行的时间段

https://docs.mongodb.com/manual/tutorial/manage-sharded-cluster-balancer/#schedule-the-balancing-window
// connect to mongos

use config
sh.setBalancerState( true )
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "3:00", stop : "5:00" } } }, true )  #####这个自定义自动平衡进行的时间段(3:00-5:00)

sh.getBalancerWindow()
sh.status()

关于集合的balancer(了解下)
关闭某个集合的balance
sh.disableBalancing("students.grades")
打开某个集合的balancer
sh.enableBalancing("students.grades")
确定某个集合的balance是开启或者关闭
db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;

 

标签:use,admin,mongodb,db,cluster,sh,分片,vast
来源: https://www.cnblogs.com/zmc60/p/13958226.html