001"
| 08 |
"host" : "shard2/192.168.0.136:22002,192.168.0.137:22002" |
| 12 |
"host" : "shard3/192.168.0.136:22003,192.168.0.137:22003" |
}
因为192.168.0.138是每个分片副本集的仲裁节点,所以在上面结果没有列出来。
10、目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片,就差那么一点点,一点点。。。
连接在mongos上,准备让指定的数据库、指定的集合分片生效。
#指定testdb分片生效
db.runCommand( { enablesharding :“testdb”});
#指定数据库里需要分片的集合和片键
db.runCommand( { shardcollection : “testdb.table1”,key : {id: 1} } )
我们设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!
11、测试分片配置结果。
#连接mongos服务器
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo 127.0.0.1:20000
#使用testdb
use testdb;
#插入测试数据
for (var i = 1; i <= 100000; i++)
db.table1.save({id:i,“test1”:“testval1”});
#查看分片情况如下,部分无关信息省掉了
db.table1.stats();
{
| 02 |
"ns" : "testdb.table1", |
| 06 |
"storageSize" : 22372352, |
| 07 |
"totalIndexSize" : 6213760, |
| 17 |
"ns" : "testdb.table1", |
| 24 |
"ns" : "testdb.table1", |
| 31 |
"ns" : "testdb.table1", |
}
可以看到数据分到3个分片,各自分片数量为: shard1 “count” : 42183,shard2 “count” : 38937,shard3 “count” : 18880。已经成功了!不过分的好像不是很均匀,所以这个分片还是很有讲究的,后续再深入讨论。
12、java程序调用分片集群,因为我们配置了三个mongos作为入口,就算其中哪个入口挂掉了都没关系,使用集群客户端程序如下:
public class TestMongoDBShards {
| 01 |
public static void main(String[] args) { |
| 04 |
List addresses = new ArrayList(); |
| 05 |
ServerAddress address1 = new ServerAddress("192.168.0.136" , 20000); |
| 06 |
ServerAddress address2 = new ServerAddress("192.168.0.137" , 20000); |
| 07 |
ServerAddress address3 = new ServerAddress("192.168.0.138" , 20000); |
| 08 |
addresses.add(address1); |
| 09 |
addresses.add(address2); |
| 10 |
addresses.add(address3); |
| 12 |
MongoClient client = new MongoClient(addresses); |
| 13 |
DB db = client.getDB( "testdb" ); |
| 14 |
DBCollection coll = db.getCollection( "table1" ); |
| 16 |
BasicDBObject object = new BasicDBObject(); |
| 17 |
object.append( "id" , 1); |
| 19 |
DBObject dbObject = coll.findOne(object); |
| 21 |
System. out .println(dbObject); |
| 23 |
} catch (Exception e) { |
}
整个分片集群搭建完了,思考一下我们这个架构是不是足够好呢?其实还有很多地方需要优化,比如我们把所有的仲裁节点放在一台机器,其余两台机器承担了全部读写操作,但是作为仲裁的192.168.0.138相当空闲。让机器3 192.168.0.138多分担点责任吧!架构可以这样调整,把机器的负载分的更加均衡一点,每个机器既可以作为主节点、副本节点、仲裁节点,这样压力就会均衡很多了,如图:

当然生产环境的数据远远大于当前的测试数据,大规模数据应用情况下我们不可能把全部的节点像这样部署,硬件瓶颈是