我们在本地网络接口(即 192.168.1.x)上设置了一个 mongo 副本集。副本集成员是唯一知道此接口的成员。这些实例也位于可从我们的网络 (10.xxx) 内部寻址的外部接口上。当尝试仅使用 Java 驱动程序[2.10.1](通过gMongo 包装器)连接到“主服务器”时,我们遇到了一个问题,即由于应用程序无法确定其他副本节点而无法建立连接。即使我在服务器列表中提供了所有外部接口,也会发生这种情况。
我还需要能够设置从我的机器到副本集的 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
我不确定它为什么要根据服务器的本地配置而不是我提供的服务器列表来解决。