實現MongoDB讀寫分離的“讀偏好”介紹


在某些情況下,將讀請求發送給副本集的備份節點是合理的,例如,單個服務器無法處理應用的讀壓力,就可以把查詢請求路由到可復制集中的多台服務器上。現在絕大部分MongoDB驅動支持讀偏好設置(read preference;或翻譯為讀取首選項),用來告訴驅動從特定的節點讀取數據。

1  讀偏好選項

primary — 這是默認的設置,表明只從可復制集的主節點讀取數據,因此具有強一致性。如果可復制集有問題,並且沒有可選舉的從節點,就表示出現錯誤。

premaryPreferred — 設置了此參數的驅動會從主節點讀取數據,除非某些原因使主節點不可用或者沒有主節點,此時它會從從節點讀取數據。此種設置下,讀請求無法保證一致性。

secondary — 這個設置告訴驅動應該一直從從節點讀取數據。這種設置對於我們想確保讀請求不會影響主節點的寫入請求時非常有用。如果沒有可用的從節點,讀請求會拋出異常。

secondarypreferred—讀請求會發出到從節點,除非沒有從節點可用,此時才會從主節點讀取。

nearest –驅動會嘗試從最近的可復制集成員節點讀取讀取數據,通過網絡延遲判斷。可以是主節點也可以是從節點。因此讀請求只會發送給驅動認為最快通信的節點。

primary是唯一一個可以確保讀一致的模式。因為寫請求首先在主節點完成,從服務器的更新會有些延遲,所以可能在從節點無法找到剛剛在主節點寫入的文檔數據。

匯總以上知識,各偏好設置下讀取數據請求所發往的節點如下所示:

2  最大過期時間

MongoDB 3.4及更新的版本新增了maxStalenessSeconds設置。

副本集的從節點可能因為網絡阻塞、磁盤吞吐低、長時間執行操作等,導致其落后於主節點。讀設置maxStalenessSeconds選項讓你對從節點讀取定義了最大落后或“過期”時間。當從節點估計過期時間超過了maxStalenessSeconds,客戶端會停止使用它進行讀操作。

最大過期和primary模式不匹配,只有選擇從節點成員讀取操作才能應用。

當選擇了使用maxStalenessSeconds進行讀操作的服務端,客戶端會通過比較從節點和主節點的最后一次寫時間來估計從節點的過期程度。客戶端會把連接指向估計落后小於等於maxStalenessSeconds的從節點。如果沒有主節點,客戶端使用從節點間的最近一次寫操作來比較。

默認是沒有最大過期時間並且客戶端也不會在指向讀操作時考慮從節點的落后。

必須定義maxStalenessSeconds的值大於等於90秒:定義一個更小的值會拋出異常。客戶端通過定期檢查每個副本集成員最后一次寫時間來估計副本集過期程度。因為檢查不頻繁,所以估計是粗略的。因此,客戶端不能強制maxStalenessSecconds小於90秒。

3  連接字符串格式

副本集連接字符串格式

mongodb://username:password@host1:port1,host2:port2[,...,hostN:portN]/database?options

options是連接配置中的可選項,replicaSet、readPreference、maxStalenessSeconds是其中的一個子項。

下面我們舉一個例子來說明字符串是怎么配置的,測試環境的副本集信息如下:

 

副本集名稱

節點角色

節點IP

端口

Reptest

主服務器

172.171.X.XX1

27017

副本節點

172.171.X.XX2

27017

仲裁節點

172.171.X.XX3

27017

 

 

 

 

 

 

 

 

 

 

賬號信息如下:

 

Username

Password

DBName

mongousertest

testuserpwd

mongotestdb

 

 

 

 

如果希望程序讀請求路由到從節點secondary,100秒為節點數據失效時間,此時C#程序中connectionStr的字符串可以設置如下:

stringconnectionStr = "mongodb://mongousertest:testuserpwd@172.171.x.xx1:27017,172.171.x.xx2:27017/mongotestdb?replicaSet=reptest&readPreference=secondary&maxStalenessSeconds=100";

 

 本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM