ローカル ネットワーク インターフェイス (つまり、192.168.1.x) に mongo レプリカ セットをセットアップしました。レプリカ セットのメンバーだけが、このインターフェイスについて認識しています。インスタンスは、ネットワーク内 (10.xxx) からアドレス可能な外部インターフェイスにもあります。Java ドライバー [2.10.1] ( gMongo wrapper経由) のみを使用して「マスター」に接続しようとすると、アプリが他のレプリカ ノードを特定できないため、接続が確立されないという問題が発生します。これは、サーバー リストにすべての外部インターフェイスを指定した場合でも発生します。
また、自分のマシンからレプリカ セットへの SSH トンネルをセットアップできる必要もあります。繰り返しになりますが、レプリカ セットが提供するホスト名と IP アドレスが自分には当てはまらないため、同じ問題に遭遇します。
レプリカがローカル IP アドレスのみでお互いを認識している場合、レプリカ セットに接続するにはどうすればよいですか?
コードと結果のエラーの例を次に示します。以下の例では、localhost からリモート サーバーへのトンネルがセットアップされていると想定しています。
@Grab(group='com.gmongo', module='gmongo', version='1.1')
import com.gmongo.*
import com.mongodb.*
def hosts= [
[host:'127.0.0.1', port:29017],
//[host:'127.0.0.1', port:29018], //have tried with and without the others commented
//[host:'127.0.0.1', port:29019],
]
List<ServerAddress> addrs = hosts.collect {it.port?new ServerAddress(it.host, it.port):new ServerAddress(it.host)}
MongoClientOptions clientOptions = new MongoClientOptions.Builder().build()
def mongo = new GMongoClient(addrs, clientOptions)
def db = mongo.getDB("mydb")
def result = db.tickets.findOne([:])
println result
結果は次のようになります。
WARNING: couldn't resolve host [mongo03:27017]
May 16, 2013 10:54:59 AM com.mongodb.ReplicaSetStatus$UpdatableReplicaSetNode _addIfNotHere
WARNING: couldn't resolve host [mongo03:27017]
May 16, 2013 10:55:01 AM com.mongodb.ReplicaSetStatus$UpdatableReplicaSetNode findNode
WARNING: couldn't resolve host [mongo02:27017]
May 16, 2013 10:55:01 AM com.mongodb.ReplicaSetStatus$UpdatableReplicaSetNode _addIfNotHere
WARNING: couldn't resolve host [mongo02:27017]
May 16, 2013 10:55:01 AM com.mongodb.ReplicaSetStatus$UpdatableReplicaSetNode findNode
com.mongodb.MongoException: can't find a master
at com.mongodb.DBTCPConnector.checkMaster(DBTCPConnector.java:518)
WARNING: Server seen down: /192.168.1.11:27017 - java.io.IOException - message: couldn't connect to [/192.168.1.11:27017] bc:java.net.SocketTimeoutException: connect timed out
私が提供するサーバーのリストではなく、サーバーのローカル構成に基づいて解決しようとしている理由がわかりません。