2014-01-29 88 views
0

我有一個工作在只讀模式下的Django網站,以及一個用於填充MongoDB(由Django讀取)的離線python應用程序。面對一些鎖問題,我發現一個複製集會是一個改進,因爲我可以使輔助實例成爲網站數據庫。Django mongoengine odm在副本集上使用輔助實例

起初我只是改變了我的第二個實例主機連接,並得到了錯誤:

Request Method: GET 
Request URL: http://localhost:8000/awesomeApp/ 
Django Version: 1.5 
Exception Type: AutoReconnect 
Exception Value:  
not master 

在那之後,我試着註冊的連接來解決這個問題,但沒有成功,再後來升級到mongoengine 0.8.7,可與連接:

connect('awesomeApp', host='mongodb://rs63804-a0.mongoserviceprovider.com:27017,rs63804-a1.mongoserviceprovider.com:27017', replicaSet='rs63804', read_preference=ReadPreference.SECONDARY_PREFERRED, username='scott', password='tiger') 

但現在我得到兩個不同的錯誤消息,當我使用ReadPreference.PRIMARY_PREFERRED或ReadPreference.SECONDARY_PREFERRED ...

隨着PRIMARY_PREFERRED返回:

Request Method: GET 
Request URL: http://localhost:8000/awesomeapp/ 
Django Version: 1.5 
Exception Type: OperationFailure 
Exception Value:  
not authorized to create index on awesomeapp.django_session 

而且隨着SECONDARY_PREFERRED:

Request Method: GET 
Request URL: http://localhost:8000/awesomeapp/ 
Django Version: 1.5 
Exception Type: OperationFailure 
Exception Value:  
database error: not authorized for query on awesomeapp.django_session 

我stucked在此步驟中,尋找一種方式,以允許通過mongoengine和/或MongoDB的CONFIGS該操作,但還找不到解決方案..任何意識?

在此先感謝

回答

3

正如所建議的,你收到你的問題的錯誤似乎與您正在使用訪問的用戶帳戶設置的權限。

2.4以上的更新版本的MongoDB對用戶角色http://docs.mongodb.org/manual/reference/user-privileges/有更精確的控制,這可能會影響你正在做的事情。特別是Mongoengine將有邏輯在你正在實現的類上建立索引,並且可能試圖通過確保索引來部署它們。如果用戶帳戶沒有這個權限,這將是一個問題。

此外,您似乎正在爲您的MongoDB實例使用服務提供者,並且他們可能已經設置了一些關於該帳戶的批准角色的一般規定。這指出了您查詢輔助的問題。

雖然您可以設置連接以在解決權限問題後從輔助節點讀取,但這可能不是您想要的。一般的用例是,你確定沒有獲得最新數據是絕對沒問題的,因爲它可能是次要節點落後。

也許你真的需要做的是看看是什麼導致了鎖定問題。考慮到您對Mongoengine的使用,可能的原因是here,您可能需要查看背景索引編制。這也是一個很好的理由,直到MongoDB的下一個版本被你的提供者發佈和安裝爲止,爲什麼從輔助中讀取文件是一個壞主意。 http://docs.mongodb.org/manual/tutorial/build-indexes-on-replica-sets

相關問題