
文章插圖
| 總結(jié)/Edison Zhou
前面我們學(xué)習(xí)了在MongoDB中的寫操作事務(wù)管理,本篇我們開始進(jìn)入讀操作事務(wù) 。
1 讀數(shù)據(jù)關(guān)注的兩個(gè)問題
在通過mongodb讀取數(shù)據(jù)時(shí),我們一般需要關(guān)注兩個(gè)問題:
(1)從哪里讀取?
(2)什么樣的數(shù)據(jù)可以被讀取?
第一個(gè)問題,mongodb交給了 readPreference 來解決 。
第二個(gè)問題,mongodb交給了 readConcern 來解決 。
2 readPreference詳解
關(guān)于readPreference
readPreference 選項(xiàng)決定了mongodb會(huì)使用哪一個(gè)節(jié)點(diǎn)(primary or secondary)來滿足正在發(fā)起的讀請求 。

文章插圖
readPreference的可選值:
(1)primary:只選擇主節(jié)點(diǎn)
(2)primaryPreferred:優(yōu)先選擇主節(jié)點(diǎn),如果主節(jié)點(diǎn)不可用則選擇從節(jié)點(diǎn)
(3)secondary:只選擇從節(jié)點(diǎn)
(4)secondaryPreferred:優(yōu)先選擇從節(jié)點(diǎn),如果從節(jié)點(diǎn)不可用則選擇主節(jié)點(diǎn);
(5)nearest:選擇最近的節(jié)點(diǎn),無論是primary 還是 secondary 角色 。
readPreference適用場景
比如,在電商場景中,用戶下單后會(huì)立即跳轉(zhuǎn)到訂單詳情頁,這時(shí)候可以配置為 primary/primaryPreferred,因?yàn)檫@時(shí)候從節(jié)點(diǎn)可能還沒有獲得同步的新訂單數(shù)據(jù) 。
又如,用戶查詢自己的歷史訂單記錄,這時(shí)候可以配置為 secondary/secondaryPreferred,因?yàn)檫@時(shí)候用戶對(duì)歷史訂單的時(shí)效性沒有太高的要求;
再如,在Report場景中,由于報(bào)表對(duì)時(shí)效性的要求并不是太高,但資源需求較大,因此可以配置為secondary,在從節(jié)點(diǎn)單獨(dú)處理,避免對(duì)線上用戶造成影響 。
最后,在內(nèi)容管理場景中,將用戶上傳的圖片分發(fā)到全世界(比如多數(shù)據(jù)中心的場景),可以配置為nearest,讓各地用戶能夠就近讀取數(shù)據(jù) 。
readPreference應(yīng)用實(shí)踐
在MongoShell中:
// 在讀取students集合時(shí)采用secondary策略db.teams.find().readPref("secondary");在.NET應(yīng)用程序中:// 通過連接字符串設(shè)置全局默認(rèn)readPreference策略mongodb://mongo-master:27017,mongo-slave1:27017,mongo-slave2:27017/?replicaSet=testRs&readPreference=secondary// 在.NET代碼中通過Driver設(shè)置readPreference策略_contacts.WithReadPreference(ReadPreference.Secondary).Find(doc => true);擴(kuò)展:Tag在mongodb中,readPreference只能控制某一類節(jié)點(diǎn),而tag則可以將節(jié)點(diǎn)選擇控制到一個(gè)或多個(gè)節(jié)點(diǎn) 。在Kubernetes中,也有tag這個(gè)概念,可以將容器部署到指定tag的一個(gè)或多個(gè)node上 。
比如,一個(gè)5節(jié)點(diǎn)的復(fù)制,3個(gè)節(jié)點(diǎn)硬件較好專供服務(wù)線上客戶實(shí)時(shí)操作,2個(gè)節(jié)點(diǎn)硬件較低專供服務(wù)報(bào)表生成 。這時(shí),就可以給3個(gè)硬件較好的節(jié)點(diǎn)打tag:{purpose: "online"},給2個(gè)硬件較低的節(jié)點(diǎn)打tag:{purpose: "reporting"} 。最后,在線應(yīng)用在讀取數(shù)據(jù)時(shí)就可以指定tag是{purpose: "online"}的節(jié)點(diǎn)讀取,而報(bào)表應(yīng)用則指定tag是{purpose: "reporting"}的節(jié)點(diǎn)讀取 。
3 readConcern詳解
關(guān)于readConcern
readPreference 解決了從哪里讀數(shù)據(jù)的問題,而readConcern 則用來解決什么樣的數(shù)據(jù)可以被讀取 。
readConcern 類似于傳統(tǒng)關(guān)系型數(shù)據(jù)庫的隔離級(jí)別,它的可選項(xiàng)包括:
(1)available:讀取所有可用的數(shù)據(jù)
(2)local:讀取所有可用且屬于當(dāng)前分片的數(shù)據(jù)
(3)majority:讀取在大多數(shù)節(jié)點(diǎn)上提交完成的數(shù)據(jù)
(4)linearizable:可線性化讀取文檔
(5)snapshot:讀取最近快照中的數(shù)據(jù)
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時(shí)就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- mongodb是nosql數(shù)據(jù)庫嗎 9 NoSQL | MongoDB入門實(shí)戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 12 NoSQL | MongoDB入門實(shí)戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 13 NoSQL | MongoDB入門實(shí)戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 14 NoSQL | MongoDB入門實(shí)戰(zhàn)教程
- 做雙眼皮有幾種方法
- 最有激情的健身運(yùn)動(dòng)是什么
- 終端凈水,只為能飲用健康好水
- it翻譯 IT是什么意思?
- 阿西吧是什么意思 阿西吧為什么在韓國是罵人話 韓語罵人的話中文讀法
- 狗帶是什么意思什么梗 狗帶是go die的諧音
