您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
mongodb-shard分片
发布时间:2017-11-22 18:42:28编辑:雪饮阅读()
分片宏观示意图
建立shard1和shard2两台分片服务器和configsvr分片规则服务器:
建立两台分片服务器和分片规则服务器存储目录
mkdir -p /home/m17 /home/m18 /home/m20 /home/mlog
运行第一台分片服务器
./bin/mongod --dbpath /home/m17/ --logpath /home/mlog/m17.log --fork --port 27017 --smallfiles
运行第二台分片服务器
./bin/mongod --dbpath /home/m18/ --logpath /home/mlog/m18.log --fork --port 27018 --smallfiles
运行分片规则服务器
./bin/mongod --dbpath /home/m20/ --logpath /home/mlog/m20.log --fork --port 27020 --configsvr
--configsvr:指定了以分片规则服务器运行
建立mongos路由器
./bin/mongos --logpath /home/mlog/m30.log --port 30000 --configdb 192.168.101.108:27020 --fork
--configdb:参数关联分片规则服务器
连接路由器为分片规则服务器添加分片节点
注意:连接时用mongo连接,千万别用mongos连接
sh.addShard('192.168.101.108:27017')
sh.addShard('192.168.101.108:27018')
默认分片规则:
然后就在当前的路由器中添加一些数据
再到两个分片服务器上观察数据,发现数据都跑到一个分片服务器上了,另一个分片服务器上面并没有。
然后查看分片状态
sh.status()
会发现test数据库的分区默认为false,即默认没有分区,那么当数据添加进来后将会默认放到shard0000上。即第一个分片服务器。
配置分片规则
预声明一个库做为分片库,即使该库可能还不存在。
sh.enableSharding('shop')
再次查看分片信息,这次多了该库的分片信息,且分区为true
设置要一个分片库的分片规则
这里是按该库中的goods表的goods_id作为片键进行分片的
sh.shardCollection('shop.goods',{goods_id:1})
通过路由器来循环添加大量数据再观察分片情况。
是否出现自动分配到分片服务器,决定于分片规则中两个分片的chunk实际数量差别。
这就涉及到了分片原理
分片原理:
mongodb不是从单篇文档的级别,绝对平均的散落在各个片上的。而是n篇文档,形成一个chunk,优先放在某片上,当这片上的chunk比另一个片的chunk区别比较大时,一般是>=3时,会把本片上的chunk,移动到另一个片上,以chunk为单位。维护片之间的数据均衡。
查看chunk配置大小:
在路由器上use config数据库
然后使用命令db.settings.find()查询默认chunk配置大小
默认chunk大小为64M,修改chunk大小为1M,否则64M很难填充使其满足分片到其它分片服务器
设置chunk配置大小
在路由器上use config数据库
然后设置chunksize大小为1M
db.settings.save({_id:'chunksize',value:1})
数据量太少看不出分片效果
填充了55万条数据,可以看出两个分片服务器,分别放置了不同的chunk数量,chunk数量基本上是保持均衡的
既然优先往某个片上插入,当chunk失衡时再移动chunk,那么随着数据的增多,分片的服务器之间有chunk来回移动的现象,这将会增加服务器之间的io。如默认chunk是64M则当有chunk移动时,相当于有64M文件来回移动。
关键字词:mongodb,shard,分片