2

ローカル ネットワーク インターフェイス (つまり、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

私が提供するサーバーのリストではなく、サーバーのローカル構成に基づいて解決しようとしている理由がわかりません。

4

1 に答える 1

4

私の経験では、レプリカ セットは、クライアントとサーバーの両方が解決できる DNS 名を持っている場合に最適に機能します。

私は pymongo と php MongoClient の両方を使用しました。クライアント マシンがレプリカ セットの IP アドレスを使用しているが、レプリカ セットが DNS 名を使用してセットアップされている場合、クライアントは接続に失敗します (おそらく、レプリカ セットにどのノードがプライマリ、レプリカ セットはおそらく DNS 名を返します)。

DNS 名を使用すると (クライアントのホスト ファイルを変更するだけです)、接続は失敗しません。

レプリカ セットに関するドキュメントから:

レプリカ セットの各メンバーは、解決可能な DNS またはホスト名を介してアクセスできる必要があります。

これが問題のデバッグに役立つことを願っています。

于 2013-05-16T21:43:31.270 に答える