搭建高可用mongodb集群(四)――分片(三)

2014-11-24 15:45:32 · 作者: · 浏览: 3
001"
05 },
06 {
07 "_id" : "shard2",
08 "host" : "shard2/192.168.0.136:22002,192.168.0.137:22002"
09 },
10 {
11 "_id" : "shard3",
12 "host" : "shard3/192.168.0.136:22003,192.168.0.137:22003"
13 }
14 ],
15 "ok" : 1

}
因为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();

{

01 "sharded" : true,
02 "ns" : "testdb.table1",
03 "count" : 100000,
04 "numExtents" : 13,
05 "size" : 5600000,
06 "storageSize" : 22372352,
07 "totalIndexSize" : 6213760,
08 "indexSizes" : {
09 "_id_" : 3335808,
10 "id_1" : 2877952
11 },
12 "avgObjSize" : 56,
13 "nindexes" : 2,
14 "nchunks" : 3,
15 "shards" : {
16 "shard1" : {
17 "ns" : "testdb.table1",
18 "count" : 42183,
19 "size" : 0,
20 ...
21 "ok" : 1
22 },
23 "shard2" : {
24 "ns" : "testdb.table1",
25 "count" : 38937,
26 "size" : 2180472,
27 ...
28 "ok" : 1
29 },
30 "shard3" : {
31 "ns" : "testdb.table1",
32 "count" :18880,
33 "size" : 3419528,
34 ...
35 "ok" : 1
36 }
37 },
38 "ok" : 1

}
可以看到数据分到3个分片,各自分片数量为: shard1 “count” : 42183,shard2 “count” : 38937,shard3 “count” : 18880。已经成功了!不过分的好像不是很均匀,所以这个分片还是很有讲究的,后续再深入讨论。

12、java程序调用分片集群,因为我们配置了三个mongos作为入口,就算其中哪个入口挂掉了都没关系,使用集群客户端程序如下:

public class TestMongoDBShards {

01 public static void main(String[] args) {
02
03 try {
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);
11
12 MongoClient client = new MongoClient(addresses);
13 DB db = client.getDB( "testdb" );
14 DBCollection coll = db.getCollection( "table1" );
15
16 BasicDBObject object = new BasicDBObject();
17 object.append( "id" , 1);
18
19 DBObject dbObject = coll.findOne(object);
20
21 System. out .println(dbObject);
22
23 } catch (Exception e) {
24 e.printStackTrace();
25 }
26 }

}
整个分片集群搭建完了,思考一下我们这个架构是不是足够好呢?其实还有很多地方需要优化,比如我们把所有的仲裁节点放在一台机器,其余两台机器承担了全部读写操作,但是作为仲裁的192.168.0.138相当空闲。让机器3 192.168.0.138多分担点责任吧!架构可以这样调整,把机器的负载分的更加均衡一点,每个机器既可以作为主节点、副本节点、仲裁节点,这样压力就会均衡很多了,如图:

fenpian6

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