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