
MongoDB的一大特色就在于其原生的橫向擴充能力,具體展現就是分片集。本篇,我們來了解一下MongoDB分片集的機制及其原理。本文簡單介紹了MongoDB分片集的機制及原理,最後介紹了MongoDB資料分片的三種基本政策。
MongoDB的一大特色就在于其原生的橫向擴充能力,具體展現就是分片集。本篇,我們來了解一下MongoDB分片集的機制及其原理。
1 為什麼要分片?
我們都知道,在關系型資料庫如MySQL中,當資料量過大造成事務執行緩慢的時候,減少每次查詢資料總量是解決之道。因為,資料量一旦過大,索引也會相應增大,這時對索引的維護成本也會增加,進而降低事務執行性能。這時,我們的總體解決思路一般都是 分表。
在MongoDB中,當資料容量日益增大通路性能日漸降低時,單庫已有巨大資料量如10TB時,我們的解決思路其實也是 分表,隻不過在MongoDB中,這叫 分片集。
分片集是MongoDB提供的一個原生的橫向擴充能力,無需引入其他的中間件就可以輕松實作。
未分片:
兩個分片集:
當使用分片之後,單個分片集的資料量就有了限制,進而保證了查詢的性能。更為重要的是,增加一個分片,使用的時間可控,這就為橫向擴充提供了良好的基礎。
2 引入分片集的部署架構
首先,我們來看看MongoDB常見部署的架構,如下圖所示:
可以看到,MongoDB可以單機運作、可以複制集運作 也可以 分片叢集運作。複制集可以保證資料的高可用,而分片叢集則可以保證橫向擴充性。
其次,我們來看看一個完整分片叢集到底長什麼樣,它如下圖所示:
從上圖所知,整個分片叢集會包括如下幾個組成部分:
(1)mongos
mongos是路由節點,它承上啟下,作為mongodb叢集的單一入口,它主要轉發應用程式端的請求 并 選擇合适的資料節點進行讀寫,最後合并多個資料節點的傳回。mongos是無狀态的,一般建議至少部署兩個節點,推薦三個。
(2)config
config是配置(目錄)節點,你可以了解為它存儲了如何分片的規則,這些規則就是中繼資料,類似于下表所示的資料:
(3)replica set 複制集
複制集節點就是最終的資料存儲節點了,以複制集為機關,橫向擴充。MongoDB允許最大有1024個分片,每個分片的資料不重複,所有分片在一起才可以完整工作。在實際應用場景中,最佳實踐是每個分片的資料量盡量不超過3TB,盡可能保持在2TB内一個分片,可以提供最佳的讀寫性能。
這裡再介紹一下,一個分片叢集内部到底包含哪些東西?
一個叢集(Cluster)包括多個分片(Shard),每個分片包含多個塊(Chunk),每個塊包含多個文檔(Document),每個文檔包含了一行含有片鍵(Shard Key)的資料,而這個片鍵就是文檔中的一個用來進行分片的字段。
最後,MongoDB分片叢集到底有什麼特點?
(1)對于應用程式端,它完全透明,不需要額外的特殊處理,隻需要對接mongos節點就行。
(2)mongos對資料自動均衡,應用程式端不需要像Memcached一樣做用戶端負載均衡。
(3)分片集可以做到動态擴容,無須對已有MongoDB服務下線。
是以,基于分片集的這些機制和特點,建議生産環境盡量使用分片叢集,當然前提是你有足夠的硬體資源如CPU、記憶體 和 磁盤。
3 分片集的資料分布政策
MongoDB分片集提供了三種資料分布的政策:
(1)基于範圍(Range)
(2)基于哈希(Hash)
(3)基于zone/tag
首先,基于範圍的資料分片很好了解,通常會按照某個字段如建立日期來區分不同範圍的資料存儲。
其優點是分片範圍的查詢性能足夠好,缺點是存在熱點資料問題,資料的分布可能會不夠均勻。
其次,基于Hash的分片政策也比較好了解,通常會按照某個字段的哈希值來确定資料存儲的位置。
其優點是資料的分布會比較均勻,缺點則是範圍查詢的效率會較低,因為可能會涉及在多個節點讀取資料并聚合。
最後,基于zone/tag的資料分片則有點不太好了解,它不是一般我們所熟知的分片方式。所謂基于zone/tag的資料分片,一般是指在兩地三中心或異地多活的應用場景中,如果資料存在地域性的通路需求,那麼就可以自定義Zone來進行分片。
通過打tag的方式,可以實作将為某個地域服務的資料存儲到指定地域的資料分片上(比如CountryCode=NewYork),最終實作本地讀和本地寫的目的。
4 分片叢集的搭建
由于MongoDB分片叢集的搭建偏運維,我這裡就不做實踐了。
網上有很多相關的操作指南,有興趣的童鞋也可以看看這篇:MongoDB 4.4.1 分片集搭建
5 總結
本文簡單介紹了MongoDB分片集的機制及原理,最後介紹了MongoDB資料分片的三種基本政策。
下一篇,我們會總結MongoDB應用開發的最佳實踐,它也會是本系列的最後一篇文章。
參考資料
唐建法,《MongoDB高手課》(極客時間)
郭遠威,《MongoDB實戰指南》(圖書)
作者:周旭龍
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結。