Eval is Devil-MongoDB master/slave上運行Eval遇到的問題

隨便寫一句,以避免有跟我同樣的人遇到這個問題。ast

驅動版本:MongoDB C# Driver 1.7.0集羣

當在Master/Slave集羣上使用Eval的時候,Eval操做只會在Master結點上運行,不管你設置的readPreference是secondaryPreferred仍是secondary。理由很簡單,Eval中的JS並非在客戶端(即驅動中)解釋執行,而是在MongoDB中。因此當驅動收到一條Eval命令的時候並不知道具體是要幹什麼,因此沒法判斷應該把這個請求發給master仍是slave去執行。爲了保證執行順利,驅動老是把這樣的命令發給Master執行。這點我我的認爲值得商榷。至少應該給我個機會指定使用Master仍是Slave,不然全部Eval都會跑到Master上,增長了Master的壓力,違背了作Master/Slave的初衷。配置

明白這點之後,若是在程序中發現"not master"的錯誤,就不會沒法理解了。這是由於Eval發送到了Master上,而Master由於壓力過大沒法接受新的請求致使不能接受請求,所以請求可能被轉發到Slave節點上,致使報了Not Master錯誤(一說是Master正在進行角色轉換變成Slave,不過據我觀察應該我說的緣由可能性比較大)。這裏極有多是驅動的Bug,但還未確認。由於既然會把請求轉到Slave節點上,那readPreference=secondary/secondaryPreferred配置就應該起做用。請求

相關文章
相關標籤/搜索