1. 程式人生 > >MongoDB分片介紹

MongoDB分片介紹

可擴展 簡單 性能 方法 但是 分數 .com 環境 接口

本文簡單介紹MongoDB的分片功能,對分片進行了概述,具體的功能詳解,後續文章會陸續推出

分片是把數據分配到多個服務器上的一種方式,MongoDB使用分片實現大數據部署以及高吞吐操作。

大數據以及高吞吐量的應用會對單個服務器的容量造成很大的挑戰。比如,高頻率的查詢操作會消耗服務器的CPU,如果數據集大於系統的RAM容量,也會對硬盤的性能造成影響。

應對系統容量增加有兩種方式:水平擴展和垂直擴展。

垂直擴容就是增加單個服務器的容量,比如,使用更高性能的CPU,增加RAM容量,或者增加存儲容量。但是單個服務器擴容是有限制性的,何況,雲設備提供商在硬件配置上很容易達到容量上限。所以垂直擴容很有限制性。

水平擴容就是把數據和系統壓力分散到多個服務器上,增加多個服務器以達到增加整個系統容量的目的。盡管單個服務器的速度或者容量並不是很大,但是每個服務器都可以分擔一部分系統壓力,比單個高性能的服務器更加高效。增加整個部署系統的容量只需要增加幾臺服務器,這樣比增加單個服務的性能更節約成本。缺點就是增加了系統的復雜性以及系統的維護成本。

分片集群

分片集群包括以下幾個成員:

shard:每個shard包含一組分片數據,每個shard都可以以復制集的方式部署。

mongos:mongos的任務是查詢路由,是客戶端和分片集群之間的交互接口

config servers:配置服務器存放著系統的元數據以及集群的配置信息。MongoDB3.4之後,配置服務器必須用復制集的方式部署。

下圖是集群的示意圖:

技術分享圖片

分片是把數據分配到多個服務器上的一種方式,MongoDB使用分片實現大數據部署以及高吞吐操作。

大數據以及高吞吐量的應用會對單個服務器的容量造成很大的挑戰。比如,高頻率的查詢操作會消耗服務器的CPU,如果數據集大於系統的RAM容量,也會對硬盤的性能造成影響。

應對系統容量增加有兩種方式:水平擴展和垂直擴展。

垂直擴容就是增加單個服務器的容量,比如,使用更高性能的CPU,增加RAM容量,或者增加存儲容量。但是單個服務器擴容是有限制性的,何況,雲設備提供商在硬件配置上很容易達到容量上限。所以垂直擴容很有限制性。

水平擴容就是把數據和系統壓力分散到多個服務器上,增加多個服務器以達到增加整個系統容量的目的。盡管單個服務器的速度或者容量並不是很大,但是每個服務器都可以分擔一部分系統壓力,比單個高性能的服務器更加高效。增加整個部署系統的容量只需要增加幾臺服務器,這樣比增加單個服務的性能更節約成本。缺點就是增加了系統的復雜性以及系統的維護成本。

分片集群

分片集群包括以下幾個成員:

shard:每個shard包含一組分片數據,每個shard都可以以復制集的方式部署。

mongos:mongos的任務是查詢路由,是客戶端和分片集群之間的交互接口

config servers:配置服務器存放著系統的元數據以及集群的配置信息。MongoDB3.4之後,配置服務器必須用復制集的方式部署。

下圖是集群的示意圖:

MongoDB是在集合級別對數據進行分片的。

片鍵

MongoDB是使用片鍵對集合中的文檔進行分片的。片鍵是被分片集合中所有文檔都有的一個或者多個字段。

對集合分片時需要選擇片鍵,片鍵一旦選定後就不能再進行修改了。一個分片集合只能有一個片鍵。

對於非空集合,片鍵上必須有索引。如果集合是空的,MongoDB在創建片鍵的時候會自動在片鍵上創建索引。

片鍵的選擇會影響系統的性能、高效性以及集群的可擴展性。集群即使有最好的硬件設備,如果片鍵選擇有問題也會使集群很快達到性能瓶頸。片鍵的選擇也會影響集群使用的分片策略。

MongoDB分片會把數據分配到塊中。每個塊都含有基於片鍵的一部分數據。MongoDB通過均衡器實現各個分片服務器的數據的平衡性。

分片的優勢

讀寫

MongoDB集群通過分片來分散讀寫壓力,每個分片維護一部分集群操作,這樣通過增加分片就可以水平擴展讀寫能力。

如果查詢中含有片鍵,mongos會定位到具體的分片上。這種操作比遍歷整個集群要高效的多。

存儲

每個分片會維護一組數據,隨著數據增長,增加分片就能增加集群的容量。

高可用

分片集群在一個或者多個分片宕機的情況下仍然可以提供讀寫操作。即使宕機分片上的數據無法操作,其他可用分片上的數據還可以操作。

生產環境中,分片建議部署為復制集,提供冗余性以及可用性。

分片前需要考慮的事情

分片集群的基礎設施需要經過精細的容量規劃、執行、維護。

片鍵的選擇必須要謹慎,保證集群的性能和高效性。因為分片後片鍵不能再修改,也不能取消。如果查詢裏面沒有片鍵,mongos會遍歷整個集群,這種操作會比較耗時。

分片和非分片集合

數據庫可以含有分片集合以及非分片集合。分片集合被分配在集群的多個分片服務器中,未分片的集合存放在主分片中。每個數據庫都有一個主分片。

技術分享圖片

連接到分片集群

要想與分片中的集合進行交互,就必須先連接到mongos路由上。客戶端絕對不應該連接到單個分片上進行讀寫操作。連接mngos的方法和連接到單個mongod實例是一樣的。

技術分享圖片

分片策略

MongoDB支持兩種分片方式:hash分片、範圍分片

Hashed 分片

哈希分片就是把片鍵的值形成一組哈希值,每個分片依據哈希值的範圍存放一定量的文檔。

技術分享圖片

即使片鍵的值是相近的,但是他們的哈希值很可能不一樣,所有就不會分配在一個分片服務去上,這樣的好處就是,在分片鍵上基於範圍的查詢會分散到多個服務器上進行操作,減少了單個服務器的壓力。

Ranged分片

範圍分片是依據片鍵值的範圍進行分片的,每個分片服務器存儲一定範圍的數據。

技術分享圖片

片鍵值相近的數據就很有可能會被分配到同一個塊中。對於範圍分片來說,片鍵的選擇很重要,片鍵選擇合適就可以大大提高系統的系統,反之亦然。選擇的片鍵不合理會導致數據分布不均勻,反而體現不出分片的優勢或者造成系統早早出現系統瓶頸。

MongoDB分片介紹