片:可以普通的mongod进程,也可以是副本集。但是即使一片内有多台服务器,也只能有一个主服务器,其他的服务器保存相同的数据。
mongos路由进程:它路由所有请求,然后将结果聚合。它不保存存储数据或配置信息。
配置服务器:存储集群的配置信息。
整个分布式的集群通过mongos对客户端提供了一个透明统一的接口,客户端不需要关系具体的分片细节,所有分片的动作都是自动执行的,那是如何做到透明和自动的。
切分数据
搭建集群略。。。。
1、登录mongos
use admin
db.runCommand({"enablesharding":"test"}) #对test库开启分片功能
db.runCommand({"shardcollection":"test.user","key":{"id":1}})##对user表开启分片
注意:需要切换到admin库执行命令。
片键:上面的key就是所谓的片键(shard key)。MongoDB不允许插入没有片键的文档。但是允许不同文档的片键类型不一样,MongoDB内部对不同类型有一个排序:
Chunks:理解MongoDB分片机制的关键是理解Chunks。mongodb不是一个分片上存储一个区间,而是每个分片包含多个区间,这每个区间就是一个块。
平衡:如果存在多个可用的分片,只要块的数量足够多,MongoDB就会把数据迁移到其他分片上,这个迁移的过程叫做平衡。Chunks默认的大小是64M,查看config.settings可以看到这个值:
在test库下的user表中插入数据:
for(i=0;i<100000;i++){ db.bizuser.insert({"Uid":i,"Name":"zhanjindong","Age":13,"Date":new Date()}); }
进入到config库下使用db.chunks.find()查看块的情况;
《深入学习MongoDB》中有如下描述:
分片不能包含集群中已有的数据库,但是如果集群里有一个foo数据库,而新添加的分片里包含bar数据库,那么不会产生任何问题,因为配置服务器会注意道它,而它会出现在集群信息中。
表内插入数据:for(i=0;i<10;i++){ db.bizuser.insert({"Uid":i,"Name":"zhanjindong2","Age":13,"Date":new Date()}); }
一般首次对库进行分片成功的机率不是很大,比如我在前两次搭建时,数据到达一定大小后,它就会自动分片,第三次搭建完之后在按照之前的数值大小,命令搭建完之后没有分片;在网上搜查后提示:“说要先删除这个库,在创建一个新的跟其差不多的然后在添加分片即可成功”
尝试删除后,增减新的库名后,通过一条语法将表中插入几万条数据后,执行以下命令:
Use admin
Db.runCommand({“enablesharding”:”test20”})
Db.runCommand({“shardcollection”:”test20.user”,”key”:{“id”:1}})(执行后可能会报错)进入test20库,执行db.user.createIndex({"id":1})
Use config
Db.chunks.find()(查看config库下块的情况)
重建之前的test库,这次使用哈希分片,选择id作为片键:
Use admin
Db.runCommand({“enablesharding”:”test”})
Db.runCommand({“shardcollection”:”test.user”,”key”:{“id”:”hashed”}})
Use config
Db.chunks.find()