MongoDB + Azure + Android: com.mongodb.WriteConcernException-Fehler: "Nicht Master" -Code: "10058"

Hintergrund:

Hallo, ich verwende ein MongoDB-Replikatset auf Azure und habe über eine Android-App eine Remoteverbindung hergestellt. Ich habe Lesevorgänge von allen Instanzen erhalten, um großartig zu funktionieren (Aktualisiert: Weil sie auf primären und sekundären Knoten lesen dürfen). Schreibvorgänge in die Datenbank weisen jedoch immer noch zeitweise Fehler mit dem folgenden Fehler auf, da Schreibvorgänge nur auf dem Primärknoten ausgeführt werden müssen.

Wenn Sie spezifischere Ressourcen zur Behebung dieses Problems bereitstellen könnten, wäre dies ebenfalls sehr hilfreich. Ich habe die meisten Dokumente bereits durchgesehen und ziemlich viel nach diesem Fehler gesucht.

Frage:

Wie vermeide ich diesen Fehler und erlaube 100% der Zeit das Schreiben?

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}

Stack-Trace:

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)

Anmerkungen:

ich benutzemongo-java-driver v2.11.3.Ich habe das benutztMongo-Azure-Bibliothek um das MongoDB-Replikatset mit zwei Worker-Rollen zu erstellen.(Wenn Sie mehr Ressourcen dafür haben, würde ich es gerne lesen. Ich habe bereits die GitHub-Readme-Datei gelesen,diese, dieseund ein paar andere Dinge, die nicht mit MongoDB / Azure zu tun haben. Diese Ressourcen werden jedoch weder aktualisiert noch detailliert.)

Mögliche Lösungen:

Hat was mit einem Replikatset zu tun, denke ich.Ich bin mir nicht sicher, ob dies geschieht, da ich nur eine Replikatgruppe mit zwei Instanzen (eine primäre und eine sekundäre) habe und sie sich streiten (sprich: abstimmen), wer die primäre Instanz sein möchte. Vielleicht ist ein Schiedsrichter erforderlich? Aber ich weiß momentan nicht, wie das geht.

Aktualisieren:

Dank der Hilfe von @David Makogon bin ich mir ziemlich sicher, dass das Problem darin besteht, wie ich die Verbindung zu Azure eingerichtet habe und wie ich auf die Worker-Rollen zugreife. Hier sind meine aktualisierten Hinweise zur Konfiguration des Systems:Zwei Worker-Rollen (MongoDB.WindowsAzure.MongoDBRole), mit denen ich mich direkt über verbindeTCP Input Endpoint port 27017 aus der Android App. Wie @David sagte, habe ich derzeit keine Kontrolle darüber, mit welcher Instanz verbunden ist.Eine Webrolle (MongoDB.WindowsAzure.Manager), mit der ich nichts mache, hat eineHTTP Input Endpoint auf Port 80. Dies wurde nur mit der Mongo-Azure-Bibliothek gemacht, die ich oben erwähnt habe. Ich bin mir nicht sicher, ob ich irgendetwas damit anfangen soll.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage