mongoshard

shard分片

mongos 路由器 -》configsvr -> shard1/shard2
分片要有如下要素:
1.要有N>2个mongodb服务做片节点
2.要有configsvr维护meta信息
3.netstat -anpl|grep 30000
4.要设定好数据的分片规则(configsvr才能维护)

 


configsvr不存储真正的数据,存储的meta信息,即某条数据在哪个片上的信息
mongs查询某条数据时,要先找到configsvr,询问得到该数据在哪个shard上


mkdir -p /mongodb/data17 /mongodb/data18 /mongodb/data20 /mongodb/mlog

启动两个mongodb,相当于准备了2个shard
./bin/mongod --dbpath=/mongodb/data17 --logpath=/mongodb/mlog/m17.log --fork --port 27017
./bin/mongod --dbpath=/mongodb/data18 --logpath=/mongodb/mlog/m18.log --fork --port 27018

接下来准备configsvr,注意后面的--configsvr
./bin/mongod --dbpath=/mongodb/data20 --logpath=/mongodb/mlog/m20.log --fork --port 27020 --configsvr --replSet cfset

./bin/mongos --help

配置mongos,相当于打通了mongos跟configsvr
./mongos --logpath=/mongodb/mlog/m30.log --port 30000 --configdb 172.31.9.236:27020 --fork

上面mongos这一步,需要看版本的,3.2之前,上面命令可以,如果是4以上的,需要replset/ip:port ,本环境没测试好

假设上一步配置好了,需要登录到30000端口
./mongo --port 30000
增加片
sh.addShard("ip:port")
插入4条数据,确认是到27017还是27018上,此时还没有设置分片规则,数据有可能会到一个分片上
sh.status()可以查看一些databases的partitioned

添加待分片的库
sh.enableSharding(dbname),然后执行sh.status(),还是查看databases的partitioned,这个具体规则还是不清楚
添加待分片的表
还需要对collection进行指定规则
sh.shardCollection("dbname.collection",{field:1}) field是collection的一个字段,系统将会利用field的值,来计算应该分到哪一个片上
这个field叫片键
sh.shardCollection("shop.goods",{good_id:1}),这个还是跑到一个库上了

mongodb不是从单篇文档的级别,绝对平均的散落在各个片上

而是N篇文档形成一个块chunk,优先放在某个片上,当这个片上的chunk比另一个片上的chunk区别比较大时,(>=3)会把本片上的chunk移到另一个
片上,以chunk为单位,维护片之间的数据均衡
为什么插入了10W条数据,才2个chunk,因为chunk比较大,可以在config里面的settings修改chunk大小,默认64M,修改为1M后,插入大量数据,
chunk会移动到另一个shard上,随着数据的增多,shard的实例之间,有chunk来回移动的现象,这将带来什么问题 io问题

能否定义一个规则,某n条数据形成一个块,预先分配M个chunk,M个chunk预先分配在不同的片上,以后的数据直接插入各自预分配好的
chunk,不再来回移动
可以做到,手动预先分片
sh.shardCollection("shop.user",{userid:1})
如果有4000W数据,当遇到1000,2000,3000...4000w的时候切好块chunk,虽然是空的,但是会均匀的移动到各片上,也就是相当于打点

for(var i=1;i<40;i++){sh.splitAt(shop.user,{userid:i*1000})} 预先造块分好,后面插数据,块不会变,可以用sh.status()查看
接下来for循环插数据,就会很均匀的分布到预先分配的chunk上

shard跟repliset 结合

 

var rsconfig={

_id:"cfset",
members:[
{_id:0,
host:"127.0.0.1:27020"},
{_id:1,
host:"127.0.0.1:27030"},
{_id:2,
host:"127.0.0.1:27040"}

]
}
rs.initiate(rsconfig)

 

posted @ 2022-04-10 08:30  红丿领巾  阅读(118)  评论(0)    收藏  举报