Golang Go语言中遇到了一个关于连接 Mongodb 的怪事,帮判断一下

Golang Go语言中遇到了一个关于连接 Mongodb 的怪事,帮判断一下

可能触及到我知识的盲区了

情景

本地使用 ssh -L 127.0.0.1:27017:{aliyun.mongodburi}:3717 {user}@{ip} 建立 ssh 通道,将本地的 27017 端口映射到服务器,访问阿里云的 mongodb (无验证),然后在本地运行一些脚本。

映射应该没问题

$ curl 127.0.0.1:27017
It looks like you are trying to access MongoDB over HTTP on the native driver port.

在用 pymongo 时一切正常。

client = MongoClient() # pretty well

今天用了 https://github.com/mongodb/mongo-go-driver,发现在本地无法连接,一直超时。

func initMongoConnection() {
	ctx, _ := context.WithTimeout(context.Background(), time.Second*10)
	log.Println(config.Mongo.URI) // "mongodb://localhost:27017"
	client, err := mongo.Connect(ctx, options.Client().ApplyURI(config.Mongo.URI))
	if err != nil {
		panic(err)
	}
	err = client.Ping(ctx, readpref.Primary())
	if err != nil {
		panic(err) //panic: context deadline exceeded
	}
}

编译之后拿到服务器上去跑又没问题(基本可以定位问题出现在通道上)。本地不走通道访问另一台局域网的 MongoDB,也没问题。
本地到 ssh 服务器的连接速度问题应该可以排除 总结就是:

  • python + pymongo + ssh 没问题(速度很快,应该可以排除网络问题造成超时)
  • golang + mongo-go-driver 没问题
  • goalng + mongo-go-driver + ssh 不行

有可能是哪里的问题?


更多关于Golang Go语言中遇到了一个关于连接 Mongodb 的怪事,帮判断一下的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

没道理

更多关于Golang Go语言中遇到了一个关于连接 Mongodb 的怪事,帮判断一下的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


uri 加一句?connect=direct 就能正确连接了,浪费了生命中的一个小时

config.Mongo.URI 这个是一个集群的地址,但端口映射只映射了集群中一个主机的地址,是不是这个原因?

当然,我很乐意帮你诊断关于Go语言连接MongoDB的问题。首先,请确保你检查了以下几个方面:

  1. 连接字符串:确保你的MongoDB连接字符串是正确的。这通常包括协议(如mongodb://mongodb+srv://)、主机名、端口号、数据库名,以及任何必要的认证信息(如用户名和密码)。

  2. 驱动版本:确认你使用的MongoDB Go驱动版本与你的MongoDB服务器版本兼容。有时候,新版本的驱动可能不支持旧版本的服务器,或者反之。

  3. 网络问题:检查你的Go应用程序是否能够访问运行MongoDB的服务器。这包括网络防火墙设置、MongoDB服务器的绑定地址(是否仅监听localhost),以及任何中间网络设备(如负载均衡器)的配置。

  4. 认证机制:如果你的MongoDB服务器启用了认证,确保你提供了正确的认证数据库(通常是admin)和角色。MongoDB的SCRAM-SHA-256认证机制是较新的默认选项,确保你的驱动支持这一点。

  5. 日志和错误信息:查看Go应用程序和MongoDB服务器的日志文件,这可能会提供关于连接失败的更多详细信息。

  6. 示例代码:如果可能,尝试运行一个简单的MongoDB连接示例代码,看看是否能够成功连接。这有助于排除应用程序特定的问题。

如果以上步骤都不能解决问题,你可能需要提供更详细的错误信息或日志,以便进一步诊断。

回到顶部