3 回答

TA貢獻1852條經(jīng)驗 獲得超1個贊
Mongodb中一個被分片的Collection的所有數(shù)據(jù)都存放在眾多的Chunk中。一個Chunk存放分片字段的一個區(qū)間范圍的數(shù)據(jù)。選擇一個好的分片字段非常重要,否則就會遭遇到不能被拆分的大Chunk。
用上述的日志為例,如果選擇{server:1}來作為一個分片Key的話,一個server上的所有數(shù)據(jù)都是在同一個Chunk中,很容易想到一個Server上的日志數(shù)據(jù)會超過200MB(默認Chunk大?。?。如果分片Key是{server:1,time:1},那么能夠?qū)⒁粋€Server上的日志信息進行分片,直至毫秒級別,絕對不會存在不可被拆分的Chunk。
將Chunk的規(guī)模維持在一

TA貢獻1811條經(jīng)驗 獲得超6個贊
分片是MongoDB提供的一種機制,其可以將大型的集合分割保存到不同的服務(wù)器上。與其他的分區(qū)方案相比,MongoDB幾乎能自動為我們完成所有事情。只要我們進行簡單的配置,并告訴MongoDB要分配的數(shù)據(jù),它就可以自動維護數(shù)據(jù)在不同服務(wù)器之間的平衡。同時根據(jù)需要增減服務(wù)器,MongoDB也會自動移動平移已有數(shù)據(jù)。
分片機制提供了如下三種優(yōu)勢
1. 對集群進行抽象,讓集群“不可見”。
MongoDB自帶了一個叫做mongos的專有路由進程。mongos就是掌握統(tǒng)一路口的路由器,其會將客戶端發(fā)來的請求準確無誤的路由到集群中的一個或者一組服務(wù)器上,同時會把接收到的響應(yīng)拼裝起來發(fā)回到客戶端。
2.保證集群總是可讀寫。
MongoDB通過多種途徑來確保集群的可用性和可靠性。將MongoDB的分片和復制功能結(jié)合使用,在確保數(shù)據(jù)分片到多臺服務(wù)器的同時,也確保了每分數(shù)據(jù)都有相應(yīng)的備份,這樣就可以確保有服務(wù)器換掉時,其他的副本可以立即接替壞掉的部分繼續(xù)工作。
3.使集群易于擴展。
當系統(tǒng)需要更多的空間和資源的時候,MongoDB使我們可以按需方便的擴充系統(tǒng)容量。
實現(xiàn)數(shù)據(jù)分割
分片(shard)是集群中存儲集合數(shù)據(jù)子集的一臺或者多臺服務(wù)器。在生產(chǎn)環(huán)境中一個分片通常是一個副本集(replica set)。
片鍵(key),MongoDB以其作為依據(jù)來確定需要在不同分片服務(wù)器之間移動的數(shù)據(jù)。例如我們可以選擇用戶名(username)字段作為分片鍵,現(xiàn)有一用戶名區(qū)間[“p”,”z”],那么wufengtinghai是屬于這一區(qū)間的,那么數(shù)據(jù)最終會保存到與此區(qū)間對應(yīng)的分片服務(wù)器上。
分配數(shù)據(jù)到分片服務(wù)器
分配數(shù)據(jù)到分片服務(wù)器可以使用不同的方式,了解不同的方式可以加深我們對MongoDB使用方式的理解。
一分片一區(qū)間
分配數(shù)據(jù)到分片最簡單的方式莫過于一個區(qū)間一個分片。假設(shè)我們有四個分片存儲用戶的相關(guān)信息,則我們可能會得到如下的分片和區(qū)間的對應(yīng)關(guān)系。
這種分片方式非常簡單易懂,但是在一個大型繁忙的系統(tǒng)中卻會帶來許多的不便。假如大量的用戶使用首字母在【“a”,”f”)中的名字來注冊,這將會導致分片1比較大,因此需要將其一部分文檔移動到分片2上,我們可以調(diào)整分片1對應(yīng)區(qū)間【”a”,”c”),使分片2的區(qū)間變成【”c”,”n”)。
如果移動數(shù)據(jù)后,分片2因此過載怎么辦?假設(shè)分片1和分片2各有500G數(shù)據(jù),而分片3和分片4各自有300G數(shù)據(jù)。那么按照這個方案,最終需要一連串的復制,總共算下來需要移動400G數(shù)據(jù),考慮到需要在集群的服務(wù)器之間移動這些數(shù)據(jù),可見移動數(shù)據(jù)量之大。
如果需要新加分片服務(wù)器進行水平擴展呢?假設(shè)此時每個分片上都有了500G數(shù)據(jù),那么我們現(xiàn)在需要將分片4上的400G數(shù)據(jù)移動到分片5,將分片3的300G數(shù)據(jù)移動到分片4,將分片2的200G數(shù)據(jù)移動到分片3,將分片1的100G數(shù)據(jù)移動到分片2,整整移動了1T的數(shù)據(jù)!
隨著分片數(shù)量和數(shù)據(jù)量的增長,這種噩夢將會持續(xù)下去,因此MongoDB不會采用這種方式。
一分片多區(qū)間
如果我們采用一分片多區(qū)間的方式,我們可以將分片1上的數(shù)據(jù)劃分為兩個區(qū)間,【”a”,”d”)包含400G數(shù)據(jù),【”d”,”f”)包含100G數(shù)據(jù),同樣我們也可以對分片2做類似的處理,得到區(qū)間【”f”,”j”)和【“j”,”n”)?,F(xiàn)在我們只需要將分片1上的【”d”,”f”)數(shù)據(jù)移動到分片4,將分片2的【“j”,”n”)的數(shù)據(jù)移動到分片3。這樣我們僅僅只需要移動200G數(shù)據(jù)。
如果要添加新分片,可以從每個分片頂端取100G數(shù)據(jù)并將其移動到新的分片上,這樣僅僅只需要移動400G數(shù)據(jù)即可。
MongoDB就是利用這種方式,當一個分片的數(shù)據(jù)越來越大時,其會自動分割片鍵區(qū)間,并將分片的數(shù)據(jù)進行分割并移動到其他分片。
- 3 回答
- 0 關(guān)注
- 896 瀏覽
添加回答
舉報