隨着移動互聯網的發展,大量的非結構化數據隨之產生,不只對數據庫存儲大數據提出了新的要求,同時對於查詢數據和進行大數據分析也提出了苛刻的要求,這些顯然是單服務器處理能力沒法知足的,天然創建一個集羣是不可避免的。集羣的複雜性你們衆所周知,而MongoDB的優點之一正式能夠幫助咱們解決這些問題。數據庫
分片(sharding)服務器
分片是MongoDB提供的一種機制,其能夠將大型的集合分割保存到不一樣的服務器上。與其餘的分區方案相比,MongoDB幾乎能自動爲咱們完成全部事情。只要咱們進行簡單的配置,並告訴MongoDB要分配的數據,它就能夠自動維護數據在不一樣服務器之間的平衡。同時根據須要增減服務器,MongoDB也會自動移動平移已有數據。大數據
分片機制提供了以下三種優點spa
1. 對集羣進行抽象,讓集羣「不可見」。blog
MongoDB自帶了一個叫作mongos的專有路由進程。mongos就是掌握統一路口的路由器,其會將客戶端發來的請求準確無誤的路由到集羣中的一個或者一組服務器上,同時會把接收到的響應拼裝起來發回到客戶端。進程
2.保證集羣老是可讀寫。資源
MongoDB經過多種途徑來確保集羣的可用性和可靠性。將MongoDB的分片和複製功能結合使用,在確保數據分片到多臺服務器的同時,也確保了每分數據都有相應的備份,這樣就能夠確保有服務器換掉時,其餘的副本能夠當即接替壞掉的部分繼續工做。路由
3.使集羣易於擴展。文檔
當系統須要更多的空間和資源的時候,MongoDB使咱們能夠按需方便的擴充系統容量。數據分析
實現數據分割
分片(shard)是集羣中存儲集合數據子集的一臺或者多臺服務器。在生產環境中一個分片一般是一個副本集(replica set)。
片鍵(key),MongoDB以其做爲依據來肯定須要在不一樣分片服務器之間移動的數據。例如咱們能夠選擇用戶名(username)字段做爲分片鍵,現有一用戶名區間[「p」,」z」],那麼wufengtinghai是屬於這一區間的,那麼數據最終會保存到與此區間對應的分片服務器上。
分配數據到分片服務器
分配數據到分片服務器可使用不一樣的方式,瞭解不一樣的方式能夠加深咱們對MongoDB使用方式的理解。
一分片一區間
分配數據到分片最簡單的方式莫過於一個區間一個分片。假設咱們有四個分片存儲用戶的相關信息,則咱們可能會獲得以下的分片和區間的對應關係。
這種分片方式很是簡單易懂,可是在一個大型繁忙的系統中卻會帶來許多的不便。假如大量的用戶使用首字母在【「a」,」f」)中的名字來註冊,這將會致使分片1比較大,所以須要將其一部分文檔移動到分片2上,咱們能夠調整分片1對應區間【」a」,」c」),使分片2的區間變成【」c」,」n」)。
若是移動數據後,分片2所以過載怎麼辦?假設分片1和分片2各有500G數據,而分片3和分片4各自有300G數據。那麼按照這個方案,最終須要一連串的複製,總共算下來須要移動400G數據,考慮到須要在集羣的服務器之間移動這些數據,可見移動數據量之大。
若是須要新加分片服務器進行水平擴展呢?假設此時每一個分片上都有了500G數據,那麼咱們如今須要將分片4上的400G數據移動到分片5,將分片3的300G數據移動到分片4,將分片2的200G數據移動到分片3,將分片1的100G數據移動到分片2,整整移動了1T的數據!
隨着分片數量和數據量的增加,這種噩夢將會持續下去,所以MongoDB不會採用這種方式。
一分片多區間
若是咱們採用一分片多區間的方式,咱們能夠將分片1上的數據劃分爲兩個區間,【」a」,」d」)包含400G數據,【」d」,」f」)包含100G數據,一樣咱們也能夠對分片2作相似的處理,獲得區間【」f」,」j」)和【「j」,」n」)。如今咱們只須要將分片1上的【」d」,」f」)數據移動到分片4,將分片2的【「j」,」n」)的數據移動到分片3。這樣咱們僅僅只須要移動200G數據。
若是要添加新分片,能夠從每一個分片頂端取100G數據並將其移動到新的分片上,這樣僅僅只須要移動400G數據便可。
MongoDB就是利用這種方式,當一個分片的數據愈來愈大時,其會自動分割片鍵區間,並將分片的數據進行分割並移動到其餘分片。