MongoDB分片介紹

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

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

 

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

 

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

 

垂直擴容就是增長單個服務器的容量,好比,使用更高性能的CPU,增長RAM容量,或者增長存儲容量。可是單個服務器擴容是有限制性的,況且,雲設備提供商在硬件配置上很容易達到容量上限。因此垂直擴容頗有限制性。server

 

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

 

分片集羣

分片集羣包括如下幾個成員:索引

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分片

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

 

 

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

相關文章
相關標籤/搜索