当副本集在本地IP地址上相互连接时,连接到远程MongoDB副本集

时间:2013-05-16 15:57:06

标签: mongodb mongodb-java gmongo

我们在本地网络接口(即192.168.1.x)上设置了一个mongo副本集。副本集成员是唯一知道此接口的成员。这些实例也位于可从我们的网络内部(10.x.x.x)寻址的外部接口上。当尝试仅使用Java驱动程序[2.10.1](通过gMongo wrapper)连接到“master”时,我们遇到了一个问题,即由于应用程序无法确定其他副本节点而无法建立连接。即使我在服务器列表中提供了所有外部接口,也会发生这种情况。

我还需要能够从我的机器到副本集设置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

我不确定为什么它会尝试根据服务器的本地配置而不是我提供的服务器列表来解决。

1 个答案:

答案 0 :(得分:4)

根据我的经验,当副本集具有客户端和服务器都可以解析的DNS名称时,它们的效果最佳。

我已经使用了pymongo和php MongoClient,如果客户端机器使用副本集的IP地址,但副本集是使用DNS名称设置的,则客户端将无法连接(可能是因为在询问副本集时)哪个节点是主节点,副本集可能返回DNS名称。)

如果我使用DNS名称(我只修改客户端上的hosts文件),那么连接不会失败。

来自documentation副本集:

  

必须可通过可解析的DNS或主机名

访问副本集的每个成员

希望这可以帮助您调试问题。