Ошибки записи в MongoDB элемент набора основных / основных реплик из Java с использованием драйвера Mongo

У меня проблема с переносом приложения на более распределенную архитектуру. В частности, я недавно начал миграцию приложения в набор репликации MongoDB, где все участники общаются, используя локальную подсеть в виртуальном облаке. Набор replicaSet прекрасно работает при распространении данных, записанных из первичного уровня во вторичные. Существует два сервера приложений Java, которые в основном выполняют операции чтения, однако им также иногда необходимо выполнять операции записи. Каждый сервер, на котором размещены серверы приложений Java, также содержит свой собственный дополнительный экземпляр mongodb, работающий локально.

В частности, у меня есть проблема, касающаяся Java с использованием драйвера MongoDB, который упакован с Jongo. я использую MongoClientOptions.Builder() установить readPreference(ReadPreference.nearest()); который обычно должен читать с экземпляра mongodb, работающего на локальной машине, так как он будет иметь наименьшую задержку. Несмотря на это, операции чтения прекрасно работают на этих двух серверах Java, и rs.status() Команда возвращает исправную конфигурацию.

При попытке выполнить операцию записи происходит сбой, и моя ошибка показывает: {"timestamp":1427131553387,"status":500,"error":"Internal Server Error","exception":"com.mongodb.CommandFailureException","message":"{ \"serverUsed\" : \"localhost:27017\" , \"note\" : \"from execCommand\" , \"ok\" : 0.0 , \"errmsg\" : \"not master\"}", ...} Предполагается, что он пытается выполнить операцию записи на локальном экземпляре mongodb (вторичный член в replicaSet). Насколько я понимаю, при подключении к любому члену реплики MongoDB, что операции записи будут автоматически отправлены участнику, помеченному как Master/Primary?

Больше деталей:

MongoDB - это версия 2.6.7

Настройки взяты из простого файла YAML

application.yml

mapserver.mongo:
  database: "maps"
  port: 27017
  host: "localhost"

Затем в приложении создается экземпляр с вызовом:
return new MongoClient(new ServerAddress(this.getHost(), this.getPort()), this.getOptions());


Возможно, я упускаю что-то в настройке, что необходимо для драйвера Java MongoDB (и / или Jongo), чтобы определить членов в replicaSet и их роль, и направить операции записи на текущий мастер в наборе? Для пояснения, существует серверная часть NodeJS, которая является отдельным экземпляром сервера от любого из этих серверов Java/Seconday-MongoDB и отделена от экземпляра первичного MongoDB, однако она может правильно записывать данные в основной / основной без проблем, поэтому она не должна проблема брандмауэра. Любые идеи или помощь приветствуется.

0 ответов

Другие вопросы по тегам