MongDB翻譯:mongos

原文

mongos

查詢與寫入操作利用MongoDB的mongos實(shí)例在集群中進(jìn)行路由。從應(yīng)用程序的角度來看,mongos提供了訪問集群的唯一接口踪宠。應(yīng)用程序從不直接跟碎片連接或交互代咸。

mongos從config servers緩存元數(shù)據(jù)從而追蹤哪個(gè)數(shù)據(jù)在哪個(gè)碎片上译荞。mongos利用元數(shù)據(jù)將應(yīng)用程序和客戶端的操作路由到mongod實(shí)例上瞪醋。mongos沒有持續(xù)的狀態(tài)并且不怎么消耗系統(tǒng)資源。

練習(xí)過程中推薦將mongos實(shí)例跟你的應(yīng)用程序服務(wù)器部署在同一個(gè)系統(tǒng)上装诡,但你也可以在碎片或其他專用資源上維護(hù)mongos實(shí)例银受。

Routing And Results Process

mongos實(shí)例通過以下兩點(diǎn)在集群里路由查詢操作:

  1. 確定必須回應(yīng)查詢的碎片條目。
  2. 在所有目標(biāo)碎片上建立游標(biāo)鸦采。

然后mongos會把每一個(gè)目標(biāo)碎片的數(shù)據(jù)合并宾巍,且返回結(jié)果文檔。某些查詢修飾符(如sorting),會在mongos檢索結(jié)果之前的上一個(gè)碎片上進(jìn)行以上操作(跟primary shard一樣)渔伯。

MongoDB3.6以后對于在多碎片上進(jìn)行的聚合操作顶霞,如果不用在數(shù)據(jù)庫的primary shard進(jìn)行操作,這些操作會被返回到monogs進(jìn)行合并锣吼。

以下兩種管道無法運(yùn)行 mongos

第一種情況是管道的拆分合并部分包含必須運(yùn)行在主碎片上運(yùn)行的階段時(shí)选浑。例如,$lookup操作在一個(gè)未碎片化的集合上發(fā)出請求玄叠,而該集合和一個(gè)正在聚合的碎片化集合在同一個(gè)數(shù)據(jù)庫古徒,那么該階段就應(yīng)該運(yùn)行在primary shard上。

第二種情況是管道的拆分合并部分包含有可能將臨時(shí)數(shù)據(jù)寫入磁盤時(shí)读恃,例如$group操作符,并且客戶端指定了allowDiskUse:true隧膘,這種情況下,即使假設(shè)沒有其他需要在primary shard運(yùn)行的管道合并階段寺惫,但合并操作會在聚合操作的目標(biāo)碎片上隨機(jī)找一個(gè)進(jìn)行疹吃。

要獲得更多集群聚合查詢是如何分割組件的信息,將explain:true作為參數(shù)傳遞給 aggregation() 方法西雀。結(jié)果會包含三個(gè)json對象萨驶。

  • mergeType字段表示合并操作在哪個(gè)階段進(jìn)行(“primaryShard”, “anyShard”, or “mongos”).
  • splitPipeline字段表示管道內(nèi)的哪個(gè)操作必須運(yùn)行在私有碎片上。
  • shards字段表示每個(gè)碎片已經(jīng)完成的工作艇肴。

在某些情況下篡撵,當(dāng)shard key或者shard key的前綴是查詢的一部分,mongs會執(zhí)行 targeted operation豆挽,將查詢路由到集群的碎片的子集上育谬。

mongos將不包含shard key的查詢操作以廣播形式發(fā)送,路由到集群里的所有碎片上帮哈。取決集群內(nèi)數(shù)據(jù)的分布和查詢的選擇膛檀,一些不包含shard key的查詢或許依然會對廣播進(jìn)行回應(yīng)。

mongos如何處理查詢操作符

Sorting

如果查詢的結(jié)果沒有排序,mongos實(shí)例返回從所有的碎片游標(biāo)上打開"一系列"的結(jié)果游標(biāo)咖刃。

如果使用了游標(biāo)方法 sort()對查詢結(jié)果進(jìn)行了排序泳炉,mongos實(shí)例將 $orderby選項(xiàng)傳遞給碎片。數(shù)據(jù)庫的primary shard在通過mongos將數(shù)據(jù)返回給客戶端之前會對結(jié)果進(jìn)行接受和執(zhí)行合并排序嚎杨。

Limits

如果使用了游標(biāo)方法 limit()對結(jié)果的大小進(jìn)行了limits花鹅。那mongos實(shí)例在將數(shù)據(jù)返回給客戶端前該limit操作傳送給碎片然后再將該limit操作重新應(yīng)用在結(jié)果上。

Skips

如果使用了游標(biāo)方法 skip()跳過了一系列記錄枫浙,mongos不會將skip操作傳遞給碎片刨肃,而是檢索碎片內(nèi)沒有被跳過的記錄且當(dāng)收集結(jié)果的時(shí)候跳過文檔內(nèi)適當(dāng)?shù)臈l目。
當(dāng)使用 與 limit()方法同時(shí)使用時(shí)箩帚,mongos會將limit()加上skip()的結(jié)果傳遞給碎片以此來提升這些操作的效率真友。

確保mongos實(shí)例連接成功

要確保你的MongoDB實(shí)例已經(jīng)連接上mongos,使用isMaster命令紧帕。當(dāng)客戶端連接到 mongos盔然,isMaster會返回一個(gè)帶有isdbgrid字符串的msg字段。例如:

{
   "ismaster" : true,
   "msg" : "isdbgrid",
   "maxBsonObjectSize" : 16777216,
   "ok" : 1,
   ...
}

相反如果你的應(yīng)用是連接到mongod是嗜,那么返回的文檔不會有isdbgrid字符串愈案。

Query Isolation

通常,在碎片化環(huán)境下鹅搪。通過shard key和來自config server的集群元數(shù)據(jù)刻帚,mongos將查詢路由到單碎片的查詢效率是最高的。 targeted operations使用shard key的值來定位復(fù)合查詢條件的碎片或者碎片的子集涩嚣。

對于那些不包含shard key的查詢崇众,mongos必須對所有碎片進(jìn)行查詢,然后等待碎片的回應(yīng)再把結(jié)果返回給應(yīng)用程序航厚。這種"收/發(fā)"查詢或許需要更長時(shí)間才能運(yùn)行完畢顷歌。

Broadcast Operations

除非mongos可以直接確定哪個(gè)碎片或者碎片的子集持有查詢的數(shù)據(jù),否則mongos實(shí)例將直接將查詢操作廣播到所有碎片上幔睬。
[圖片上傳失敗...(image-e37c94-1520269344158)]

當(dāng)mongos收到所有碎片的回應(yīng)后眯漩,會將數(shù)據(jù)合并并且返回結(jié)果文檔。集群內(nèi)的負(fù)載決定了廣播的效率麻顶,例如網(wǎng)絡(luò)延遲赦抖,單個(gè)碎片的負(fù)載,和每個(gè)碎片要返回的文檔數(shù)量辅肾,都能影響廣播的性能队萤。

更新多個(gè)文檔的指令都只進(jìn)行廣播。
updateMany()deleteMany()都只能進(jìn)行廣播操作矫钓,除非查詢條件全額指定為shard key要尔。

Targeted Operations

mongos可以將帶有shard key或者shard key作為聚合前綴的查詢路由到碎片或者碎片集上舍杜。mongs利用shard key值來定位到包含shard key的范圍的chunk上并且直接將該查詢執(zhí)行在該chunk的碎片中。
[圖片上傳失敗...(image-38535d-1520269344158)]

例如赵辕,如果shard key是:

{ a: 1, b: 1, c: 1 }

mongos可以將包含全部shard key值或者shard key前綴的查詢路由到指定碎片或者包含數(shù)據(jù)的多個(gè)碎片上:

{ a: 1 }
{ a: 1, b: 1 }

