在Go中使用MongoDB Atlas连接及服务器选择超时问题解决
MongoDB Atlas连接超时问题排查及Go连接指南
问题描述
尝试用Go连接MongoDB Atlas时遇到服务器选择超时错误,同时希望了解Go中连接MongoDB Atlas的正确方法。
错误信息
selection error: server selection timeout, current topology: { Type: ReplicaSetNoPrimary, Servers: [{ Addr: ac-pjyudwq-shard-00-01.1bnb2bm.mongodb.net:27017, Type: Unknown, Last error: dial tcp 3.6.207.111:27017: i/o timeout }, { Addr: ac-pjyudwq-shard-00-00.1bnb2bm.mongodb.net:27017, Type: Unknown, Last error: dial tcp 3.7.150.83:27017: i/o timeout }, { Addr: ac-pjyudwq-shard-00-02.1bnb2bm.mongodb.net:27017, Type: Unknown, Last error: dial tcp 3.7.137.42:27017: i/o timeout }, ] } exit status 1
当前使用的代码
const MONGOURL = "mongodb+srv://sai:sai@cluster0.1bnb2bm.mongodb.net/?retryWrites=true&w=majority" var collection *mongo.Collection func init() { fmt.Println("in the init function") var databasename string = "GOAPI" var collectionname string = "Movies" client, err: = mongo.Connect(context.TODO(), options.Client().ApplyURI(MONGOURL)) if err != nil { fmt.Println("unable to get mongo connection ") log.Fatal(err) } collection = ( * mongo.Collection)(client.Database(databasename).Collection(collectionname)) fmt.Println("sucessfully collection is created ") doc: = Movie { Name: "rrr", Watched: false, Rating: 9, Id: "12121" } result, err: = collection.InsertOne(context.Background(), doc) if err != nil { log.Fatal("hey unable to insert one ", err) } fmt.Println("sucessfully added : ", result.InsertedID) // mongo.Connect()`your text` }
问题排查及解决方案
1. 网络与IP白名单问题
从错误里的dial tcp ... i/o timeout可以看出,本地机器无法连通Atlas集群节点,优先检查:
- 确认当前机器的公网IP已添加到MongoDB Atlas的IP白名单(Atlas控制台→集群→网络访问→添加IP地址,可临时加
0.0.0.0/0测试,生产环境禁用) - 检查本地防火墙、代理是否拦截了27017端口的出站请求
- 尝试ping Atlas节点地址(如
ac-pjyudwq-shard-00-01.1bnb2bm.mongodb.net),确认域名解析和网络连通性
2. 连接字符串验证
- 确认连接字符串里的用户名、密码正确,密码含特殊字符需做URL编码
- 核对集群地址是否与Atlas控制台提供的一致,避免手动输入错误
3. 代码优化建议
原代码存在格式问题,且缺少连接校验步骤,优化后的示例:
package main import ( "context" "fmt" "log" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) const MONGOURL = "mongodb+srv://sai:sai@cluster0.1bnb2bm.mongodb.net/?retryWrites=true&w=majority" var collection *mongo.Collection type Movie struct { Name string `bson:"name"` Watched bool `bson:"watched"` Rating int `bson:"rating"` Id string `bson:"_id"` } func init() { fmt.Println("in the init function") databasename := "GOAPI" collectionname := "Movies" // 配置客户端选项 clientOpts := options.Client().ApplyURI(MONGOURL) // 建立连接 client, err := mongo.Connect(context.TODO(), clientOpts) if err != nil { log.Fatal("无法建立MongoDB连接: ", err) } // 校验连接有效性 err = client.Ping(context.TODO(), nil) if err != nil { log.Fatal("连接校验失败: ", err) } fmt.Println("成功连接到MongoDB Atlas") collection = client.Database(databasename).Collection(collectionname) fmt.Println("集合初始化完成") doc := Movie{ Name: "rrr", Watched: false, Rating: 9, Id: "12121", } result, err := collection.InsertOne(context.Background(), doc) if err != nil { log.Fatal("插入文档失败: ", err) } fmt.Println("文档插入成功,ID: ", result.InsertedID) } func main() { // init函数会自动执行,主函数留空即可 }
4. Go连接MongoDB Atlas的标准步骤
- 安装驱动:执行
go get go.mongodb.org/mongo-driver/mongo安装官方Go驱动 - 获取连接字符串:在Atlas控制台→集群→连接→连接应用程序,选择Go语言,复制生成的字符串并替换用户名、密码
- 初始化客户端并校验:用
mongo.Connect创建客户端,必须调用client.Ping确认连接成功 - 操作集合:通过客户端实例获取数据库和集合,执行增删改查操作
- 关闭连接:程序退出前调用
client.Disconnect(context.TODO())释放资源
内容的提问来源于stack exchange,提问作者cherry brezzy
相关产品推荐
相关产品推荐

