MongoDB之Shard初步認識

準備工做 前端

一、  什麼是shard mongodb

副本集實現了網站的安全備份和故障的無縫轉移,可是並不能實現數據的大容量存儲,MongoDB實現的是分佈式部署,把數據保存到其餘機器上。實現這一過程的就是分片。 數據庫

二、  何時須要分片 安全

a)          用光了當前機器的磁盤空間 服務器

b)         單個的Mongod已經沒法提供你要的寫入性能了 網絡

c)          須要把大部分數據駐留在內存中籍此來提供更好的性能 架構

三、  分片須要的三個部分 分佈式

a)          shard服務器(Shard Server)。Shard服務器是存儲實際數據的分片,每一個Shard能夠是一個mongod實例,也能夠是一組mongod實例構成的Replica Sets。MongoDB官方建議每一個Shard爲一組Replica Sets(結合了Master/Slave模式與自動數據容錯、自動恢復的綜合體,結構以下圖)。 ide

b)         配置服務器(Config Server)。它存儲了全部Shard節點的配置信息,每一個chunk的Shard key範圍,chunk在各Shard的分佈狀況以及集羣中全部DB和collection的Shard配置信息。 性能

c)          路由進程(Route Process)。一個前端路由,客戶端由此接入,首先詢問配置服務器須要到那個Shard上查詢或保存記錄,而後鏈接相應Shard執行操做,最後將結果返回客戶端。(相似於網絡中路由器的功能)

四、  未分片和分片Client反問mongod 的區別以下圖。

                       

     未分片客戶端的鏈接                                                       分片後客戶端的鏈接

五、  Shard Keys

MongoDB主要根據Shard Keys來劃分數據,Shard Keys能夠由文檔的一個或者多個物理鍵值組成,對於分片Key的選定直接決定了集羣中數據分佈是否均衡、集羣性能是否合理。

配置命令(參考《MongoDB:The Definiive Guide》,以及官網上的《MongoDB Manual》, http://docs.mongodb.org/manual/MongoDB-Manual.pdf

一.         總體架構

說明:

1.        因爲config servers很是重要,建議使用3個config servers,可是能夠只是用一個config servers。

2.        一個較好的Auto Sharding解決方案是將每一個一shard(分片)定爲一個Replica Sets(複製集)。一個Replica Sets由若干個mongod instance組成,在這個集合中,全部的instance的數據相同,這使得即便有某一臺機子當掉了,其它機子仍是能夠正常運行,並且這部分的控制是由Mongo自動完成的,於是儘量地減小了因當機而產生的錯誤及人工處理的部分。而Sharding是能夠將龐大的數據庫拆分爲幾個部分分別發放到每個shard,一來下降了單一一臺服務器的壓力,同時經過減小潛在的損失比例來提升效率。也就是說一個基於Replica Sets的Auto Sharding結構,能夠把一個完整並且龐大的數據庫根據我的定製,拆分到若干個服務器集合,每一個服務器集合中的服務器羣又相互保持數據同步,因此除非一個服務器集合中的全部服務器都當掉了,不然某臺或幾臺的當機對數據庫的影響是微忽其微的。

3.     一個完整的Auto Sharding功能的實現須要用到mongod和mongos,其中mongos做爲真正的應用接口,數據的輸入輸出都應通過它。而後還須要一個或多個config server(建議是三個),它是mongod,但它不會用來存儲應用程序的數據庫,通俗的來講而是存放了這整個結構的配置屬性,mongos會從config server中讀取配置來進行工做。最後是真正會存儲數據的mongod們,它們按組分爲若干個Replica Sets,用來存放mongos拆分下來的各個sharding。

4.     Config服務器存儲着集羣的metadata信息,包括每一個服務器,每一個shard的基本信息和chunk(後面介紹)信息Config服務器主要存儲的是chunk信息。每個config服務器都複製了完整的chunk信息。

5.     Set up a Sharded Cluster(一開始就容許shard)的步驟。詳細命令介紹參考
http://docs.mongodb.org/manual/administration/sharding/#list-databases-with-sharding-enabled

a)      Create data directories for each of the three config server instances.

