2015-07-12 7 views
8

Ich habe ein Replikat-Set implementiert, das ich global verwende. Ich habe meinen Master in Oregon, USA und 4 Secondaries. Kalifornien und Virginia, Frankfurt und Sydney. Ich habe auch Webserver in diesen Regionen. Diese Web-Server eine Verbindung Mongo Mungo mit:Mongoose nicht lesen von Mongo sekundären Datenbank

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

Mein Problem ist, dass meine Kunden haben höhere Latenz in die Datenbank je nachdem, wie weit entfernt sie vom Master sind. Kalifornien bekommt 40ms, während Sydney 400ms bekommt. Ich verstehe nicht, warum das passiert, da sie die Sekundärdatenbank in ihrer Region ablesen sollten.

Ich verstehe, dass geschrieben werden muss, um die primäre, aber selbst wenn ich einen Fund dann sollte es nicht auf der regionalen sekundären getan werden und Rückkehr ziemlich schnell?

Ich weiß, es gibt einige redundante Optionen in dieser Konfiguration, aber ich bin verzweifelt. Ich habe auch die Option "ReadPreference.NEAREST" vergeblich versucht.

+0

Welche Version von Mungo sind Sie? – ThrowsException

Antwort

3

versuchen Sie die folgenden Optionen:

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

Während die Dokumentation gibt ping als Standardstrategie, so scheint es Mongoose schreibt vor, dass Sie eine angeben, wenn Sie readPreference verwenden.

Beachten Sie auch, dass secondaryPreferred nicht dasselbe ist wie nearest. secondaryPreferred bevorzugt liest von sekundären Mitgliedern (wie der Name schon sagt) unabhängig von Netzwerk-Latenz, wo nearest priorisiert liest an das Mitglied mit der niedrigsten Menge an Netzwerk-Latenz.

Kurz vor einer Fehlkonfiguration in Ihrer Replikat-Gruppe, stellen Sie sicher, dass Ihre primäre online und erreichbar ist - standardmäßig Mongoose wird eine sekundäre verwenden, wenn die primäre offline ist.

+0

Ist es nur ich oder sind die Mungo-Optionen ein bisschen chaotisch? –

+1

@JoshElias Ja, sicherlich stimme ich Ihnen da zu. Am schlimmsten ist, dass ein großer Teil der Dokumentation schrecklich ist, wenn es um die Beschreibung von Optionen und die Bereitstellung von Beispielen geht. – jduncanator

+0

Ja ihre Dokumentation ist schrecklich und sie sind sehr begrenzt in den Beispielen, die sie zur Verfügung stellen. Ein Grund, warum ich mich von ihnen entferne. –

3

bearbeiten

Versuchen Sie, die Lese Präferenz auf der Verbindungszeichenfolge selbst mit mongodb://connection/db/?readPreference=secondary und nicht in den dbOptions Einstellung. Ich kann nichts in der node-mongodb-native finden, die besagt, dass eine Lesevoreinstellung zur replset-Konfiguration hinzugefügt werden kann. http://mongodb.github.io/node-mongodb-native/2.0/api/ReplSet.html

Alte Antwort

Unter Umständen müssen Sie die Einstellung auf nächste und nicht sekundär bevorzugt. http://docs.mongodb.org/manual/reference/read-preference/#nearest

+0

Ich glaube, die SECONDARY_PREFERRED-Option wird die gleiche wie NEAREST mit der Ausnahme, dass es lieber von einem sekundären lesen wird. http://docs.mongodb.org/manual/core/read-reference-mechanics/#replica-set-read-preference-behavior-nearest –

+0

hart Codierung dieser Option in der mongodb Verbindung URL würde in der Tat funktionieren, aber das ist nicht der Mungo Lösung Ich hatte gehofft –

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

Dieser arbeitete für mich

Verwandte Themen