2015-07-12 15 views
8

Zaimplementowałem zestaw replik, którego używam na całym świecie. Mam swojego mistrza w Oregon, USA i 4 Secondary. Kalifornia i Wirginia, Frankfurt i Sydney. Mam również serwery internetowe w tych samych regionach. Te serwery internetowe podłączenie do Mongo użyciu mongoose:Mongoose nie czyta z dodatkowej bazy Mongo

var mongoose = require("mongoose"); 
var dbUrl = "mongodb://***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017/exampleDb"; 
var dbOptions : { 
    "replSet": { 
     "rs_name": "exampleRepSet", 
     "readPreference": "ReadPreference.SECONDARY_PREFERRED", 
     "read_preference": "ReadPreference.SECONDARY_PREFERRED", 
     "w":0, 
     "slaveOk": true 
    } 
} 
mongoose.connect(dbUrl, dbOptions); 

Moim problemem jest to, że mój klient mają większą latencję do bazy danych w zależności od tego, jak daleko są od mistrza. Kalifornia ma 40 ms, a Sydney 400 ms. Nie rozumiem, dlaczego tak się dzieje, ponieważ powinni oni czytać wtórną bazę danych w swoim regionie.

Rozumiem, że pisanie musi być zrobione pierwszemu, ale nawet jeśli wykonuję wyszukiwanie, to czy nie powinno to być zrobione na regionalnej drugorzędnej drukarce i szybko wrócić?

Zdaję sobie sprawę, że istnieje kilka zbędnych opcji w tej konfiguracji, ale jestem rozpaczliwy. Próbowałem też opcji "ReadPreference.NEAREST" bezskutecznie.

+0

Która wersja mangusta są uruchomione? – ThrowsException

Odpowiedz

3

Spróbuj użyć następujących opcji:

var mongoose = require("mongoose"); 
var dbUrl = "mongodb://***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017,***.***.***.***:27017/exampleDb"; 

mongoose.connect(dbUrl, { 
    server: { 
     readPreference: "nearest", 
     strategy: "ping" 
    }, 
    replset: { 
     rs_name: "exampleRepSet", 
     readPreference: "nearest", 
     strategy: "ping" 
    } 
}); 

Podczas dokumentacji określa ping jako domyślnej strategii, wydaje się, że mandaty Mongoose Określ jeden podczas korzystania readPreference.

Należy również pamiętać, że secondaryPreferred to nie to samo co nearest. secondaryPreferred preferuje odczyty elementów podrzędnych (zgodnie z nazwą) niezależnie od opóźnień sieci, w przypadku których priorytety są określane jako nearest dla elementu o najniższym opóźnieniu sieci.

Po wprowadzeniu błędnej konfiguracji w zestawie replik, upewnij się, że podstawowy jest w trybie online i osiągalny - domyślnie Mongoose nie będzie używać wtyczki pomocniczej, jeśli podstawowy jest w trybie offline.

+0

Czy to tylko ja lub są opcje mangusty trochę niechlujny? –

+1

@JoshElias Tak, z pewnością się z tobą zgadzam. Najgorsze jest to, że duża część ich dokumentacji jest okropna, jeśli chodzi o opisywanie opcji i dostarczanie przykładów. – jduncanator

+0

Tak, ich dokumentacja jest okropna, a ich przykłady są bardzo ograniczone. Jednym z powodów, dla których się od nich oddalam. –

3

Edit

Spróbuj ustawić preferencje przeczytać na sam ciąg połączenia z mongodb://connection/db/?readPreference=secondary a nie w dbOptions. Nie mogę znaleźć niczego w węźle-mongodb-native, który mówi, że preferencję odczytu można dodać do konfiguracji zestawu replik. http://mongodb.github.io/node-mongodb-native/2.0/api/ReplSet.html

Old Odpowiedź

Być może trzeba zmienić ustawienie na najbliższy, a nie wtórne korzystne. http://docs.mongodb.org/manual/reference/read-preference/#nearest

+0

Wierzę, że opcja SECONDARY_PREFERRED będzie działać tak samo jak NEAREST, z wyjątkiem tego, że woli odczytać wtórny. http://docs.mongodb.org/manual/core/read-preference-mechanics/#replica-set-read-preference-behavior-nearest –

+0

twarde kodowanie, że opcja w adresie URL mongodb rzeczywiście działałaby, ale to nie jest mangusta rozwiązanie miałem nadzieję na –

0
dbOptions.db = { 
    readPreference: "secondaryPreferred", 
}; 

ten pracował dla mnie