from:http://hi.baidu.com/lzpsky/blog/category/Mongodb 
MongoDB 支持分布式部署,自然也支持自動分片。

一、MongoDB集群包括一定數量的mongod(分片存儲數據)、mongos(路由處理)、config server、clients。以下會一一介紹。

1、shards:一個shard為一組mongod,通常一組為兩臺,主從或互為主從,這一組mongod中的數據時相同的,具體可見《mongodb分布式之數據復制》。數據分割按有序分割方式,每個分片上的數據為某一范圍的數據塊,故可支持指定分片的范圍查詢,這同google的BigTable 類似。數據塊有指定的最大容量,一旦某個數據塊的容量增長到最大容量時,這個數據塊會切分成為兩塊;當分片的數據過多時,數據塊將被遷移到系統的其他分片中。另外,新的分片加入時,數據塊也會遷移。

2、mongos:可以有多個,相當于一個控制中心,負責路由和協調操作,使得集群像一個整體的系統。mongos可以運行在任何一臺服務器上,有些選擇放在shards服務器上,也有放在client 服務器上的。mongos啟動時需要從config servers上獲取基本信息,然后接受client端的請求,路由到shards服務器上,然后整理返回的結果發回給client服務器。

3、config server:存儲集群的信息,包括分片和塊數據信息。主要存儲塊數據信息,每個config server上都有一份所有塊數據信息的拷貝,以保證每臺config server上的數據的一致性。

4、shard key:為了分割數據集,需要制定分片key的格式,類似于用于索引的key格式,通常由一個或多個字段組成以分發數據,比如:

{ name : 1 }
{ _id : 1 }
{ lastname : 1, firstname : 1 }
{ tag : 1, timestamp : -1 }

      mongoDB的分片為有序存儲(1為升序,-1為降序),shard key相鄰的數據通常會存在同一臺服務器(數據塊)上。config server的db中存儲的信息如下:



二、服務器部署可以有多種方式。首先,每臺config server、mongos、mongod都可以是單獨的服務器,但這樣會導致某些服務器的浪費,比如config server。下圖為物理機共享的集群部署,不需要額外加機器。


      當然也有其他的方案,比如把mongos部署在所有的mongod(server1-6)上,又或者在每個運用服務器(server7)上部署mongos。這樣部署有個好處在于,appserver和mongos之間的通信建立在localhost interface上,減少了通信成本。當然,此乃官方說法,但本人有想法,盡管減少了appserver和mongos之間的通信成本,但mongos與mongod之間的通信成本卻增加了,而且把mongos部署在appserver上并不是很利于sa管理,mongoDB應該是一個相對獨立的系統,與應用的耦合度應該盡量降到最低,萬一應用想要換數據庫,也能多少減少些工作量。當然,視個人習慣了。