2013-05-16 67 views
2

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

我还需要能够设置从我的机器到副本集的SSH隧道。再一次,我遇到了同样的问题,因为副本集提供了不适用于我的主机名和IP地址。

当副本仅通过本地IP地址相互了解时,如何连接到副本集?

下面是代码和导致错误的例子。下面的例子假设隧道已经从本地主机设置到远程服务器。

@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

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

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

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

documentation上副本集:

副本集的每个成员都必须是通过DNS解析方式或主机名

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

+0

这意味着我不应该把它们放在自己的网络接口上,我想(192.168.1.x)当调用者打开(10.0.x.x)时。这是一个无赖,因为我无法从本地机器使用SSH隧道。我想我可以更改我自己的主机文件,将服务器上的DNS名称指向我的本地隧道,作为SSH示例的解决方案。 – Scott

+0

如果明白你想要正确做什么,看起来你只需要修改每个mongo节点上的hosts文件来覆盖任何常规DNS条目,例如,将节点DNS名称指向每个节点的(192.168.1.x)接口。这将允许他们在他们自己的专用网络上进行通信(可能会减少复制延迟),同时仍使其可公开寻址。 –