Django mongoengine odm с использованием вторичного экземпляра в наборе реплик

У меня есть веб-сайт 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, но пока не нашел решения. Любые идеи?

заранее спасибо


person André Teixeira    schedule 29.01.2014    source источник


Ответы (1)


Судя по ошибкам, которые вы получаете, ваша проблема связана с разрешениями, установленными для учетной записи пользователя, которую вы используете для доступа.

Более поздние версии MongoDB, начиная с версии 2.4 и выше, имеют более детальный контроль над ролями пользователей http://docs.mongodb.org/manual/reference/user-привилегии/, которые могут повлиять на то, что вы делаете. В частности, Mongoengine будет иметь логику для настройки индексов для классов, которые вы реализуете, и, вероятно, попытается развернуть их с помощью обеспечения индекса. Это было бы проблемой, если бы учетная запись пользователя не имела этой привилегии.

Также похоже, что вы используете поставщика услуг для своих экземпляров MongoDB, и они, вероятно, установили некоторые общие положения относительно утвержденных ролей учетной записи. Это указывает на вашу проблему с запросом вторичного.

Хотя вы можете настроить подключение для чтения с вторичного сервера после того, как разрешите проблемы с разрешениями, это, вероятно, не совсем то, что вам нужно. Общий вариант использования заключается в том, что вы уверены, что абсолютно нормально не получать последние данные, поскольку, вероятно, вторичные узлы отстают.

Вероятно, вам действительно нужно выяснить, что вызывает проблемы с блокировкой. Учитывая, что вы используете Mongoengine, вероятной причиной является здесь и вам, возможно, придется взглянуть на фоновое построение индекса. Кроме того, это очень веская причина, по которой чтение из вторичного хранилища было бы плохой идеей, пока следующая версия MongoDB не будет выпущена и установлена ​​вашим провайдером. http://docs.mongodb.org/manual/tutorial/build-indexes-on-replica-sets/

person Neil Lunn    schedule 29.01.2014