準備工做 前端
一、 什麼是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,有錯誤的地方但願你們多多指正!