b)      Start the three config server instances. 

c)      Start a mongos instance.

d)      Connect to one of the mongos instances. 

e)      Add shards to the cluster.

f)       Enable sharding for each database you want to shard.OR Enable sharding on a per-collection basis.

二.         Mongos

說明:

1.     mongos做爲真正的應用接口,數據的輸入輸出都應通過它。

2.     另外,mongos還有平衡shard的功能(後面介紹);

三.         shardKey

說明:

1.     命令:{ shardCollection: "<db>.<collection>", key: { "<shardkey>": 1 } }

2.    MongoDB主要根據Shard Keys來劃分數據,Shard Keys能夠由文檔的一個或者多個物理鍵值組成,對於分片Key的選定直接決定了集羣中數據分佈是否均衡、集羣性能是否合理。

四.         Chunks

說明:

1.     Chunk是一個來自特殊集合中的一個數據範圍,(collection,minKey,maxKey)描敘一個chunk,它介於minKey和maxKey範圍之間。例如chunks 的maxsize(默認值是64M)大小是100M,若是一個文件達到或超過這個範圍時,會被切分到2個新的chunks中。當一個shard的數據過量時,chunks將會被遷移到其餘的shards上。一樣,chunks也能夠遷移到其餘的shards上。

2.     Chunk包括了Shard Key取值在minKey和maxKey之間一組文檔集合,但Chunk並不存放實際數據。整個MongoDB的chunk元信息存放在config數據庫的chunks Colecttion中。

3.     當Chunk的大小達到maxsizeMongoDB會根據minKey和maxKey的一箇中間值將一個Chunk分裂(Split)爲兩個Chunk,分裂完畢後,MongoDB會根據各個Shard的負載狀況,決定是否將新Chunk移動到其餘Shard。

4.    經常使用命令參考
http://docs.mongodb.org/manual/administration/sharding/#list-databases-with-sharding-enabled

五.         Balance Shard

說明:

1.      shard don’t a range of chunks but a block of chunks which have a range of data by shardKey.

2.      > db.runCommand( { addshard : "10.0.4.85:27020", allowLocal : 1, maxSize:2 , minKey:1, maxKey:10} ) (網上有人測試出shard1中數據超過10M也沒有分片,暫時感受還有些問題,找了不少資料也沒有找到)

 

六.         Routed Request

說明:

1.     命令到達mongos,mongos判斷出了query指向某個shard,將命令直接指向該shard並獲得results並返回給用戶。

七.         Scatter Gather

說明:

1.     命令到達mongos,好比說查詢全部住在CA的說有用戶,mongos判斷出須要查詢全部的shards,便將這個命令分散傳達個每一個shard,每一個shard都獲得相關的結果(並按照默認的shardKey進行排序)返回給mongos,mongos將全部shard返回的結果進行merge(也按照shardKey進行排序)返回給用戶。

八.         Distributed Merge Sort

說明:

1.     命令到達mongos,好比說查詢全部住在CA的說有用戶並按照用戶名排序,mongos判斷出須要查詢全部的shards,便將這個命令分散傳達個每一個shard,每一個shard都獲得相關的結果並按照用戶名排序返回給mongos,mongos將全部shard返回的結果進行merge(按照用戶名排序)返回給用戶。

九.         操做命令

說明:

1.     當插入一個document時不含有shardKey的話會出現error。(Insert into it the documents which don’t have shardKey, it doesn‘t  work).

十.         查詢命令


以上的圖片均來源於互聯網和視頻(http://www.mongodb.org/display/DOCS/Sharding),本人剛剛開始瞭解MangoDB,有錯誤的地方但願你們多多指正!

相關文章
相關標籤/搜索