Подключение к удаленному серверу mon go работает нормально, но при подключении через Go выдает ошибку: превышен крайний срок контекста - PullRequest
0 голосов
/ 06 марта 2020

Я подключаюсь к удаленному серверу mon go, используя следующую команду туннелирования s sh:

ssh -i document-db-tun.pem -L 27017:docdb.cluster-cf.us-east-2.docdb.amazonaws.com:27017 ubuntu@ec2-111-111-111-111.us-east-2.compute.amazonaws.com -N

Также подключение к серверу mon go работает нормально, используя mon go команда локально.

enter image description here

Но когда я пытаюсь подключиться к нему локально, используя код golang, выдается ошибка Mongo connection ckeck failed. Err: context deadline exceeded.

const (
    mongoTimeout = time.Second * 10
)

func initMongo() {
    mongoConf := common.Conf.ServiceConfig.Databases.Mongo

    ctx, _ := context.WithTimeout(context.Background(), mongoTimeout)
    uri := fmt.Sprintf("mongodb://127.0.0.1:27017")
    if common.IsSentryEnabled() {
        sentry.AddBreadcrumb(&sentry.Breadcrumb{
            Message:  fmt.Sprintf("Connecting to mongo server at: '%v'", uri),
            Category: common.SENTRY_CAT_REPO,
            Level:    sentry.LevelInfo,
        })
    }
    client := options.Client().
        SetReadPreference(readpref.SecondaryPreferred()).
        SetAppName("catalog").
        SetMaxConnIdleTime(time.Microsecond * 100000).
        SetAuth(options.Credential{
            Username: mongoConf.Username,
            Password: mongoConf.Password,
        }).
        ApplyURI(uri)

    pureMongoClient, err := mongo.Connect(ctx, client)
    if err != nil {
        if common.IsSentryEnabled() {
            sentry.AddBreadcrumb(&sentry.Breadcrumb{
                Message:  "Error connecting to mongo",
                Category: common.SENTRY_CAT_REPO,
                Level:    sentry.LevelFatal,
            })
            sentry.ConfigureScope(func(scope *sentry.Scope) {
                scope.SetTags(map[string]string{
                    common.SENTRY_SCOPE_KEY: common.SENTRY_SCOPE_MONGO,
                    common.SENTRY_TYPE_KEY:  common.SENTRY_TYPE_DB,
                })
            })
            sentry.CaptureException(err)
            sentry.Flush(time.Second * 5)
        }

        panic(fmt.Sprintf("Failed to establish mongo connection. Err: %v ", err))
    }

    err = pureMongoClient.Ping(ctx, readpref.Primary())
    if err != nil {
        if common.IsSentryEnabled() {
            sentry.AddBreadcrumb(&sentry.Breadcrumb{
                Message:  "Mongo connection ckeck failed",
                Category: common.SENTRY_CAT_REPO,
                Level:    sentry.LevelFatal,
            })
            sentry.ConfigureScope(func(scope *sentry.Scope) {
                scope.SetTags(map[string]string{
                    common.SENTRY_SCOPE_KEY: common.SENTRY_SCOPE_MONGO,
                    common.SENTRY_TYPE_KEY:  common.SENTRY_TYPE_DB,
                })
            })
            sentry.CaptureException(err)
            sentry.Flush(time.Second * 5)
        }

        panic(fmt.Sprintf("Mongo connection ckeck failed. Err: %v ", err))
    }

    mongoDB := pureMongoClient.Database(mongoConf.Dbname)

    dbManager.MongoDB = &MGODatabase{
        Database: mongoDB,
    }
}

Имя пользователя и пароль, используемые в коде, - это те, которые необходимы для подключения к удаленному серверу. Что может быть не так при подключении к удаленному серверу mon go с использованием кода golang?

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

27017: docdb-2019-07-30-09-40-47.cluster-cffrhwfhhfof.us-east-2.docdb.amazon aws .com: 27017

URI показывает, что это AWS DocumentDB, а не MongoDB. DocumentDB не основан на сервере MongoDB. Скорее, он эмулирует MongoDB API и работает поверх базовой платформы Amazon Aurora.

Если вы намереваетесь использовать DocumentDB вместо MongoDB official Go driver , см. SDK для Go: docdb , поскольку есть различия и совместимость проблемы между ними:

В зависимости от вашего случая использования см. MongoDB Atlas

Ошибка: превышен крайний срок контекста

Это сообщение об ошибке указывает, что данный количество времени, указанное в контексте, не удалось подключиться. Это может быть вызвано многими причинами. Возможны следующие варианты:

  • Клиентский компьютер находится на другом VP C, чем кластер DocumentDB
  • Группа безопасности вашего кластера не разрешает входящие соединения 27017
  • Клиентский компьютер находится в другом регионе, чем кластер DocumentDB

См. также Устранение неполадок DocumentDB

0 голосов
/ 06 марта 2020

Из документов драйвера golang mon go :

При создании options.ClientOptions порядок, в котором методы называются, имеет значение. Более поздние методы Set * будут перезаписывать значения из предыдущих вызовов метода Set *. Это включает в себя метод ApplyURI. Это позволяет вызывающим абонентам определять порядок приоритета для опции приложения. Например, если ApplyURI вызывается до SetAuth, Credential from SetAuth перезапишет значения из строки подключения. Если ApplyURI вызывается после SetAuth, то его значения будут перезаписывать значения из SetAuth.

Параметр opts обрабатывается с использованием options.MergeClientOptions, который перезаписывает все поля параметров предыдущих параметров, частичная перезапись отсутствует. Например, если имя пользователя задано в поле «Auth» для первого параметра, а пароль - для второго, но без имени пользователя, после объединения поле «Имя пользователя» будет пустым.

Ваш ApplyURI существенно отменяет все предыдущие опции, которые вы установили для экземпляра options.ClientOptions.

Попробуйте изменить порядок следующим образом:

client := options.Client().
    ApplyURI(uri).
    SetReadPreference(readpref.SecondaryPreferred()).
    SetAppName("catalog").
    SetMaxConnIdleTime(time.Microsecond * 100000).
    SetAuth(options.Credential{
        Username: mongoConf.Username,
        Password: mongoConf.Password,
    })

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...