Mongod DB中有Sharding(分片)和Replication(副本)两个功能。
前者主要是将数据水平分割到各个结点上,达到负载均衡的目的。
后者用于故障恢复。即一般一个Sharding有若干个Replication。
本文只讨论Sharding的情况,因为我们的环境机器本来就不够,不会拿来做Replication的。
配置Sharding有如下三个要素:
1、1~1000个Sharding。
2、1~3个mongo config服务器。
3、1~n个mongo routing服务器。
下面讨论配置
环境,我们用两个机器A和B,配置两个Shards。
1、下载
1 2 | wget http : //fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.5.tgz tar - xzvf . / mongodb - linux - x86_64 - 2.0.5.tgz |
2、执行mongod
在两个机器上分别启动mongod,如下:
1 2 3 4 5 6 7 8 | #创建数据文件夹 mkdir data
#启动, 后台服务模式, pid文件记录, 日志记录, 数据./data0 . / bin / mongod -- fork -- logpath = ` pwd ` / mongod . log -- pidfilepath = ` pwd ` / mongod . pid -- shardsvr -- dbpath = ` pwd ` / data /
#杀死进程,要用信号2! kill - 2 ` cat . / mongod . pid ` |
至此,A、B机器上启动了两个mongod进程,端口为27018
3、启动一个mongod config server
测试环境可以只有一个config server,线上环境建议有3个。我们就用第一台机器吧。
1 2 3 4 5 | # 创建config的数据目录 mkdir config_data
# 启动mongod config进程 . / bin / mongod -- fork -- logpath = ` pwd ` / mongoc . log -- pidfilepath = ` pwd ` / mongoc . pid -- dbpath = ` pwd ` / config_data -- configsvr |
至此,A机器上启动了mongod(config)进程,端口27019
4、启动一个mongos Router
mongos的–configdb参数如下:
1 | -- configdb arg 1 or 3 comma separated config servers |
要指定上面mongod(config)进程,由于我们只有1个,写一个就好。
1 2 | #启动mongos . / bin / mongos -- fork -- pidfilepath = ` pwd ` / mongos . pid -- logpath = ` pwd ` / mongos . log -- configdb = 172.22.0.12 : 27019 -- port 11000 |
5、配置Shard
刚才我们只是将各自部分启动起来,现在需要在中央控制中,将Shards对应到具体的mongod。
首先连接任意一个mongos(我们只有一个的说):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | # 连接先前配置的mongos . / bin / mongo AA . AA . AA . AA : 11000 / admin
# 先选择admin数据库 MongoDB shell version : 2.0.5 connecting to : 172.22.0.12 : 11000 / admin mongos > db admin mongos >
# 将A B C的mongod进程分别添加一次Shard mongos > db . runCommand ( { addshard : "A.A.A.A:13000]" , name : "shard_A" } ) ; { "shardAdded" : "shard0000" , "ok" : 1 }
mongos > db . runCommand ( { addshard : "B.B.B.B:13000]" , name : "shard_B" } ) ; { "shardAdded" : "shard0000" , "ok" : 1 }
mongos > db . runCommand ( { addshard : "C.C.C.C:13000]" , name : "shard_C" } ) ; { "shardAdded" : "shard0000" , "ok" : 1 }
# 列出、验证Shards mongos > db . runCommand ( { listshards : 1 } ) ; { "shards" : [ { "_id" : "shard0000" , "host" : "172.22.0.12:13000" } , { "_id" : "shard0001" , "host" : "172.22.0.16:13000" } ] , "ok" : 1 } |
6、启用Shards
必须在对应的DB/Coll上启用Shards,数据负载均衡才能生效!否则,只会存在一个Shards上!
注意在Colleciton启用Shards时候,还需要一个key做为划分依据。
关于划分key的选择:
1、最好是在插入中能包含的字段(否则会把插入发配到每个Shard上,速度很慢)。
2、尽量随机化。
1 2 3 4 5 6 7 | # 给db启用Shards mongos > db . runCommand ( { enablesharding : "test" } ) ; { "ok" : 1 }
# 给Coll启用Shards, 注意需要一个key做为划分依据 mongos > db . runCommand ( { shardcollection : "test.people" , key : { name : 1 } , unique : true } ) { "collectionsharded" : "test.people" , "ok" : 1 } |
7、创建DB、Coll
我们创建db:db
再创建一个Coll: people
由于都是lazy-make,所以我们直接创建数据即可
1 2 3 4 5 6 | # Create testdb . / bin / mongo 172.22.0.12 : 11000 / db MongoDB shell version : 2.0.5 connecting to : 172.22.0.12 : 11000 / db mongos > db db |
插入数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | mongos > for ( var i = 1 ; i <= 200000 ; i ++ ) db . people . save ( { name : "fly_people" , sex : "female" , age : 25 } ) ;
mongos > for ( var i = 1 ; i <= 20000000 ; i ++ ) db . people . save ( { name : "houxuefeng" , sex : "male" , age : 30 } ) ;
mongos > db . people . stats ( ) { "sharded" : true , "ns" : "test.people" , "count" : 462008 , "size" : 33264600 , "avgObjSize" : 72.00005194715243 , "storageSize" : 902522624 , "nindexes" : 2 , "nchunks" : 4 , "shards" : { "shard0000" : { "ns" : "test.people" , "count" : 402006 , "size" : 28944448 , "avgObjSize" : 72.00003980040098 , "storageSize" : 891340544 , "numExtents" : 22 , "nindexes" : 2 , "lastExtentSize" : 155079936 , "paddingFactor" : 1 , "flags" : 1 , "totalIndexSize" : 58966016 , "indexSizes" : { "_id_" : 18694144 , "name_1" : 40271872 } , "ok" : 1 } , "shard0001" : { "ns" : "test.people" , "count" : 60002 , "size" : 4320152 , "avgObjSize" : 72.00013332888904 , "storageSize" : 11182080 , "numExtents" : 6 , "nindexes" : 2 , "lastExtentSize" : 8388608 , "paddingFactor" : 1 , "flags" : 1 , "totalIndexSize" : 5275648 , "indexSizes" : { "_id_" : 2498560 , "name_1" : 2777088 } , "ok" : 1 } } , "ok" : 1 } |
备注:数据到达一定规模才会开始进行负载均衡!
参考文章1:《MongoDB auto shard配置说明》
参考文章2:《Configuring Sharding》
8、其他命令:
列出db
1 2 | mongos > show dbs config 0.1875GB |
列出collection
1 | show collections |
切换数据库
1 | use dbname |
列出collection详情
1 | db . printCollectionStats ( ) |
删除Collection
1 | db . foo . drop ( ) |
创建索引
1 | db . doc . ensureIndex ( { id : 1 } , { unique : true , dropDups : true } ) |
更多DB级别的可以参考:http://www.mongodb.org/display/DOCS/DBA+Operations+from+the+Shell