我正在使用以下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))
}
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,
}
}
代码中使用的用户名和密码是连接到远程服务器所需的用户名和密码。 使用golang代码连接到远程mongo服务器时可能出什么问题了?
答案 0 :(得分:0)
创建options.ClientOptions时,方法的顺序 所谓的事情。以后的Set *方法将覆盖 以前的Set *方法调用。这包括ApplyURI方法。 这使调用者可以确定选项的优先顺序 应用。例如,如果在SetAuth之前调用ApplyURI,则 来自SetAuth的凭据将覆盖连接中的值 串。如果在SetAuth之后调用ApplyURI,则其值将 覆盖SetAuth中的内容。
opts参数使用options.MergeClientOptions处理, 这将覆盖先前选项的整个选项字段 没有部分覆盖。例如,如果在验证中设置了用户名 第一个选项的字段,第二个设置密码,但是 没有用户名,合并后的“用户名”字段将为空。
您的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,
})
希望有帮助。
答案 1 :(得分:0)
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 official Go driver,请参阅SDK for Go: docdb,因为两者之间存在差异和兼容性问题:
根据您的用例,请参见MongoDB Atlas
Err:超出了上下文期限
此错误消息表明,在上下文中指定的时间量内,它无法连接。造成这种情况的原因有很多,可能性是:
答案 2 :(得分:0)
这里有一些可能的问题
端口问题
您需要检查端口是否打开,并授予从任何地方连接的访问权限。如果您使用的是 Linux(Ubuntu),请检查防火墙设置 sudo ufw status verbose
。如果防火墙被禁用,那就没问题了。
虚拟机端口访问
还允许在 VM 级别的端口。如果您使用的是 Amazon Lightsail,则必须明确允许该端口访问远程客户端以建立连接。
mongodb
// Set client options
clientOptions := options.Client().ApplyURI("mongodb://mongodb:27017")
clientOptions = clientOptions.SetMaxPoolSize(100)