Django mongoengine odm在replicaset上使用辅助实例

时间:2014-01-29 19:50:17

标签: django mongodb mongoengine replicaset

我有一个Django(有mongoengine)网站,可以在只读模式下工作,还有一个离线python应用程序,用于填充MongoDB(由Django读取)。面对一些锁定问题,我发现复制项是一种改进,因为我可以将辅助实例设置为网站数据库。

刚开始我刚刚更改了与辅助实例主机的连接,并收到错误:

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

我坚持这一步,寻找通过mongoengine和/或mongodb配置允许该操作的方法,但是找不到解决方案..任何想法?

提前致谢

1 个答案:

答案 0 :(得分: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

相关问题