MongoDB + Azure + Android: com.mongodb.WriteConcernException err: „nie master” kod: „10058”

tło:

Cześć, używam repliki MongoDB ustawionej na platformie Azure i zdalnie łączyłem się z nią z poziomu aplikacji na Androida. Otrzymałem odczyty, które działają świetnie ze wszystkich instancji (zaktualizowane: ponieważ mogą czytać na węzłach podstawowym i pomocniczym). Jednak zapisy do bazy danych wciąż mają sporadyczne błędy z następującym błędem, ponieważ zapisy muszą być wykonywane tylko w węźle podstawowym.

Ponadto, jeśli mógłbyś podać jakieś bardziej konkretne zasoby do radzenia sobie z tym problemem, to również byłoby bardzo pomocne. Przeszedłem już przez większość dokumentów i przeszukałem trochę tego błędu.

Pytanie:

Jak zapobiec temu błędowi i zezwolić na zapis w 100% przypadków?

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}

Ślad stosu:

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)

Uwagi:

ja używammongo-java-driver v2.11.3.Użyłembiblioteka mongo-azure aby pomóc w utworzeniu repliki MongoDB z dwiema rolami roboczymi.(Jeśli masz więcej zasobów, to chciałbym to przeczytać. Już przeczytałem readme GitHub,to, toi kilka innych rzeczy niezwiązanych z MongoDB / Azure. Ale te zasoby nie są aktualizowane ani szczegółowe.)

Możliwe rozwiązania:

Myślę, że ma coś wspólnego z posiadaniem zestawu replik.Nie jestem pewien, czy to się dzieje, ponieważ mam tylko zestaw dwóch replik (jeden podstawowy i jeden zapasowy) i walczą (czytaj: głosowanie) o to, kto chce być podstawowym. Może potrzebny jest arbiter? Ale obecnie nie wiem, jak to zrobić.

Aktualizacja:

Dzięki pomocy @David Makogon jestem pewien, że problem leży w tym, jak skonfigurowałem połączenie z Azure i jak uzyskuję dostęp do ról roboczych. Oto moje zaktualizowane uwagi dotyczące konfiguracji systemu:Dwie role robotnicze (MongoDB.WindowsAzure.MongoDBRole), z którymi łączę się bezpośrednio z viaTCP Input Endpoint port 27017 z aplikacji na Androida. Jak powiedział @David, obecnie nie mam kontroli nad tym, do której instancji jest podłączony.Jedna rola internetowa (MongoDB.WindowsAzure.Manager), z którą nic nie robię, ma jednąHTTP Input Endpoint na porcie 80. Zostało to wykonane domyślnie z biblioteką mongo-azure, o której wspomniałem powyżej. Nie jestem pewien, czy powinienem coś z tym zrobić.

questionAnswers(1)

yourAnswerToTheQuestion