Mongodb从0到1系列七: 分片
来源:互联网 发布:加长棍刀在淘宝叫什么 编辑:程序博客网 时间:2024/05/21 07:53
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:2701712.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:27019mongos> 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/
阅读全文
0 0
- Mongodb从0到1系列七: 分片
- Mongodb从0到1系列三: 条件查询、大小写
- Mongodb从0到1系列五: 主从复制
- Mongodb从0到1系列六: 复制集
- Mongodb从0到1系列八: 备份与恢复
- 从mongodb移除分片
- mongoDB系列之(三):mongoDB 分片
- Mongodb从0到1系列一:下载、安装、启动、停止
- Mongodb从0到1系列二:数据库与集合操作、文档增删改查
- Mongodb从0到1系列四: Limit与Skip方法、排序、索引
- MongoDB实战系列之五:mongodb的分片配置
- MongoDB实战系列之五:mongodb的分片配置
- MongoDB实战系列之五:mongodb的分片配置
- MongoDB实战系列之五:mongodb的分片配置
- 博客学习七——redis虚拟内存、mongodb分片
- Mongodb数据分片的维护(新增分片到已有的分片复制集)
- MongoDB 分片
- mongodb 分片
- Jenkins + Gerrit + Git
- Event事件对象之表单事件
- FZU 2150 Fire Game(多起点bfs)
- 调用天气api实现查询各城市天气
- UVA 11806(B)——Cheerleaders 容斥原理 离散数学列举所有情况
- Mongodb从0到1系列七: 分片
- 【POJ2096】Collecting Bugs
- 线程的优先级别
- Asp.Net MVC webAPI Token based authentication
- Vue中router-link介绍
- [科普]如何防止跨站点脚本攻击
- 百度地图反选
- 数据库常用的SQL语句
- fileupload上传