您的位置:首页 > 数据库 > Mongodb

Mongodb从0到1系列七: 分片

2017-07-28 00:22 183 查看
Mongodb从0到1系列一:下载、安装、启动、停止
Mongodb从0到1系列二:数据库与集合操作文档、增删改查
Mongodb从0到1系列三: 条件查询、大小写
Mongodb从0到1系列四: Limit与Skip方法、排序、索引
Mongodb从0到1系列五: 主从复制
Mongodb从0到1系列六: 复制集

12 分片

分片有点类似于DB2中的DPF概念,即将数据分布在各个节点上。



mongos:首先我们要了解”片键“的概念,也就是说拆分集合的依据是什么?按照什么键值进行拆分集合....好了,mongos就是一个路由服务器,它会根据管理员设置的“片键”将数据分摊到自己管理的mongod集群,数据和片的对应关系以及相应的配置信息保存在"config服务器"上。
mongod:一个普通的数据库实例,如果不分片的话,我们会直接连上mongod。
config服务器:mongod之间的配置放到config服务器里面,我尝试了一下,发现如果不在复制集里,搭建不成功,于是配了两个config服务器的复制集
client: client是直接连在mongos上的,它并不知道做了分片

12.1 启动config server

先搭建两个节点的复制集,作为config server:
db2a:~ # mkdir /data/repdb5
db2a:~ # mkdir /data/repdb6
db2a:~ # mongod --dbpath=/data/repdb5 --configsvr  --port 27017 --replSet rs3
db2a:~ # mongod --dbpath=/data/repdb6 --configsvr  --port 27018 --replSet rs3

db2a:~ # mongo db2a:27017

> config = {_id:"rs3", members:[{_id:0,host:"db2a:27017"}, {_id:1,host:"db2a:27018"}]}

> rs.initiate(config)

rs1:PRIMARY> rs.status()

12.2 启动mongos server

db2a:~ # mongos --port 27019 --configdb rs3/db2a:27017

12.3 启动 shard server

shard server:
db2a:~ # mkdir /data/shard1
db2a:~ # mkdir /data/shard2
db2a:~ # mongod --dbpath=/data/shard1 --shardsvr --port 27020
db2a:~ # mongod --dbpath=/data/shard2 --shardsvr --port 27021

12.4 添加分片

db2a:~ # mongo db2a:27019
mongos> use admin
mongos> db.runCommand({"addshard":"db2a:27020", allowLocal:true})
mongos> db.runCommand({"addshard":"db2a:27021", allowLocal:true})

为数据库test1,集合student启用分片:

mongos> db.runCommand({"enablesharding":"test1"})

mongos> db.runCommand({"shardcollection":"test1.student","key":{"name":1}})

mongos> use test1

switched to db test1

MongoDB Enterprise mongos> for(var i = 0; i < 100000; i++) {

... db.student.insert({"name":"mqs" + i, "id":i})

... }

mongos> db.student.count()

100000

mongos> db.student.find().limit(5)

{ "_id" : ObjectId("59743e86fa3bb240c5a47001"), "name" : "mqs1", "id" : 1 }

{ "_id" : ObjectId("59743e86fa3bb240c5a47002"), "name" : "mqs2", "id" : 2 }

{ "_id" : ObjectId("59743e86fa3bb240c5a47003"), "name" : "mqs3", "id" : 3 }

{ "_id" : ObjectId("59743e86fa3bb240c5a47004"), "name" : "mqs4", "id" : 4 }

{ "_id" : ObjectId("59743e86fa3bb240c5a47005"), "name" : "mqs5", "id" : 5 }

mongos> db.student.find().skip(99995)

{ "_id" : ObjectId("59743edbfa3bb240c5a5f69b"), "name" : "mqs99995", "id" : 99995 }

{ "_id" : ObjectId("59743edbfa3bb240c5a5f69c"), "name" : "mqs99996", "id" : 99996 }

{ "_id" : ObjectId("59743edbfa3bb240c5a5f69d"), "name" : "mqs99997", "id" : 99997 }

{ "_id" : ObjectId("59743edbfa3bb240c5a5f69e"), "name" : "mqs99998", "id" : 99998 }

{ "_id" : ObjectId("59743edbfa3bb240c5a5f69f"), "name" : "mqs99999", "id" : 99999 }

12.5 查看分片状况

mongos> db.student.stats()

mongos> db.printShardingStatus()

mongos> db.student.getShardDistribution()

Shard shard0000 at db2a:27020

 data : 5.04MiB docs : 99999 chunks : 2

 estimated data per chunk : 2.52MiB

 estimated docs per chunk : 49999

Shard shard0001 at db2a:27021

 data : 49B docs : 1 chunks : 1

 estimated data per chunk : 49B

 estimated docs per chunk : 1

Totals

 data : 5.04MiB docs : 100000 chunks : 3

 Shard shard0000 contains 99.99% data, 99.99% docs in cluster, avg obj size on shard : 52B

 Shard shard0001 contains 0% data, 0% docs in cluster, avg obj size on shard : 49B

可以看到,只有一个文档被分布在 shard0001上,非常不均匀,如果使用hash分布,则会非常均匀:

mongos> use admin

mongos> db.runCommand({"shardcollection":"test1.student2","key":{"name":"hashed"}})

mongos> use test1

mongos> for(var i = 0; i < 100000; i++) {

...  db.student2.insert({"name":"mqs" + i, "id":i})

... }

mongos> db.student2.getShardDistribution()

Shard shard0000 at db2a:27020

 data : 2.53MiB docs : 50177 chunks : 2

 estimated data per chunk : 1.26MiB

 estimated docs per chunk : 25088

Shard shard0001 at db2a:27021

 data : 2.51MiB docs : 49823 chunks : 2

 estimated data per chunk : 1.25MiB

 estimated docs per chunk : 24911

Totals

 data : 5.04MiB docs : 100000 chunks : 4

 Shard shard0000 contains 50.17% data, 50.17% docs in cluster, avg obj size on shard : 52B

 Shard shard0001 contains 49.82% data, 49.82% docs in cluster, avg obj size on shard : 52B

参考:
http://kb.cnblogs.com/page/152995/ 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mongodb 分片