天天看點

MongoDB入門實戰教程(13)

MongoDB入門實戰教程(13)

MongoDB的一大特色就在于其原生的橫向擴充能力,具體展現就是分片集。本篇,我們來了解一下MongoDB分片集的機制及其原理。本文簡單介紹了MongoDB分片集的機制及原理,最後介紹了MongoDB資料分片的三種基本政策。

MongoDB的一大特色就在于其原生的橫向擴充能力,具體展現就是分片集。本篇,我們來了解一下MongoDB分片集的機制及其原理。

1 為什麼要分片?

我們都知道,在關系型資料庫如MySQL中,當資料量過大造成事務執行緩慢的時候,減少每次查詢資料總量是解決之道。因為,資料量一旦過大,索引也會相應增大,這時對索引的維護成本也會增加,進而降低事務執行性能。這時,我們的總體解決思路一般都是 分表。

在MongoDB中,當資料容量日益增大通路性能日漸降低時,單庫已有巨大資料量如10TB時,我們的解決思路其實也是 分表,隻不過在MongoDB中,這叫 分片集。

分片集是MongoDB提供的一個原生的橫向擴充能力,無需引入其他的中間件就可以輕松實作。

未分片:

MongoDB入門實戰教程(13)

兩個分片集:

MongoDB入門實戰教程(13)

當使用分片之後,單個分片集的資料量就有了限制,進而保證了查詢的性能。更為重要的是,增加一個分片,使用的時間可控,這就為橫向擴充提供了良好的基礎。

2 引入分片集的部署架構

首先,我們來看看MongoDB常見部署的架構,如下圖所示:

MongoDB入門實戰教程(13)

可以看到,MongoDB可以單機運作、可以複制集運作 也可以 分片叢集運作。複制集可以保證資料的高可用,而分片叢集則可以保證橫向擴充性。

其次,我們來看看一個完整分片叢集到底長什麼樣,它如下圖所示:

MongoDB入門實戰教程(13)

從上圖所知,整個分片叢集會包括如下幾個組成部分:

(1)mongos

mongos是路由節點,它承上啟下,作為mongodb叢集的單一入口,它主要轉發應用程式端的請求 并 選擇合适的資料節點進行讀寫,最後合并多個資料節點的傳回。mongos是無狀态的,一般建議至少部署兩個節點,推薦三個。

(2)config

config是配置(目錄)節點,你可以了解為它存儲了如何分片的規則,這些規則就是中繼資料,類似于下表所示的資料:

MongoDB入門實戰教程(13)

(3)replica set 複制集

複制集節點就是最終的資料存儲節點了,以複制集為機關,橫向擴充。MongoDB允許最大有1024個分片,每個分片的資料不重複,所有分片在一起才可以完整工作。在實際應用場景中,最佳實踐是每個分片的資料量盡量不超過3TB,盡可能保持在2TB内一個分片,可以提供最佳的讀寫性能。

這裡再介紹一下,一個分片叢集内部到底包含哪些東西?

MongoDB入門實戰教程(13)

一個叢集(Cluster)包括多個分片(Shard),每個分片包含多個塊(Chunk),每個塊包含多個文檔(Document),每個文檔包含了一行含有片鍵(Shard Key)的資料,而這個片鍵就是文檔中的一個用來進行分片的字段。

最後,MongoDB分片叢集到底有什麼特點?

(1)對于應用程式端,它完全透明,不需要額外的特殊處理,隻需要對接mongos節點就行。

(2)mongos對資料自動均衡,應用程式端不需要像Memcached一樣做用戶端負載均衡。

(3)分片集可以做到動态擴容,無須對已有MongoDB服務下線。

是以,基于分片集的這些機制和特點,建議生産環境盡量使用分片叢集,當然前提是你有足夠的硬體資源如CPU、記憶體 和 磁盤。

3 分片集的資料分布政策

MongoDB分片集提供了三種資料分布的政策:

(1)基于範圍(Range)

(2)基于哈希(Hash)

(3)基于zone/tag

首先,基于範圍的資料分片很好了解,通常會按照某個字段如建立日期來區分不同範圍的資料存儲。

MongoDB入門實戰教程(13)

其優點是分片範圍的查詢性能足夠好,缺點是存在熱點資料問題,資料的分布可能會不夠均勻。

其次,基于Hash的分片政策也比較好了解,通常會按照某個字段的哈希值來确定資料存儲的位置。

MongoDB入門實戰教程(13)

其優點是資料的分布會比較均勻,缺點則是範圍查詢的效率會較低,因為可能會涉及在多個節點讀取資料并聚合。

最後,基于zone/tag的資料分片則有點不太好了解,它不是一般我們所熟知的分片方式。所謂基于zone/tag的資料分片,一般是指在兩地三中心或異地多活的應用場景中,如果資料存在地域性的通路需求,那麼就可以自定義Zone來進行分片。

MongoDB入門實戰教程(13)

通過打tag的方式,可以實作将為某個地域服務的資料存儲到指定地域的資料分片上(比如CountryCode=NewYork),最終實作本地讀和本地寫的目的。

4 分片叢集的搭建

由于MongoDB分片叢集的搭建偏運維,我這裡就不做實踐了。

網上有很多相關的操作指南,有興趣的童鞋也可以看看這篇:MongoDB 4.4.1 分片集搭建

5 總結

本文簡單介紹了MongoDB分片集的機制及原理,最後介紹了MongoDB資料分片的三種基本政策。

下一篇,我們會總結MongoDB應用開發的最佳實踐,它也會是本系列的最後一篇文章。

參考資料

唐建法,《MongoDB高手課》(極客時間)

郭遠威,《MongoDB實戰指南》(圖書)

MongoDB入門實戰教程(13)

作者:周旭龍

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結。

繼續閱讀