Подключение к удаленному набору реплик MongoDB, когда набор реплик подключается друг к другу по локальным IP-адресам

Мы настроили набор реплик монго на локальном сетевом интерфейсе (то есть 192.168.1.x). Члены набора реплик являются единственными, кто знает об этом интерфейсе. Экземпляры также находятся на внешнем интерфейсе, адресуемом из нашей сети (10.xxx). При попытке подключиться к "master" только с помощью драйвера Java [2.10.1] (через обертку gMongo) мы сталкиваемся с проблемой, когда соединение не будет установлено, потому что приложение не может определить другие узлы реплики. Это происходит, даже если я предоставляю все внешние интерфейсы в списке серверов.

Мне также нужно иметь возможность настроить 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

Я не уверен, почему он пытается решить, основываясь на локальной конфигурации серверов, а не на списке серверов, которые я предоставляю.

1 ответ

Решение

По моему опыту, наборы реплик работают лучше всего, когда у них есть DNS-имена, которые могут разрешать как клиенты, так и серверы.

Я использовал и pymongo, и php MongoClient, и если клиентская машина использует IP-адреса набора реплик, но набор реплик был настроен с использованием DNS-имен, клиент не сможет подключиться (возможно, потому, что при запросе набора реплик, какой узел основной, набор реплик, вероятно, возвращает имя DNS).

Если я использую DNS-имена (я просто изменяю файл hosts на клиенте), то соединения не прерываются.

Из документации на наборы реплик:

Каждый член набора реплик должен быть доступен через разрешимые DNS или имена хостов.

Надеюсь, это поможет вам решить вашу проблему.

Другие вопросы по тегам