您遇到的错误ReplicaSetNoPrimary表示您的MongoDB客户端无法在副本集中找到主节点。具体问题似乎与无效或过期的TLS证书有关,如每个服务器的错误所示:TLS:未能验证证书:x509:证书已过期或尚未生效。
以下是您可以采取的几个步骤来诊断和解决此问题:
-
检查系统时间:确保您机器上的系统时间为
正确同步。证书验证依赖于系统
时间,如果您的系统时间不正确,可能会导致
证书显示为已过期或尚未生效。
-
验证证书有效性:检查证书的有效性
由您的MongoDB Atlas集群使用。您可以通过访问
MongoDB Atlas UI并检查集群的设置。确保
证书有效且未过期。
在此处输入代码
-
更新CA证书:确保您的系统已更新
证书颁发机构(CA)证书。这通常可以通过以下方式完成
正在更新系统上的ca证书包。
-
显式TLS配置:您可以配置MongoDB客户端
通过指定CA来明确信任所提供的证书
文件这可以使用连接中的tlsCAFile选项来完成
一串以下是一个示例:
package main
import (
"context"
"crypto/tls"
"crypto/x509"
"io/ioutil"
"log"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
func SetupDB(uri string) *mongo.Client {
log.Printf("Connecting to MongoDB")
log.Printf("URI: %s", uri)
ctx := context.TODO()
// Load CA file
caFilePath := "path/to/ca.pem"
caCert, err := ioutil.ReadFile(caFilePath)
if err != nil {
log.Fatalf("Failed to read CA file: %v", err)
}
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(caCert)
tlsConfig := &tls.Config{
RootCAs: caCertPool,
}
clientOptions := options.Client().ApplyURI(uri).SetTLSConfig(tlsConfig)
client, err := mongo.Connect(ctx, clientOptions)
if err != nil {
log.Fatalf("Failed to connect to MongoDB: %v", err)
}
defer func() {
if err := client.Disconnect(ctx); err != nil {
log.Fatalf("Failed to disconnect from MongoDB: %v", err)
}
}()
if err := client.Ping(ctx, readpref.Primary()); err != nil {
log.Fatalf("Failed to ping MongoDB: %v", err)
}
log.Printf("Connected to MongoDB")
return client
}
func main() {
uri := "mongodb+srv://user:[email protected]/?retryWrites=true&w=majority&appName=ntw"
SetupDB(uri)
}