MongoDB分片集群使用

RANGE分片配置及测试

以范围为基础的分片
Sharded Cluster支持将单个集合的数据分散存储在多shard上,用户可以指定根据集合内文档的某个字段即shard key来进行范围分片(range sharding)。

MongoDB分片集群使用

对于基于范围的分片,MongoDB按照片键的范围把数据分成不同部分。
  假设有一个数字的片键:想象一个从负无穷到正无穷的直线,每一个片键的值都在直线上画了一个点。MongoDB把这条直线划分为更短的不重叠的片段,并称之为数据块,每个数据块包含了片键在一定范围内的数据。在使用片键做范围划分的系统中,拥有”相近”片键的文档很可能存储在同一个数据块中,因此也会存储在同一个分片中。

 

测试

**数据库分片功能

mongo --port=38017 admin

设置test库为shard分片

db.runCommand( { enablesharding : "test" } 

MongoDB分片集群使用

 

指定分片键对集合分片
### 创建索引
use test
db.vast.ensureIndex( { id: 1 } )  #开启vast表索引,分片键为id 1代表排序方式为从小到大,-1为从大到小
### 开启分片
use admin
db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )

MongoDB分片集群使用

 

集合分片验证

use test

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

 

分片结果测试

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

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

 

mongo --port=38017 admin

db.vast.stats()

 

基于哈希的分片
分片过程中利用哈希索引作为分片的单个键,且哈希分片的片键只能使用一个字段,而基于哈希片键最大的好处就是保证数据在各个节点分布基本均匀

MongoDB分片集群使用

对于基于哈希的分片,MongoDB计算一个字段的哈希值,并用这个哈希值来创建数据块。在使用基于哈希分片的系统中,拥有”相近”片键的文档很可能不会存储在同一个数据块中,因此数据的分离性更好一些。
Hash分片与范围分片互补,能将文档随机的分散到各个chunk,充分的扩展写能力,弥补了范围分片的不足,但不能高效的服务范围查询,所有的范围查询要分发到后端所有的Shard才能找出满足条件的文档。

 

Hash分片例子

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

分片集群的查询及管理

mongo --port=38017 admin

判断是否Shard集群
db.runCommand({ isdbgrid : 1})

列出所有分片信息
use admin
db.runCommand({ listshards : 1})

列出开启分片的数据库
use config
db.databases.find( { "partitioned": true } )
db.databases.find() //列出所有数据库分片情况

查看分片的片键
db.collections.find().pretty()

查看分片的详细信息
sh.status()

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

添加分片
db.runCommand( { addshard : "sh3/192.168.2.xx:xx,192.168.2.xx:xx,192.168.2.xx:xx",name:"shard3"} )

 

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

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

自定义 自动平衡进行的时间段(生产中必做)
mongo --port=38017 config
sh.setBalancerState( true )
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "3:00", stop : "5:00" } } }, true )

sh.getBalancerWindow()
sh.status()

MongoDB分片集群使用

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