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的分割是自动执行的,类似于细胞分裂,从区间的中间分割成两个(区间的规则是左闭右开)