连接到远程 mongo 服务器工作正常,但是通过 Go 连接时,它给出了错误:超出了上下文截止日期

我正在使用以下 ssh 隧道命令连接到远程 mongo 服务器:


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


在本地使用 mongo 命令连接到 mongo 服务器也可以正常工作。

http://img.mukewang.com/6284b55e0001d6c113130208.jpg

但是当我尝试使用 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))

    }


}

代码中使用的用户名和密码是连接到远程服务器所需的。使用 golang 代码连接到远程 mongo 服务器时可能会出现什么问题?


千巷猫影
浏览 157回答 3
3回答

慕仙森

27017:docdb-2019-07-30-09-40-47.cluster-cffrhwfhhfof.us-east-2.docdb.amazonaws.com:27017URI 显示这是 AWS DocumentDB,而不是 MongoDB。DocumentDB 不基于 MongoDB 服务器。相反,它模拟MongoDB API,并在 Amazon 的 Aurora 后端平台之上运行。如果您打算使用 DocumentDB,而不是使用MongoDB 官方 Go 驱动程序,请参阅SDK for Go:docdb,因为两者之间存在差异和兼容性问题:MongoDB:比较 DocumentDB 和 MongoDBAWS:DocumentDB 和 MongoDB 的功能差异根据您的用例,请参阅MongoDB Atlas错误:超出上下文期限此错误消息表明,给定上下文指定的时间量,它无法连接。造成这种情况的原因有很多,可能有:客户端计算机与 DocumentDB 集群位于不同的 VPC 上集群的安全组不允许入站连接 27017客户端计算机与 DocumentDB 集群位于不同的区域另请参阅DocumentDB 疑难解答

慕婉清6462132

来自golang mongo 驱动程序文档:创建 options.ClientOptions 时,调用方法的顺序很重要。以后的 Set* 方法将覆盖以前 Set* 方法调用的值。这包括 ApplyURI 方法。这允许调用者确定选项应用的优先顺序。例如,如果在 SetAuth 之前调用 ApplyURI,则来自 SetAuth 的凭据将覆盖连接字符串中的值。如果在 SetAuth 之后调用 ApplyURI,则其值将覆盖来自 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,    })希望能帮助到你。

Helenr

以下是一些可能的问题端口问题您需要检查端口是否打开,并允许从任何地方进行连接。如果您使用的是 Linux(Ubuntu),请检查防火墙设置sudo ufw status verbose。如果防火墙被禁用,那就没问题了。VM 端口访问还允许 VM 级别的端口。如果您使用的是 Amazon Lightsail,则必须明确允许该端口授予远程客户端访问权限以建立连接。Docker 容器如果您的应用程序和 MongoDB 作为 Docker 容器部署到远程服务器并且您无法与 DB 建立连接,那么可能的解决方案是Docker Network。创建自己的 Docker 网络创建 MongoDB 容器和名称容器,例如mongodb将 MongoDB 添加到您的网络将 Web 应用程序添加到您的网络尝试通过容器名称使用 Web 应用程序连接到 MongoDB 容器。// Set client options     clientOptions := options.Client().ApplyURI("mongodb://mongodb:27017")      clientOptions = clientOptions.SetMaxPoolSize(100)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go