Подключение к MongoDB Atlas с использованием Golang mgo: постоянный недостижимый сервер для набора реплик

У меня есть набор реплик из атласа MongoDB, к которому я могу подключиться с ЛЮБЫМ другим языком и обычным клиентом mongo с URL-адресом, предоставленным в формате:

mongodb://user:[email protected]:27017,prefix2.mongodb.net:27017,prefix3.mongodb.net:27017/test?&replicaSet=Cluster0-shard-0&authSource=admin

Что бы я ни пробовал, добавляя ssl=true и удаляя, ничего не получается. Это всегда недоступный сервер.

Я пробовал каждую комбинацию для URL, каждую комбинацию для dialConfig, а также конфигурации Dial и DialWithConfig.

Что может быть причиной ?


person hece    schedule 15.12.2016    source источник
comment
Есть новости по этому поводу?   -  person Marcel Gruber    schedule 16.05.2017


Ответы (1)


Использование фрагмента кода mgo драйвера MongoDB Go для подключения к MongoDB Atlas работает, используя данные вашего примера:

import (
    "gopkg.in/mgo.v2"
    "crypto/tls"
    "net"
)

tlsConfig := &tls.Config{}

dialInfo := &mgo.DialInfo{
    Addrs: []string{"prefix1.mongodb.net:27017", 
                    "prefix2.mongodb.net:27017",
                    "prefix3.mongodb.net:27017"},
    Database: "authDatabaseName",
    Username: "user",
    Password: "pass",
}
dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
    conn, err := tls.Dial("tcp", addr.String(), tlsConfig)
    return conn, err
}
session, err := mgo.DialWithInfo(dialInfo)

Обратите внимание, что вы также можете указать только один из элементов набора реплик в качестве исходного. Например:

Addrs: []string{"prefix2.mongodb.net:27017"}

Смотрите также:

Обновление:

Вы также можете использовать метод ParseURL() для анализа строки URI MongoDB Atlas. Однако в настоящее время этот метод не поддерживает SSL (mgo.V2 PR:304).

Обходной путь заключается в том, чтобы удалить строку ssl=true перед синтаксическим анализом.

//URI without ssl=true
var mongoURI = "mongodb://username:[email protected],prefix2.mongodb.net,prefix3.mongodb.net/dbName?replicaSet=replName&authSource=admin"

dialInfo, err := mgo.ParseURL(mongoURI)

//Below part is similar to above. 
tlsConfig := &tls.Config{}
dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
    conn, err := tls.Dial("tcp", addr.String(), tlsConfig)
    return conn, err
}
session, _ := mgo.DialWithInfo(dialInfo)
person Wan Bachtiar    schedule 01.03.2017
comment
Не могли бы вы посоветовать, как будет выглядеть строка подключения, если вместо этого dialInfo будет сгенерирован таким образом? dialInfo, err := mgo.ParseURL(url). Ценится. - person Marcel Gruber; 17.05.2017
comment
Привет @Wan Bachtiar, есть идеи, как анализировать новые URL-адреса для Atlas в Mongo 3.6. Например. mongodb+srv://kay:[email protected]/?serverSelectionTryOnce=false&serverSelectionTimeoutMS=15000 - person rsan; 21.08.2018
comment
@rsan новый официальный драйвер mongo-go-driver должен поддерживать это. Если у вас все еще есть проблема, пожалуйста, откройте новый вопрос и свяжите его здесь. Укажите драйвер и версию, которую вы используете. Ваше здоровье - person Wan Bachtiar; 22.08.2018
comment
@WanBachtiar благодарит Вана, протестировано и работает с официальным драйвером. - person rsan; 23.08.2018
comment
просто небольшое обновление, установленное Source в DialInfo, иначе вы можете получить следующую ошибку panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x1455022]. Я установил source: "admin", который отлично работает для меня. - person Snehal Dangroshiya; 24.11.2018