分片概念數據庫
若是把MongoDB只是當作一臺服務器在使用,每一個mongod實例都包含應用程序數據的完整副本.就算是使用了複製,每一個副本也都是完整克隆了其餘副本的數據.對於大多數應用程序而言,在一臺服務器上保存完整數據是徹底能夠接收的.服務器
可是隨着數據量的增加,以及應用程序對讀寫吞吐量的要求愈來愈高.普通服務器漸漸顯得捉襟見肘了,尤爲是這些服務器可能沒法分配足夠的內存.或者沒有足夠的CPU 核數來有效的處理工做負荷.除此以外,隨着數據量的增加,要在一塊網絡
磁盤或一組RAID陣列上保存和管理備份如此大規模的數據集也變得不太現實了,若是還想繼續使用普通硬件或者虛擬硬件來託管數據庫,那麼針對這類問題的解決方案就是將數據庫分佈在多臺服務器上,這種方法稱爲分片.spa
分片組件設計
分片集羣由分片,mongos路由器和配置服務器組成.接口
- 分片 MongoDB 分片集羣將數據分佈在一個或多個分片上,每一個分片都部署成一個MongoDB副本集,該副本集保存了集羣總體數據的一部分.由於每一個分片都是一個副本集.因此它們擁有本身的複製機制,可以自動進行故障轉移.你能夠直接鏈接大哥分片,就像鏈接單獨的副本集那樣,可是若是鏈接的副本集是分片集羣的一部分,那麼你只能看到部分數據
- mongos路由器 若是每一個分片都包含部分集羣數據,那麼還須要一個接口鏈接整個集羣,這個就是mongos.mongos進程是一個路由器,將全部的讀寫請求指引到合適的分片上,若是此以來,mongos爲客戶端提供了一個合理的系統視圖,mongos進程是輕量級且非持久化的,它們一般運行於與應用服務器相同的機器上,確保對任意分片的請求只通過依次網絡跳轉,換而言之,應用程序鏈接本地的mongos,而mongos管理了指向單獨分片的鏈接.
- 配置服務器 若是mongos進程是非持久化的,那麼必須有地方能持久保存集羣的公認狀態,這就是配置服務器的工做,其中持久化了分片集羣的元數據,該數據包括:全局集羣的配置;每一個數據庫,集合和特定範圍數據的位置;一份變動記錄,保存了數據在分片之間進行遷移的歷史信息.配置服務器中保存的元數據是某些特定功能和集羣維護的重中之重
核心分片操做進程
- 分片一個集合 MongoDB的分片是基於範圍的,也就是說分片集合裏面的每一個文檔都必須落在指定鍵的某個範圍內,MongoDB使用的所謂的分片鍵讓每一個文檔在這些範圍裏找到本身的位置.位於一個分片中的一段連續的分片鍵範圍稱爲塊,塊是邏輯上的劃分,非物理上的,換而言之,塊並非磁盤上的連續文檔.
- 拆分與遷移 分片機制的核心就是塊的拆分和遷移 在初始化分片集羣的時候只存在一個塊,這個塊的範圍涵蓋了整個分片集合,當這個塊的大小達到某個閥值時會對塊進行拆分,默認塊的最大尺寸是64MB或者100000個文檔,先達到哪一個標準就以哪一個爲準,在向新的分片集羣添加數據時,原始的塊最終會達到某個閥值,觸發塊的拆分,這是個簡單的操做,基本就是把原來的範圍一分爲二,這樣就有了兩個塊,每一個塊都有相同數量的文檔,須要注意的是塊的拆分是個邏輯操做,當MongoDB進行塊拆分時,它只是修改塊的元數據就能讓一個塊變成兩個塊,所以,拆分一個塊並不影響分片集合裏面文檔的物理順序,也就是說拆分既簡單有快捷,設計分片系統最大的困難就是保證數據始終均勻分佈,MongoDB的分片集羣是經過在分片中移動塊來實現均衡的,這個操做稱爲遷移,這是一個真實的物理操做.遷移是由名爲均衡器的(balancer)的軟件進程管理的,它的任務就是確保數據在各個分片中保存均勻分佈,經過跟蹤各個分片上塊的數量,就能實現這個功能,當集羣中擁有塊的最多的分片與擁有塊最少的分片的塊數差大於8時,均衡器就會發起依次均衡處理,在均衡處理的過程當中,塊會從塊較多的分片遷移到塊較少的分片上,直到兩個分片的塊數大體相等爲止.