mongodb的分片

来源:互联网 发布:超级准的心理测试知乎 编辑:程序博客网 时间:2024/06/05 16:01

对比副本集,在T级别的数据,如果是副本集的话,我们的磁盘和内存都吃不消,所以我们需要把数据分摊到多台机器上


下面我对这张图解释一下:

     人脸:代表客户端,客户端肯定说,你数据库分片不分片跟我没关系,我叫你干啥就干啥,没什么好商量的。

     mongos:首先我们要了解”片键“的概念,也就是说拆分集合的依据是什么?按照什么键值进行拆分集合....

  好了,mongos就是一个路由服务器,它会根据管理员设置的“片键”将数据分摊到自己管理的mongod集群,数据和片的对应关系以及相应的配置信息保存在"config服务器"上。

    mongod: 一个普通的数据库实例,如果不分片的话,我们会直接连上mongod。

1.开启config服务器

mongod --dbpath=e:\mongodb\mongodb-win32-x86_64-2.0.6\db --logpath=e:\mongodb\mongodb-win32-x86_64-2.0.6\log\log.txt --logappend --port=27017

2.开启mongos服务器

mongos --logpath=e:\mongodb\slaveA\log\slaveA_log.txt --logappend --port=27018 --configdb=127.0.0.1:27017
(mongos节点充当路由器作用,不需要指定dbpath)

3.启动mongod服务器

mongod --dbpath=e:\mongodb\slaveB\db --logpath=e:\mongodb\slaveB\log\slaveB_log.txt --logappend --port=27019mongod --dbpath=e:\mongodb\slaveC\db --logpath=e:\mongodb\slaveC\log\slaveC_log.txt --logappend --port=27020mongod --dbpath=e:\mongodb\slaveD\db --logpath=e:\mongodb\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.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的分割是自动执行的,类似于细胞分裂,从区间的中间分割成两个  



0 0