2016-03-30 13 views
2

私は3つのメンバーのレプリカセットを持っています。 2つのセカンダリノードのうちの1つから読み込みたいだけの可能性はありますか?私は次のコードを使用します.IPは二次的なものですが、トラフィックは他のノードに展開されています。mongoレプリカセットの特定のノードからデータを読み取る

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

をreadpreferenceを設定します。あなたは接続文字列であなたの意図を指定しなければなりません。 https://docs.mongodb.org/manual/core/read-preference/を参照してください。任意のノードからいつでも直接読み取ることができます。 – Saleem

+0

"セカンダリ"のアドレスを指定しても読み込み設定を設定しない限り(実際には実行しないでください)、接続されているノードのみ**ではありません。これはレプリカセットなので、あなたのメンバーが「バランスの取れていない」(つまり、他のメンバーよりも能力の高いサーバーである場合)、これはもう一度非常に悪いことになる可能性があります。 –

+0

はい、私は2番目の@BlakesSevenです。特別なニーズがある場合を除いて、レプリカセット内の特定のセカンダリから直接読むべきではありません。レポートサーバーなどのセカンダリ。 – Saleem

答えて

4

最も良い方法は、mongodbマニュアルに記載されているようにタグを使用することです。クライアントで

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) 

、あなただけ確かにあなたがセカンダリから読み取ることができ、そのタグに

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); 
関連する問題