为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
千巷猫影 2022-05-18 16:58:47
我正在使用以下 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 服务器也可以正常工作。但是当我尝试使用 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 服务器时可能会出现什么问题?
查看完整描述

3 回答

?
慕仙森

TA贡献1827条经验 获得超8个赞

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

URI 显示这是 AWS DocumentDB,而不是 MongoDB。DocumentDB 不基于 MongoDB 服务器。相反,它模拟MongoDB API,并在 Amazon 的 Aurora 后端平台之上运行。

如果您打算使用 DocumentDB,而不是使用MongoDB 官方 Go 驱动程序,请参阅SDK for Go:docdb,因为两者之间存在差异和兼容性问题:

根据您的用例,请参阅MongoDB Atlas

错误:超出上下文期限

此错误消息表明,给定上下文指定的时间量,它无法连接。造成这种情况的原因有很多,可能有:

  • 客户端计算机与 DocumentDB 集群位于不同的 VPC 上

  • 集群的安全组不允许入站连接 27017

  • 客户端计算机与 DocumentDB 集群位于不同的区域

另请参阅DocumentDB 疑难解答


查看完整回答
反对 回复 2022-05-18
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

来自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,

    })

希望能帮助到你。


查看完整回答
反对 回复 2022-05-18
?
Helenr

TA贡献1780条经验 获得超4个赞

以下是一些可能的问题

  • 端口问题
    您需要检查端口是否打开,并允许从任何地方进行连接。如果您使用的是 Linux(Ubuntu),请检查防火墙设置sudo ufw status verbose。如果防火墙被禁用,那就没问题了。

  • VM 端口访问
    还允许 VM 级别的端口。如果您使用的是 Amazon Lightsail,则必须明确允许该端口授予远程客户端访问权限以建立连接。

//img1.sycdn.imooc.com//6284b58e0001e13609120411.jpg

  • 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)


查看完整回答
反对 回复 2022-05-18
  • 3 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号