0

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

起初我只是更改了与辅助实例主机的连接,并得到了错误:

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 配置进行该操作,但还没有找到解决方案.. 任何想法?

提前致谢

4

1 回答 1

3

正如您收到的错误所暗示的,您的问题似乎与您用于访问的用户帐户的权限设置有关。

从 2.4 开始的最新版本的 MongoDB 对用户角色http://docs.mongodb.org/manual/reference/user-privileges/有更精细的控制,这可能会影响您正在做的事情。特别是 Mongoengine 将具有在您正在实现的类上设置索引的逻辑,并且可能会尝试通过确保索引来部署它们。如果用户帐户没有此权限,这将是一个问题。

此外,您似乎正在为您的 MongoDB 实例使用服务提供商,并且他们可能已经针对帐户的批准角色设置了一些一般规定。这表明您在查询辅助节点时遇到了问题。

虽然您可以在解决权限问题后将连接设置为从辅助设备读取,但这可能不是您真正想要的。一般用例是您确定不获取最新数据是绝对可以的,因为辅助节点可能落后了。

可能您真正需要做的是查看导致锁定问题的原因。考虑到您使用 Mongoengine 的一个可能原因在这里,您可能需要查看背景索引构建。这也是一个很好的理由,为什么在您的提供商发布和安装下一个版本的 MongoDB 之前,从辅助数据库读取将是一个坏主意。http://docs.mongodb.org/manual/tutorial/build-indexes-on-replica-sets

于 2014-01-29T21:35:54.747 回答