分片集群(sharding cluster)
这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统。
要构建一个 MongoDB Sharding Cluster,需要三种角色:
Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障
Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。
Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
模拟2个shard服务和一个config服务, 均运行在192.168.37.4机器上,只是端口不同:
Shard1:27020
Shard2:27021
Config:27022
Mongos启动时默认使用的27017端口
在D,E,F磁盘下分别解压MongoDB
建立如下文件夹:
mongodb\data
启动shardServer
d:\mongodb-27020\mongodb\bin\mongod --dbpath d:\mongodb-27020\mongodb\data\ --port 27020
E:\mongodb-27021\mongodb\bin\mongod --dbpath E:\mongodb-27021\mongodb\data\ --port 27021
启动configServer
F:\mongodb-27022\mongodb\bin\mongod --configsvr --dbpath F:\mongodb-27022\mongodb\data\ --port 27022
启动mongos ,默认开启了27017端口
F:\mongodb-27022\mongodb\bin\mongos --configdb 192.168.37.4:27022
进入F:\mongodb-27022\mongodb\bin
>mongo 进入
> use admin --登陆admin数据库
> db.runCommand( { addshard : "192.168.37.4:27020", allowLocal : 1} ) --添加分片 > db.runCommand( { addshard : "192.168.37.4:27021", allowLocal : 1} ) --添加分片
> config = connect("192.168.37.4:27022") --登陆config > config = config.getSisterDB("config") 获得config数据 > testDB1=db.getSisterDB("test_db1");创建test_db1数据库
> db.runCommand({enablesharding:"test_db1"})--激活数据库分片
通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的collection将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对collection作些操作
> db.runCommand( { shardcollection : "test_db1.shardcollect", key : { id : 1 } , unique : true } )--激活collection分片,配置shard key唯一
> db.printShardingStatus(); //查看分片状态信息,会看到shards和databases的详细信息,包括刚建立的test_db1的主分片信息和test_db1.shardcollect的分片信息。
sharding version: { "_id" : 1, "version" : 3 } shards: { "_id" : "shard0000", "host" : "192.168.37.4:27020" } { "_id" : "shard0001", "host" : "192.168.37.4:27021" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test_db1", "partitioned" : true, "primary" : "shard0000" } test_db1.shardcollect chunks: shard0001 8 shard0000 6 { "id" : { $minKey : 1 } } -->> { "id" : 0 } on : shard0001 { "t" : 6000, "i" : 1 } { "id" : 0 } -->> { "id" : 70081 } on : shard0000 { "t": 5000, "i" : 1 } { "id" : 70081 } -->> { "id" : 130186 } on : shard0001 { "t" : 3000, "i" : 2 } { "id" : 130186 } -->> { "id" : 190374 } on : shard0001{ "t" : 3000, "i" : 4 } { "id" : 190374 } -->> { "id" : 250531 } on : shard0000{ "t" : 4000, "i" : 2 } { "id" : 250531 } -->> { "id" : 310680 } on : shard0000{ "t" : 4000, "i" : 4 } { "id" : 310680 } -->> { "id" : 370846 } on : shard0000{ "t" : 4000, "i" : 6 } { "id" : 370846 } -->> { "id" : 431019 } on : shard0000{ "t" : 4000, "i" : 8 } { "id" : 431019 } -->> { "id" : 491216 } on : shard0001{ "t" : 5000, "i" : 2 } { "id" : 491216 } -->> { "id" : 611561 } on : shard0001{ "t" : 5000, "i" : 4 } { "id" : 611561 } -->> { "id" : 731941 } on : shard0001{ "t" : 5000, "i" : 6 } { "id" : 731941 } -->> { "id" : 852261 } on : shard0001{ "t" : 5000, "i" : 8 } { "id" : 852261 } -->> { "id" : 972562 } on : shard0001{ "t" : 5000, "i" : 10 } { "id" : 972562 } -->> { "id" : { $maxKey : 1 } } on : shard0000 { "t" : 6000, "i" : 0 }
列出了 shard0001 8个trunk,shard0000 6个trun
按照id字段shard,并列出了每个trunk所在的sharding和id的范围
>show collections --查看数据集情况 >db.shardcollect.stats() --查看shardcollect数据集信息
通过以上设置就完成了最简单数据库集群配置