Ако всички екземпляри седят зад единичен Input
с балансиран товар крайна точка (напр. 27017), тогава всеки път, когато вашата клиентска машина се свърже с крайната точка, тя ще бъде свързана с потенциално различни възли в клъстера на репликасет (и няма да имате контрол върху това към кой екземпляр сте отишли). Това може да обясни защо понякога се опитвате да пишете на не-главния и получавате грешка, но всичките ви четения работят (тъй като вероятно сте настроили MongoDB клъстера да позволява четения на вторични възли).
Работническите роли също поддържат InstanceInput
крайни точки, които ви позволяват да зададете обхват на външни портове (да речем, 27017-27019), съпоставяне към един порт на самите работни инстанции (напр. 27017). Ако направите това, вашето клиентско приложение вече може да се свърже директно с трите инстанции (27017, 27018, 27019). Много драйвери поддържат връзки с replicaset, така че ще могат да разберат кой възел е главният, насочвайки всички записи към него. Не знам дали драйверът, който използвате на Android, поддържа репликати. Ако драйверът не поддържа replicasets, вероятно ще искате да обмислите поставянето на API ниво, което след това извършва цялата комуникация с базата данни (добра практика, която трябва да следвате като цяло, и можете да погледнете мобилните услуги на Azure за бърз начин за прилагане на това).
И така... ако крайната точка на клъстера на вашия replicaset е конфигурирана като Input
, това вероятно обяснява проблема, който виждате, който трябва да бъде разрешим чрез превключване на типа крайна точка на InstanceInput
.