0

私は、読み取り専用モードで動作する Django (mongoengine を使用) Web サイトと、その MongoDB (Django によって読み取られる) にデータを入力するオフライン python アプリを持っています。いくつかのロックの問題に直面して、セカンダリ インスタンスを Web サイト DB にできるので、レプリカセットが改善されることを発見しました。

最初に、セカンダリ インスタンス ホストへの接続を変更したところ、次のエラーが発生しました。

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 を使用すると、2 つの異なるエラー メッセージが表示されるようになりました...

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 に答える