2016-03-30 17 views
2

Ich habe ein Replikat von drei Mitgliedern. Ist es möglich, dass ich nur von einem der beiden sekundären Knoten lesen möchte? Ich benutze folgenden Code, wo die IP ist eine der sekundären, aber ich sah immer noch der Verkehr wurde auf andere Knoten bereitgestellt.Lesen von Daten von bestimmten Knoten in Mongo-Replikat

Mongo mongo = new MongoClient("171.21.43.34"); 
+1

der Tat können Sie von Secondaries lesen. Sie müssen lediglich Ihre Absicht in der Verbindungszeichenfolge angeben. siehe https://docs.mongodb.org/manual/core/read-preference/. Sie können immer direkt von jedem Knoten lesen. – Saleem

+0

Es sei denn, Sie legen eine Lese-Präferenz fest und spezifizieren sogar die Adresse eines "sekundären" (was Sie eigentlich nicht tun sollten) bedeutet nicht, dass der ** einzige ** Knoten verbunden ist. Da dies ein Replikat ist, wird der Treiber "selbst erkennen "Alle Mitglieder Knoten sowieso. Also Lese Präferenz ist der" König "hier. Auch wenn Ihre Mitglieder nicht" ausgeglichen "sind (dh man ist ein leistungsfähiger Server als der andere) kann dies wieder eine sehr schlechte Sache sein, da Sie enden werden mit einem "lag" auf dem langsameren Knoten, der tatsächlich dazu führen könnte, hinter den oplog zu fallen. –

+0

Ja, ich zweite @BlakesSeven.Sie sollten nicht direkt von bestimmten sekundären im Replicaset lesen, es sei denn, Sie haben spezielle Bedürfnisse sekundär als Berichtsserver oder so. – Saleem

Antwort

4

Der beste Weg ist, Tags wie in mongodb Handbuch angegeben zu verwenden.

https://docs.mongodb.com/manual/tutorial/configure-replica-set-tag-sets/

conf = rs.conf() 
conf.members[0].tags = { "offline": "false"} 
conf.members[1].tags = { "offline": "false"} 
conf.members[2].tags = { "offline": "true"} 
rs.reconfig(conf) 

im Client setzen Sie nur die readpreference zu diesem Tag

MongoClientOptions options = MongoClientOptions 
        .builder() 
        .connectionsPerHost(config.connectionLimit) 
        .readPreference(TaggableReadPreference.secondaryPreferred(new TagSet(new Tag("offline", "true")))) 
        .socketTimeout(config.socketTimeout) 
        .connectTimeout(config.connectionTimeout) 
        .build(); 
    mongo = new MongoClient(NewsDAOConfig.parseAddresses(config.mongoAddress), options);