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