本文簡單介紹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分片
範圍分片是依據片鍵值的範圍進行分片的,每一個分片服務器存儲必定範圍的數據。
片鍵值相近的數據就頗有可能會被分配到同一個塊中。對於範圍分片來講,片鍵的選擇很重要,片鍵選擇合適就能夠大大提升系統的系統,反之亦然。選擇的片鍵不合理會致使數據分佈不均勻,反而體現不出分片的優點或者形成系統早早出現系統瓶頸。