1. 程式人生 > >008.MongoDB分片群集概念及原理

008.MongoDB分片群集概念及原理

一 MongoDB分片介紹

1.1 分片

Mongodb另一種叢集,就是分片技術,可以滿足MongoDB資料量大量增長的需求。 當MongoDB儲存海量的資料時,一臺機器可能不足以儲存資料,也可能不足以提供可接受的讀寫吞吐量。這時,可通過在多臺機器上分割資料,使得資料庫系統能儲存和處理更多的資料。即通過分片進行水平擴充套件。 延伸: 複製與分片的區別:複製時讓多臺伺服器都擁有同樣的資料副本,每一臺伺服器都是其他伺服器的映象,而每一個分片都和其他分片擁有不同的資料子集。

1.2 為什麼使用分片

  • 複製所有的寫入操作到主節點
  • 延遲的敏感資料會在主節點查詢
  • 單個副本集限制在12個節點
  • 當請求量巨大時會出現記憶體不足。
  • 本地磁碟不足
  • 垂直擴充套件價格昂貴

1.3 分片的優勢

分片為應對高吞吐量與大資料量提夠了方法:
  • 使用分片減少了每個分片需要處理的請求數:通過水平擴充套件,群集可以提高自己的儲存容量。比如,當插入一條資料時,應用只需要訪問儲存這條資料的分片。
  • 使用分片減少了每個分片儲存的資料:分片的優勢在於提供類似線性增長的架構,提高資料可用性,提高大型資料庫查詢伺服器的效能。當MongoDB單點資料庫伺服器儲存成為瓶頸、單點資料庫伺服器的效能成為瓶頸或需要部署大型應用以充分利用記憶體時,可以使用分片技術。

二 MongoDB分片架構

2.1 主要元件

Shard:用於儲存實際的資料塊,實際生產環境中一個shard server角色可由幾臺機器組個一個replica set承擔,防止主機單點故障。 Config Server:mongod例項,儲存了整個 ClusterMetadata,其中包括 chunk資訊。 Query Routers:前端路由,客戶端由此接入,且讓整個叢集看上去像單一資料庫,前端應用可以透明使用。 資料劃分 MongoDB的資料劃分,是以集合級別為標準。分片通過shard key來劃分集合資料。

2.2 shard key

在集合中分發文件,MongoDB使用shard key對進行進行分片。shard key既可以是集合的每個文件的索引欄位也可以是集合中每個文件都有的組合索引欄位。 MongoDB將shard keys值按照塊(chunks)劃分,並且均勻的將這些chunks分配到各個分片上。MongoDB使用基於範圍劃分或基於雜湊劃分來劃分chunks的。 注意:確定shard key時需要謹慎,以確保叢集效能和效率。分片後不能更改shard key,也不能取消分片。

2.3 分片集和非分片集

資料庫可以混合使用分片和非分片集合。分片集合在叢集中的分片上進行分割槽和分佈,非分片集合儲存在主分片上,每個資料庫都有自己的主分片。

2.4 分片集連線

可以使用與連線到單個mongos相同的方式連線分片集mongod,如通過mongoshell或MongoDB 驅動程式。但必須連線到mongos路由器,才能與分片叢集中的任何集合進行互動。這包括分片和非分片集合,客戶端永遠不應連線到單個分片以執行讀取或寫入操作。

三 分片策略

3.1 基於範圍劃分

MongoDB通過shard key值將資料集劃分到不同的範圍就稱為基於範圍劃分。 對於數值型的shard key:可以虛構一條從負無窮到正無窮的直線(理解為x軸),每個shard key 值都落在這條直線的某個點上,然後MongoDB把這條線劃分為許多更小的沒有重複的範圍成為塊(chunks),一個chunk就是某些最小值到最大值的範圍。

3.2 基於雜湊劃分

MongoDB計算每個欄位的hash值,然後用這些hash值建立chunks。基於雜湊值的資料分佈有助於更均勻的資料分佈,尤其是在shard key單調變化的資料集中。 但是,雜湊分佈意味著對shard key的基於範圍的查詢不太可能以單個分片為目標,從而導致更多群集範圍的廣播操作。 基於範圍和基於雜湊劃分的效能比較: 基於範圍劃分對於範圍查詢比較高效。假設在shard key上進行範圍查詢,查詢路由很容易能夠知道哪些塊與這個範圍重疊,然後把相關查詢按照這個路線傳送到僅僅包含這些chunks的分片。 但是基於範圍劃分很容易導致資料不均勻分佈,這樣會削弱分片叢集的功能。例如當shard key是個成直線上升的欄位,如時間。那麼,所有在給定時間範圍內的請求都會對映到相同的chunk,也就是相同的分片上。這種情況下,小部分的分片將會承受大多數的請求,那麼系統整體擴充套件並不理想。 相反的,基於雜湊劃分是以犧牲高效範圍查詢為代價,它能夠均勻的分佈資料,雜湊值能夠保證資料隨機分佈到各個分片上。

3.3 自定義標籤劃分

MongoDB支援通過自定義標籤標記分片的方式直接平衡資料分佈策略,可以建立標籤並且將它們與shard key值的範圍進行關聯,然後分配這些標籤到各個分片上,最終平衡器轉移帶有標籤標記的資料到對應的分片上,確保叢集總是按標籤描述的那樣進行資料分佈。標籤是控制平衡器行為及叢集中塊分佈的主要方法。

四 資料均衡

新加入的資料及伺服器都會導致叢集資料分佈不平衡,MongoDB採用兩種方式確保資料分佈的平衡:

4.1 拆分

拆分是一個後臺程序,防止塊變得太大。當一個塊增長到指定塊大小的時候,拆分程序就會塊一分為二,整個拆分過程是高效的。不會涉及到資料的遷移等操作。

4.2 平衡

平衡器是一個後臺程序,管理塊的遷移。平衡器能夠執行在叢集任何的mongd例項上。當叢集中資料分佈不均勻時,平衡器就會將某個分片中比較多的塊遷移到擁有塊較少的分片中,直到資料分片平衡為止。 舉個例子:如果集合users有100個塊在分片1裡,50個塊在分片2中,那麼平衡器就會將分片1中的塊遷移到分片2中,直到維持平衡。 分片採用後臺操作的方式管理著源分片和目標分片之間塊的遷移。在遷移的過程中,源分片中的塊會將所有文件傳送到目標分片中,然後目標分片會獲取並應用這些變化。最後,更新配置伺服器上關於塊位置元資料。

4.3 從叢集中增加和刪除分片

新增新分片到叢集中會產生資料不平衡,因為新分片中沒有塊,當MongoDB開始遷移資料到新分片中時,等到資料分片平衡需要一定時間。 當刪除一個分片時,平衡器將會把分片中所有塊遷移到另一個分片中,在完成這些遷移並更新元資料後,才可安全的刪除分片了。 更多分片參考官方:https://docs.mongodb.com/manual/sharding/#sharding-strategy 相關參考: https://blog.51cto.com/13643643/2148825 https://www.cnblogs.com/Jtianlin/p/5128977.html https://www.jianshu.com/p/cb55bb333e