一.相关概念
MongoDB如何存放大数据文件?
MongoDB对超过一定的大小(默认是64M)的大数据文件切割成数据块(chunks),然后在切片集群(shards)中间自动均衡,使得数据尽量实现均匀分布.
MongoDB如何保证数据安全?
MongoDB中每个shard其实就是一个replica Set(默认是3个replica,每一个replica可以理解为一台机器),这样shard里面存储的每个chunk都会存放在不同的机器上,能最大程度上防止因为意外造成的数据丢失.
下图就是一个典型的MongDB的shard集群配置.
二.模拟集群搭建
1.搭建replica Set
a.在MongoDB的bin目录下,建立db11,db12,db13,db21,db22,db23几个文件夹,创建名称分别为rs0和rs1两个replica Set,并启动mongod如下:
mongod --dbpath db11(db12/d13) --port 10001(10002/10003) --replSet rs0
mongod --dbpath db21(db22/d23) --port 20001(20002/20003) --replSet rs1
b.replica Set初始化(以rs0为例)
通过mongo连接:mongo localhost:10001
cfg = {_id:"rs0",members:[{_id:1,host:"192.168.0.86:10001"}]}
rs.initiate(cfg)
rs.add("192.168.0.86:10002") rs.add("192.168.0.86:10003")
c.通过rs.conf()查看replica set信息
2.启动configServer
mongod --configsvr --dbpath config --port 30001
3.搭建shard集群
a.启动mongos:mongos --configdb 192.168.0.86:30001 --chunkSize 32(chunk的size) --port 28017
b.连接mongos:mongo 192.168.0.86:28017/admin
c.将rs0和rs1分别作为shard添加至集群:
db.runCommand({addShard:"rs0/192.168.0.86:10001,192.168.0.86:10002,192.168.0.86:10003"})
d.通过db.runCommand({listShards:1})查看集群情况
e.插入数据
use test
for(i=0;i<1000000;i++){db.tb1.save({"user_id":i,"number":Math.random()*100000})}
通过db.stats查看,发现此时数据大小超过32M,但是并未切割
f.启动分片
分片之前必须选定一个字段作为key,此处选择number作为key.
db.tb1.ensureIndex({"number":1})
use admin
db.runCommand({enableSharding:"test"})
db.runCommand({shardCollection:"test.tb1",key:{"number":1}})
通过db.printShardingStatus()可以发现chunk的均衡情况,如下图所示:
过几分钟,再次执行db.printShardingStatus()可以发现chunk均衡完毕,如下图所示: