下图展示了在MongoDB中使用分片集群结构分布:
上图中主要有如下所述三个主要组件:
- Shard:
用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障
- Config Server:
mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。
- Query Routers:
前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
1、启动mongodb
mkdir -p /home/m17 /home/m18 /home/m20 /home/mlog #启动s1 mongod --dbpath /home/m17 --logpath /home/mlog/m17.log --fork --port 2017 --smallfiles #启动s2 mongod --dbpath /home/m18 --logpath /home/mlog/m18.log --fork --port 2018 --smallfiles #启动configsvr mongod --dbpath /home/m20 --logpath /home/mlog/m20.log --fork --port 2020 --configsvr #启动mogos mongos --logpath /home/mlog/m30.log --port 30000 --configdb 192.168.1.1:27020 --fork
2、配置分片节点
mongo --port 30000 mongos>sh.addShard('192.168.1.1:27017'); mongos>sh.addShard('192.168.1.1:27018'); #查看 mongos>sh.status();
3、设定分片规则
#为shop库进行分片 mongos>sh.enableSharding('shop'); #可查看 mongos>sh.status(); #goods表分配片键 mongos>sh.shardCollection('shop.goods',{goods_id:1}); #可查看 mongos>sh.status(); #查看chunk size mongos>use config mongos>db.settings.fihnd(); #修改chunk size mongos>db.settings.save({_id:'chunksize',value:1}); #缺点:会造成块的移动,下面介绍手动预先分片
4、手动预先分片规则
mongos>sh.shardCollection('shop.user',{userid:1}); mongos>sh.status(); #预先分40块,每1000条数据一块 mongos>for(var i=1;i<=40;i++){ sh.splitAt('shop.user',{userid:i*1000});}