MongoDB + Azure + Android: com.mongodb.WriteConcernException err: «не мастер» код: «10058»

Фон:

Привет! Я запускаю реплику MongoDB, установленную в Azure, и подключился к ней удаленно из приложения Android. Я получил чтение, чтобы работать отлично от всех экземпляров (Обновлено: потому что им разрешено читать на первичных и вторичных узлах). Но записи в базу данных по-прежнему имеют периодические ошибки со следующей ошибкой, поскольку записи должны выполняться только на первичном узле.

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

Вопрос:

Как предотвратить эту ошибку и разрешить запись 100% времени?

E/AndroidRuntime(): com.mongodb.WriteConcernException: {
        "serverUsed" : "/<my-remote-ip>:27017" , "err" : "not master" , 
        "code" : 10058 , "n" : 0 , "lastOp" : { "$ts" : 0 , "$inc" : 0} , 
        "connectionId" : 1918 , "ok" : 1.0}

Трассировки стека:

E/AndroidRuntime(13731): FATAL EXCEPTION: Thread-7629
E/AndroidRuntime(13731): Process: com.myapplication.examplemongodb, PID: 13731
E/AndroidRuntime(13731): com.mongodb.WriteConcernException: { "serverUsed" : "/<my-remote-ip>:27017" , "err" : "not master" , "code" : 10058 , "n" : 0 , "lastOp" : { "$ts" : 0 , "$inc" : 0} , "connectionId" : 1918 , "ok" : 1.0}
E/AndroidRuntime(13731):    at com.mongodb.CommandResult.getException(CommandResult.java:77)
E/AndroidRuntime(13731):    at com.mongodb.CommandResult.throwOnError(CommandResult.java:110)
E/AndroidRuntime(13731):    at com.mongodb.DBTCPConnector._checkWriteError(DBTCPConnector.java:102)
E/AndroidRuntime(13731):    at com.mongodb.DBTCPConnector.say(DBTCPConnector.java:142)
E/AndroidRuntime(13731):    at com.mongodb.DBTCPConnector.say(DBTCPConnector.java:115)
E/AndroidRuntime(13731):    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:248)
E/AndroidRuntime(13731):    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:204)
E/AndroidRuntime(13731):    at com.mongodb.DBCollection.insert(DBCollection.java:76)
E/AndroidRuntime(13731):    at com.mongodb.DBCollection.insert(DBCollection.java:60)
E/AndroidRuntime(13731):    at com.mongodb.DBCollection.insert(DBCollection.java:105)
E/AndroidRuntime(13731):    at com.myapplication.examplemongodb.ActivityMain$1.run(ActivityMain.java:83)
E/AndroidRuntime(13731):    at java.lang.Thread.run(Thread.java:841)

Примечания:

Я используюmongo-java-driver v2.11.3.Я использовалмонго-лазурная библиотека чтобы помочь создать набор реплик MongoDB с двумя рабочими ролями.(Если у вас есть еще ресурсы для этого, я бы с удовольствием их прочитал. Я уже читал readme для GitHub,это, этои несколько других вещей, не связанных с MongoDB / Azure. Но эти ресурсы не обновляются и не детализируются.)

Возможные решения:

Я думаю, что это связано с набором реплик.Я не уверен, что это происходит, потому что у меня есть только набор из двух экземпляров (один основной и один дополнительный), и они борются (читай: голосование) за то, кто хочет быть основным. Возможно, требуется арбитр? Но я не знаю, как это сделать в настоящее время.

Обновить:

Благодаря помощи @David Makogon я уверен, что проблема заключается в том, как я настроил соединение с Azure и как я получаю доступ к рабочим ролям. Итак, вот мои обновленные заметки о том, как настроена система:Две рабочие роли (MongoDB.WindowsAzure.MongoDBRole), к которым я подключаюсь напрямую черезTCP Input Endpoint порт 27017 из приложения для Android. Как сказал @David, в настоящее время я не могу контролировать, к какому экземпляру подключен.Одна веб-роль (MongoDB.WindowsAzure.Manager), с которой я ничего не делаю, имеет однуHTTP Input Endpoint на порту 80. Это было сделано по умолчанию с помощью библиотеки mongo-azure, о которой я упоминал выше. Я не уверен, что я должен что-то делать с этим.

Ответы на вопрос(1)

Ваш ответ на вопрос