【转自SoulMio的博客】Sharding存在于Mongodb的另一个集群中,也就是分片技术,可以满足MongoDB数据量海量增长的需求。当MongoDB存储海量数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们可以通过将数据拆分到多台机器上,使数据库系统能够存储和处理更多的数据。为什么要使用分片?将所有写操作复制到主节点。延迟的敏感数据会在主节点上查询。单个副本集限制为12个节点。当请求量很大时会出现内存不足的情况。本地磁盘不足纵向扩展成本高MongoDBsharding下图为MongoDB中使用sharding的集群结构分布:上图中主要有3个组成部分:Shard:用于存储实际数据块,在实际生产环境中的作用一个分片服务器可以由多个机器组和一个副本集承担,以防止主机的单点故障。ConfigServer:mongod实例存储了整个ClusterMetadata,包括chunk信息。QueryRouters:前端路由,客户端通过它访问,让整个集群看起来像一个单一的数据库,前端应用可以透明使用。Shardinginstance192.168.1.100:mongos192.168.1.110:configserver192.168.1.101:Shard1192.168.1.102:Shard2以上四台主机上都安装了mongodb数据库。1、配置configserver编辑配置文件mongod.conf:vim/etc/mongod.conf添加如下内容并开启configserver服务:configsvr=true重启mongodb服务:servicemongodrestart注意:默认监听端口为27019,你也可以使用如下命令启动mongod进程。#mongod--configsvr--dbpath--port此时默认端口由27017改为27019:2.配置mongos实例安装mongos:yuminstallmongodb-org-mongos-2.6.1-1.x86_64。rpm启动mongos:mongos--configdb=192.168.1.110--fork--logpath=/var/log/mongodb/mongos.log注意:mongos是轻量级应用,可以和其他服务运行在同一个节点上;启动时需要为mongos实例指定各个configserver的访问地址;默认情况下,mongos监听端口27017;您可以使用以下命令启动mongos实例。#mongos--configdb也可以直接编辑配置文件:1.注释dbpath指令;2、增加configdb指令,指定configserver地址;然后使用以下命令启动mongos实例:#mongos-f/etc/mongod.conf登录mongos并配置分片节点:mongo--host192.168.1.100mongos>sh.addShard("192.168.1.101"){"shardAdded":"shard0000","ok":1}mongos>sh.addShard("192.168.1.102"){"shardAdded":"shard0001","ok":1}查看分片状态:mongos>sh。status()---ShardingStatus---shardingversion:{"_id":1,"version":4,"minCompatibleVersion":4,"currentVersion":5,"clusterId":ObjectId("58d4bd8a102ad4bdad74aa1d")}碎片:{"_id":"shard0000","host":"192.168.1.101:27017"}{"_id":"shard0001","host":"192.168.1.102:27017"}数据库:{"_id":"admin","partitioned":false,"primary":"config"}启动分片功能:mongos>sh.enableSharding("testdb");{"ok":1}注意:mongodb的分片功能是在collection级别实现的,但是如果要在collection,需要提前有相关信息数据库开启shard功能后,MongoDB会为其指定一个primaryshard。启用过程需要在mongos实例上实现。您可以使用sh.enableSharding()方法或db.runCommand()的“enableSharding命令”。它们的使用格式如下:sh.enableSharding("")db.runCommand({enableSharding:})此时再次查看shard状态:mongos>sh.status()---ShardingStatus---shardingversion:{"_id":1,"version":4,"minCompatibleVersion":4,"currentVersion":5,"clusterId":ObjectId("58d4bd8a102ad4bdad74aa1d")}碎片:{"_id":"shard0000","host":"192.168.1.101:27017"}{"_id":"shard0001","host":"192.168.1.102:27017"}数据库:{"_id":"testdb","partitioned":true,"primary":"shard0000"}测试:集合分片:mongos>sh.shardCollection("testdb.student",{"age":1}){"collectionsharded":"testdb.student","ok":1}插入数据:mongos>for(i=1;i<=100000;i++)db.student.insert({name:"student"+i,age:(i%120),classes:"class+(i%10)"});WriteResult({"nInserted":1})在此time我们再次查看分片状态如下: