MongoDB 支持分布式部署,自然也支持自動分片。
一、MongoDB集群包括一定數(shù)量的mongod(分片存儲數(shù)據(jù))、mongos(路由處理)、config server、clients。以下會一一介紹。
1、shards:一個shard為一組mongod,通常一組為兩臺,主從或互為主從,這一組mongod中的數(shù)據(jù)時相同的,具體可見《mongodb分布式之?dāng)?shù)據(jù)復(fù)制》。數(shù)據(jù)分割按有序分割方式,每個分片上的數(shù)據(jù)為某一范圍的數(shù)據(jù)塊,故可支持指定分片的范圍查詢,這同google的BigTable 類似。數(shù)據(jù)塊有指定的最大容量,一旦某個數(shù)據(jù)塊的容量增長到最大容量時,這個數(shù)據(jù)塊會切分成為兩塊;當(dāng)分片的數(shù)據(jù)過多時,數(shù)據(jù)塊將被遷移到系統(tǒng)的其他分片中。另外,新的分片加入時,數(shù)據(jù)塊也會遷移。
2、mongos:可以有多個,相當(dāng)于一個控制中心,負責(zé)路由和協(xié)調(diào)操作,使得集群像一個整體的系統(tǒng)。mongos可以運行在任何一臺服務(wù)器上,有些選擇放在shards服務(wù)器上,也有放在client 服務(wù)器上的。mongos啟動時需要從config servers上獲取基本信息,然后接受client端的請求,路由到shards服務(wù)器上,然后整理返回的結(jié)果發(fā)回給client服務(wù)器。
3、config server:存儲集群的信息,包括分片和塊數(shù)據(jù)信息。主要存儲塊數(shù)據(jù)信息,每個config server上都有一份所有塊數(shù)據(jù)信息的拷貝,以保證每臺config server上的數(shù)據(jù)的一致性。
4、shard key:為了分割數(shù)據(jù)集,需要制定分片key的格式,類似于用于索引的key格式,通常由一個或多個字段組成以分發(fā)數(shù)據(jù),比如:
{ name : 1 }
{ _id : 1 }
{ lastname : 1, firstname : 1 }
{ tag : 1, timestamp : -1 }
mongoDB的分片為有序存儲,shard key相鄰的數(shù)據(jù)通常會存在同一臺服務(wù)器(數(shù)據(jù)塊)上。config server的db中存儲的信息如下:
二、服務(wù)器部署可以有多種方式。首先,每臺config server、mongos、mongod都可以是單獨的服務(wù)器,但這樣會導(dǎo)致某些服務(wù)器的浪費,比如config server。下圖為物理機共享的集群部署,不需要額外加機器。
當(dāng)然也有其他的方案,比如把mongos部署在所有的mongod(server1-6)上,又或者在每個運用服務(wù)器(server7)上部署mongos。這樣部署有個好處在于,appserver和mongos之間的通信建立在localhost interface上,減少了通信成本。當(dāng)然,此乃官方說法,但本人有想法,盡管減少了appserver和mongos之間的通信成本,但mongos與mongod之間的通信成本卻增加了,而且把mongos部署在appserver上并不是很利于sa管理,mongoDB應(yīng)該是一個相對獨立的系統(tǒng),與應(yīng)用的耦合度應(yīng)該盡量降到最低,萬一應(yīng)用想要換數(shù)據(jù)庫,也能多少減少些工作量。當(dāng)然,視個人習(xí)慣了。