MongoDB目前3大核心優點:『靈活模式』+ 『高可用性』 + 『可擴展性』,經過json文檔來實現靈活模式,經過複製集來保證高可用,經過Sharded cluster來保證可擴展性。mongodb
什麼時候使用分片技術數據庫
存儲容量需求超出單機磁盤容量
活躍的數據集超出單機內存容量,致使不少請求都要從磁盤讀取數據,影響性能
寫IOPS超出單個MongoDB節點的寫服務能力
json
分片技術,使得集合中的數據分散到多個分片集中。使得MongoDB具有橫向的發展。後端
Sharded cluster由Shard、Mongos和Config server 3個組件構成。
架構
Mongos是Sharded cluster的訪問入口,
Mongos自己並不持久化數據,Sharded cluster全部的元數據都會存儲到Config Server
而用戶的數據則會分散存儲到各個shard。Mongos啓動後,會從config server加載元數據,開始提供服務,將用戶的請求正確路由到對應的Shard。
負載均衡
分片支持單個集合的數據分散在多個分片上。目前主要有兩種數據分片的策略。運維
如圖,集合是根據字段來進行分片。根據字段的範圍不一樣將一個集合的數據存儲在不一樣的分片中。
在同一個Shard上,每一個Shard能夠存儲不少個chunk,chunk存儲在哪一個shard的信息會存儲在Config server種,mongos也會根據各個shard上的chunk的數量來自動作負載均衡。
範圍分片適合知足在必定範圍內的查找,例如查找X的值在【100-200】之間的數據,mongo 路由根據Config server中存儲的元數據,能夠直接定位到指定的shard的Chunk中
缺點 若是shardkey有明顯遞增(或者遞減)趨勢,則新插入的文檔多會分佈到同一個chunk,沒法擴展寫的能力性能
Hash分片是根據用戶的shard key計算hash值(64bit整型),根據hash值按照『範圍分片』的策略將文檔分佈到不一樣的chunkserver
優勢Hash分片與範圍分片互補,能將文檔隨機的分散到各個chunk,充分的擴展寫能力,彌補了範圍分片的不足,
缺點但不能高效的服務範圍查詢,全部的範圍查詢要分發到後端全部的Shard才能找出知足條件的文檔。blog
選擇shard key時,要根據業務的需求及『範圍分片』和『Hash分片』2種方式的優缺點合理選擇,要根據字段的實際緣由對數據進行分片,不然會產生過大的Chunk
Mongos做爲Sharded cluster的訪問入口,全部的請求都由mongos來路由、分發、合併,這些動做對客戶端driver透明,用戶鏈接mongos就像鏈接mongod同樣使用。
查詢請求包含shard key,則直接根據shard key計算出須要查詢的chunk,向對應的shard發送查詢請求
寫操做必須包含shard key,mongos根據shard key算出文檔應該存儲到哪一個chunk,而後將寫請求發送到chunk所在的shard。
更新、刪除請求的查詢條件必須包含shard key或者_id,若是是包含shard key,則直接路由到指定的chunk,若是隻包含_id,則需將請求發送至全部的shard。
Config server存儲Sharded cluster的全部元數據,全部的元數據都存儲在config數據庫
Config Server可部署爲一個獨立的複製集,極大的方便了Sharded cluster的運維管理。
config.shards集合存儲各個Shard的信息,可經過addShard、removeShard命令來動態的從Sharded cluster裏增長或移除shard
config.databases集合存儲全部數據庫的信息,包括DB是否開啓分片,primary shard信息,對於數據庫內沒有開啓分片的集合,全部的數據都會存儲在數據庫的primary shard上。
數據分片是針對集合維度的,某個數據庫開啓分片功能後,若是須要讓其中的集合分片存儲,則需調用shardCollection命令來針對集合開啓分片。
集合分片開啓後,默認會建立一個新的chunk,shard key取值[minKey, maxKey]內的文檔(即全部的文檔)都會存儲到這個chunk。當使用Hash分片策略時,也能夠預先建立多個chunk,以減小chunk的遷移。
config.settings集合裏主要存儲sharded cluster的配置信息,好比chunk size,是否開啓balancer等
config.locks存儲鎖相關的信息,對某個集合進行操做時,好比moveChunk,須要先獲取鎖,避免多個mongos同時遷移同一個集合的chunk。