任何 insertOne()操作都只命中一個(gè)碎片既绩。insertMany()里的每個(gè)文檔都只命中單個(gè)碎片,但不保證所有文檔都被插入到同一個(gè)碎片上还惠。

所有 updateOne(), replaceOne() and deleteOne()操作都必須包含shard key或者_id作為查詢條件饲握。否則MongoDB會直接報(bào)錯(cuò)。

根據(jù)集群里數(shù)據(jù)的分布和查詢的選擇蚕键,mongos可能依然會對查詢進(jìn)行廣播救欧。

Index Use

如果查詢條件文檔不包含shard key,mongos必然會將該查詢以廣播形式發(fā)送到集群里的所有碎片上嚎幸。反過來,使用shard key索引或者其他更高效的索引來進(jìn)行查詢寄猩。

如果查詢包含多個(gè)引用了shard key和輔助索引字段的子表達(dá)式嫉晶,mongos會把該查詢路由到指定的碎片上并且該索引會令碎片更高效的完成工作。

Sharded Cluster Security

使用 Internal Authentication來確保集群的內(nèi)部安全和避免未授權(quán)用戶訪問集群田篇。為確保集群內(nèi)部安全替废,你必須為每一個(gè)mongos和mongod實(shí)例配置適當(dāng)?shù)陌踩栽O(shè)置。

集群用戶

分片集群支持使用 Role-Based Access Control (RBAC)來限制未授權(quán)用戶訪問和操作集群內(nèi)的數(shù)據(jù)泊柬。要開啟(RBAC)椎镣,你必須在啟動mongod實(shí)例時(shí)指定--auth選項(xiàng)(包括config servers在內(nèi))。另外兽赁,為集群內(nèi)部開啟了 Internal Authentication状答,MongoDB會自動為你打開RBAC。
如果指定了RBAC刀崖,客戶端在連接mongos來操作集群的時(shí)候惊科,要指定--username,--password和--authenticationDatabase選項(xiàng)。

每個(gè)集群的用戶是相互獨(dú)立的亮钦,并且這些用戶都不能訪問集群內(nèi)的單個(gè)碎片馆截。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜂莉,隨后出現(xiàn)的幾起案子蜡娶,更是在濱河造成了極大的恐慌,老刑警劉巖映穗,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窖张,死亡現(xiàn)場離奇詭異,居然都是意外死亡蚁滋,警方通過查閱死者的電腦和手機(jī)荤堪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門合陵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人澄阳,你說我怎么就攤上這事拥知。” “怎么了碎赢?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵低剔,是天一觀的道長。 經(jīng)常有香客問我肮塞,道長襟齿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任枕赵,我火速辦了婚禮猜欺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拷窜。我一直安慰自己开皿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布篮昧。 她就那樣靜靜地躺著赋荆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪懊昨。 梳的紋絲不亂的頭發(fā)上窄潭,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音酵颁,去河邊找鬼嫉你。 笑死,一個(gè)胖子當(dāng)著我的面吹牛躏惋,可吹牛的內(nèi)容都是我干的均抽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼其掂,長吁一口氣:“原來是場噩夢啊……” “哼油挥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起款熬,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤深寥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后贤牛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惋鹅,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年殉簸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闰集。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沽讹。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖武鲁,靈堂內(nèi)的尸體忽然破棺而出爽雄,到底是詐尸還是另有隱情,我是刑警寧澤沐鼠,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布挚瘟,位于F島的核電站,受9級特大地震影響饲梭,放射性物質(zhì)發(fā)生泄漏乘盖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一憔涉、第九天 我趴在偏房一處隱蔽的房頂上張望订框。 院中可真熱鬧,春花似錦兜叨、人聲如沸穿扳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纵揍。三九已至顿乒,卻和暖如春议街,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背璧榄。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工特漩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骨杂。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓涂身,卻偏偏與公主長得像,于是被迫代替她去往敵國和親搓蚪。 傳聞我的和親對象是個(gè)殘疾皇子蛤售,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容