天天看點

MongoDB分片之資料分割方式

随着移動網際網路的發展,大量的非結構化資料随之産生,不僅對資料庫存儲大資料提出了新的要求,同時對于查詢資料和進行大資料分析也提出了苛刻的要求,這些顯然是單伺服器處理能力無法滿足的,自然建立一個叢集是不可避免的。叢集的複雜性大家衆所周知,而MongoDB的優勢之一正式可以幫助我們解決這些問題。

分片(sharding)

分片是MongoDB提供的一種機制,其可以将大型的集合分割儲存到不同的伺服器上。與其他的分區方案相比,MongoDB幾乎能自動為我們完成所有事情。隻要我們進行簡單的配置,并告訴MongoDB要配置設定的資料,它就可以自動維護資料在不同伺服器之間的平衡。同時根據需要增減伺服器,MongoDB也會自動移動平移已有資料。

分片機制提供了如下三種優勢

1. 對叢集進行抽象,讓叢集“不可見”。

MongoDB自帶了一個叫做mongos的專有路由程序。mongos就是掌握統一路口的路由器,其會将用戶端發來的請求準确無誤的路由到叢集中的一個或者一組伺服器上,同時會把接收到的響應拼裝起來發回到用戶端。

2.保證叢集總是可讀寫。

MongoDB通過多種途徑來確定叢集的可用性和可靠性。将MongoDB的分片和複制功能結合使用,在確定資料分片到多台伺服器的同時,也確定了每分資料都有相應的備份,這樣就可以確定有伺服器換掉時,其他的副本可以立即接替壞掉的部分繼續工作。

3.使叢集易于擴充。

當系統需要更多的空間和資源的時候,MongoDB使我們可以按需友善的擴充系統容量。

實作資料分割

分片(shard)是叢集中存儲集合資料子集的一台或者多台伺服器。在生産環境中一個分片通常是一個副本集(replica set)。

MongoDB分片之資料分割方式

片鍵(key),MongoDB以其作為依據來确定需要在不同分片伺服器之間移動的資料。例如我們可以選擇使用者名(username)字段作為分片鍵,現有一使用者名區間[“p”,”z”],那麼wufengtinghai是屬于這一區間的,那麼資料最終會儲存到與此區間對應的分片伺服器上。

配置設定資料到分片伺服器

配置設定資料到分片伺服器可以使用不同的方式,了解不同的方式可以加深我們對MongoDB使用方式的了解。

一分片一區間

配置設定資料到分片最簡單的方式莫過于一個區間一個分片。假設我們有四個分片存儲使用者的相關資訊,則我們可能會得到如下的分片和區間的對應關系。

MongoDB分片之資料分割方式

這種分片方式非常簡單易懂,但是在一個大型繁忙的系統中卻會帶來許多的不便。假如大量的使用者使用首字母在【“a”,”f”)中的名字來注冊,這将會導緻分片1比較大,是以需要将其一部分文檔移動到分片2上,我們可以調整分片1對應區間【”a”,”c”),使分片2的區間變成【”c”,”n”)。

MongoDB分片之資料分割方式

如果移動資料後,分片2是以過載怎麼辦?假設分片1和分片2各有500G資料,而分片3和分片4各自有300G資料。那麼按照這個方案,最終需要一連串的複制,總共算下來需要移動400G資料,考慮到需要在叢集的伺服器之間移動這些資料,可見移動資料量之大。

MongoDB分片之資料分割方式

如果需要新加分片伺服器進行水準擴充呢?假設此時每個分片上都有了500G資料,那麼我們現在需要将分片4上的400G資料移動到分片5,将分片3的300G資料移動到分片4,将分片2的200G資料移動到分片3,将分片1的100G資料移動到分片2,整整移動了1T的資料!

MongoDB分片之資料分割方式

随着分片數量和資料量的增長,這種噩夢将會持續下去,是以MongoDB不會采用這種方式。

一分片多區間

如果我們采用一分片多區間的方式,我們可以将分片1上的資料劃分為兩個區間,【”a”,”d”)包含400G資料,【”d”,”f”)包含100G資料,同樣我們也可以對分片2做類似的處理,得到區間【”f”,”j”)和【“j”,”n”)。現在我們隻需要将分片1上的【”d”,”f”)資料移動到分片4,将分片2的【“j”,”n”)的資料移動到分片3。這樣我們僅僅隻需要移動200G資料。

MongoDB分片之資料分割方式

如果要添加新分片,可以從每個分片頂端取100G資料并将其移動到新的分片上,這樣僅僅隻需要移動400G資料即可。

MongoDB分片之資料分割方式

MongoDB就是利用這種方式,當一個分片的資料越來越大時,其會自動分割片鍵區間,并将分片的資料進行分割并移動到其他分片。