2015-07-12 18 views
8

Ho implementato un set di repliche che sto utilizzando globalmente. Ho il mio maestro in Oregon, Stati Uniti e 4 secondari. California e Virginia, Francoforte e Sydney. Ho anche dei server web nelle stesse regioni. Quei server web si collegano a mongo utilizzando mangusta:Mangusta che non legge dal database secondario di 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); 

mio problema è che il mio cliente ha una latenza più elevata al database a seconda di quanto lontano sono da padrone. La California ottiene 40ms mentre Sydney ottiene 400ms. Non capisco perché questo sta accadendo dal momento che dovrebbero leggere il database secondario nella loro regione.

Comprendo che le operazioni di scrittura devono essere eseguite sul primario ma anche se eseguo un rilevamento, non dovrebbe essere eseguito sul secondario regionale e restituire piuttosto rapidamente?

Mi rendo conto che ci sono alcune opzioni ridondanti in quella configurazione ma sto diventando disperata. Ho anche provato l'opzione "ReadPreference.NEAREST" inutilmente.

+0

Quale versione di mangusta utilizzi? – ThrowsException

risposta

3

Provare a utilizzare le seguenti opzioni:

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" 
    } 
}); 

Mentre la documentazione specifica ping come la strategia predefinita, sembra mandati Mongoose che si specificano uno quando si utilizza readPreference.

Si noti inoltre che secondaryPreferred non è la stessa cosa di nearest. secondaryPreferred preferisce le letture dei membri secondari (come suggerisce il nome) indipendentemente dalla latenza di rete, dove nearest dà la priorità alle letture al membro con la minore quantità di latenza di rete.

In mancanza di una configurazione errata nel set di repliche, assicurarsi che il primario sia online e raggiungibile: per impostazione predefinita, Mongoose rifiuterà di utilizzare un secondario se il primario non è in linea.

+0

Sono solo io o le opzioni di Mangusta sono un po 'confuse? –

+1

@JoshElias Sì, certamente sono d'accordo con te lì. Ciò che rende la cosa peggiore è che gran parte della loro documentazione è orribile quando si tratta di descrivere le opzioni e fornire esempi. – jduncanator

+0

Sì, la loro documentazione è orribile e sono molto limitati negli esempi forniti. Una ragione per cui mi sto allontanando da loro. –

3

Modifica

provare a impostare la preferenza di lettura sulla stringa di connessione se stesso con mongodb://connection/db/?readPreference=secondary e non nelle dbOptions. Non riesco a trovare nulla nel nodo-mongodb-nativo che dice che una preferenza di lettura può essere aggiunta alla configurazione replset. http://mongodb.github.io/node-mongodb-native/2.0/api/ReplSet.html

Vecchio risposta

Potrebbe essere necessario impostare l'impostazione più vicina e non secondario preferito. http://docs.mongodb.org/manual/reference/read-preference/#nearest

+0

Credo che l'opzione SECONDARY_PREFERRED agirà come NEAREST con l'eccezione che preferirà leggere una secondaria. http://docs.mongodb.org/manual/core/read-preference-mechanics/#replica-set-read-preference-behavior-nearest –

+0

hard coding questa opzione nella connessione mongodb url funzionerebbe davvero ma non è la mangusta soluzione speravo di –

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

Questo ha funzionato per me