在集羣中, mongos 負責將查詢與寫入分發到 分片 中.使用 mongos,應用有了訪問集羣的統一入口,而不須要直接訪問集羣的每一個分片.html
經過緩存 配置服務器 中集羣的元信息, mongos 能夠得知數據所位於的分片. mongos 使用這些元信息將應用的讀寫請求分發到不一樣的分片, mongos 不存儲集羣 持續 的狀態(意思是, mongos 能夠隨時被重啓或者添加,而不會形成集羣的數據丟失,也不會形成集羣的異常.),而且佔有較少的系統資源.數據庫
最多見的作法是將 mongos 運行在應用所在的系統上,不過在分片上或者其餘專用的機器上運行也是能夠的.緩存
"mongos" 如何決定哪一個分片應該接收到請求服務器
在 cluster <sharded cluster>`中, :program:`mongos 使用如下步驟分發請求:數據結構
肯定必須接收請求的 分片 列表.app
在全部目標分片上創建遊標 在某些狀況下,當查詢條件包含 shard key 或者 shard key 的前綴時,:program:mongos 能夠將請求分發到部分分片上,不然, mongos 會將請求分發到 全部 存儲這個集合的分片上. ``mongos``如何處理查詢修飾符 若是查詢結果沒有排序, mongos 會打開一個結果遊標,對全部分片的遊標依次輪詢取得數據.若是查詢經過 sort() 指明要排序, mongos 會將 $orderby 選項發送給全部分片,當 mongos 接收到結果以後,會先進行 合併排序 再返回給應用程序.若是查詢經過 limit() 限制了返回文檔的數量, mongos 會將這個限制發送到全部分片,而且在返回給應用程序以前再次使用這個限制對結果進行過濾.若是查詢經過 skip() 指定了要 跳過 的文檔數目, mongos 不能 將跳過的數目發送到分片,而必須先從分片接收到全部未經跳過的數據,再使用跳過的數量對結果進行檢索,不過,在聯合使用 limit() 與 skip() 進行查詢時,爲了更高效一些, mongos 會將 限制 與 *跳過*一塊兒發送給分片. 檢測鏈接的是否爲 mongos 爲了檢測應用鏈接的是否是 mongos,可使用 isMaster 命令.若是應用鏈接的是一個 mongos , isMaster 返回一個包含 isdbgrid 字符串的 msg ,好比:
若是應用鏈接的是 mongod ,返回的文檔中不包含 isdbgrid 字符串.less
通常來講,集羣中的操做分爲以下兩種: 向存儲集合的全部分片中廣播發送的操做. 基於片鍵,向集羣中單個或部分分片發送的操做. 爲了得到更好的性能,最好在任何可能的時候都使用具備特定目標的操做.雖然有些操做不得不使用廣播發送的形式,你也應該儘量在進行操做時帶有片鍵來儘量使用具備特定目標的操做.性能
mongos instances broadcast queries to all shards for the collection unless the mongos can determine which shard or subset of shards stores this data.ui
多文檔更新操做老是會被分發到全部分片.this
除非操做指定了完整的片鍵,不然 remove() 將老是廣播式操做.
全部的 insert() 都會分發到某一個分片上.
全部的單個 update() (包括 upsert 操做) 與 remove() 操做都會被髮往一個分片.
包含片鍵或部分片鍵的查詢, mongos 能夠將查詢分發到特定的一個分片或幾個分片上.
分片行爲是以集合爲基本單位的,你能夠在一個數據庫中對多個集合開啓分片,也能夠擁有多個打開分片的數據庫. [2] 不過,在生產環境中,會存在一些數據庫和集合開啓了分片,另外一些數據庫和集合沒有開啓分片的狀況.
無論 sharded cluster 中數據結構如何,應該一直使用 mongos 訪問集羣數據,即便對於未分片的數據也應當如此.
[2] | 在你配置分片的時候,應該使用 enableSharding 對數據庫開啓分片,才能在以後使用 shardCollection 爲某個集合開啓分片. |