Проблема чтения в MongoDB асинхронной репликации - PullRequest
1 голос
/ 01 июля 2011

Я новичок в MongoDB.Я создал приложение Java, используя MongoDB в качестве базы данных.Я настроил 3 сервера в наборе реплик.мой псевдокод: {

createUser getUser updateUser

}

Здесь createUser успешно создает пользователя, но getUser не может вернуть этого пользователя в некоторых случаях.

, когдаЯ проанализировал это из-за задержки репликации данных.

Как я могу преодолеть эту проблему?

В любом случае можно реплицировать данные сразу после их создания?

есть лилюбой другой способ получить пользователя в обязательном порядке?

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

Ответы [ 3 ]

0 голосов
/ 24 августа 2012

Свойство slaveOk теперь известно как ReadPreference (в данном случае .SECONDARY) в более новых версиях драйвера Mongo Java. Это можно установить на уровне Mongo / DB / Collection. Обратите внимание, что когда вы устанавливаете ReadPreference на этих уровнях, он применяется ко всем вызывающим абонентам (то есть эти объекты совместно используются потоками).

Другой подход состоит в том, чтобы попробовать ReadPreference.SECONDARY, и если это не удастся, попробуйте без него и перейдите к мастеру. Эта логика может быть изолирована от вашего уровня репозитория, поэтому сервисный уровень не должен иметь с ней дело. Если вы делаете это, вы можете установить ReadPreference для объекта DBQuery, который предназначен для каждого отдельного использования.

0 голосов
/ 03 марта 2013

Я не знаком с драйвером Java, но есть опции w и j .

Опция w подтверждает, что операции записиреплицировали на указанное количество членов набора реплик, включая основной.

j подтвердит операцию записи только после записи операции в журнал.

Похоже, вам нужно использовать WriteConcern .

0 голосов
/ 13 июня 2012

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

MongoDB getLastError

Вы читаете с slaveOk=True?Если вы читаете из Prilic ReplicaSet, это тоже не должно быть проблемой.

...