MongoDB 分片

      副本集解决了节点自动切换的问题,但是,因为副本集的子节点是全量复制数据的,当数据量非常大,比如到了TB级别,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。

1.Config Server:配置服务器,存储
   路由和分片的信息
2.Mongos:路由服务器,数据库集群
   请求的入口,所有请求都经过mongos协调
3.Shard:分片,具体的数据的储存



1.开启config服务器

mongod --dbpath=E:\mongodb\3.2.9\mongodb\db --logpath=E:\mongodb\3.2.9\mongodb\log\log.txt --logappend --port=27017

2.开启mongos服务器

mongos --logpath=E:\mongodb\3.2.9\slaveA\log\slaveA_slaveA.txt --logappend --port=27018 --configdb=127.0.0.1:27017 (mongos节点内容放在内存里,不需要指定dbpath)
3.启动mongod服务器
mongod --dbpath=E:\mongodb\3.2.9\slaveB\db --logpath=E:\mongodb\3.2.9\slaveB\log\slaveB_log.txt --logappend --port=27019
mongod --dbpath=E:\mongodb\3.2.9\slaveC\db --logpath=E:\mongodb\3.2.9\slaveC\log\slaveC_log.txt --logappend --port=27020
mongod --dbpath=E:\mongodb\3.2.9\slaveD\db --logpath=E:\mongodb\3.2.9\slaveD\log\slaveD_log.txt --logappend --port=27021
4.服务配置
  1.我们客户端直接跟mongos打交道,所以把配置好的两个mongod交给mongos,即添加分片

在mongos窗口

	use admin;
	db.runCommand({"addshard":"127.0.0.1:27019",allowLocal:true});
	db.runCommand({"addshard":"127.0.0.1:27020",allowLocal:true});
	db.runCommand({"addshard":"127.0.0.1:27021",allowLocal:true});
  2.指定切分数据
    在mongos窗口
	use admin;
	db.runCommand({"enablesharding":"test"}); -- 指定库
	db.user.ensureIndex({"name":1});-- 需要在指定片键之前,设定索引
	db.runCommand({"shardcollection":"test.user","key":{"name":1}}); -- 指定库下的表和片键

测试效果
-- db.user.insert({"name":"zhangsan","age":112});
-- db.user.insert({"name":"lisi","age":118});
for(var i=0;i<100000;i++){
  db.user.insert({"name":"jack"+i,"age":i});
}
db.printShardingStatus();
  
对一个集合分片时,一开始只会创建一个块,这个块的区间是(-∞,+∞),-∞表示MongoDB中的最小值,也就是上面db.chunks.find()我们看到的$minKey,+∞表示最大值即$maxKey。
Chunck的分割是自动执行的,类似于细胞分裂,从区间的中间分割成两个(区间的规则是左闭右开)






posted @ 2017-11-16 10:49  Bug开发攻城狮  阅读(151)  评论(0编辑  收藏  举报