代码之家  ›  专栏  ›  技术社区  ›  Ilkhom Tashkulov

MongoDB与Go的连接错误,ReplicaSetNoPrimary

  •  1
  • Ilkhom Tashkulov  · 技术社区  · 6 月前

    我试图从我的Go应用程序连接到MongoDB,但遇到ReplicaSetNoPrimary错误。

    以下是我与MongoDB的代码连接:

    MongoDB URI示例:

    mongodb+srv://user:[email protected]/?retryWrites=true&w=majority&appName=ntw
    
    func SetupDB(uri string) *mongo.Client {
        log.Printf("Connecting to MongoDB")
        log.Printf("URI: %s", uri)
        ctx := context.TODO()
        client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
        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
    }
    
    

    以下是我遇到的错误:

    Failed to ping MongoDB: server selection error: server selection timeout, current topology:
    
    { Type: ReplicaSetNoPrimary,
    Servers: [{ Addr: ac-l4ofxbw-shard-00-00.55n9jaw.mongodb.net:27017, 
    Type: Unknown,
    Last error: tls: failed to verify certificate: x509: certificate has expired or is not yet valid:  },
    { Addr: ac-l4ofxbw-shard-00-01.55n9jaw.mongodb.net:27017,
    Type: Unknown, 
    Last error: tls: failed to verify certificate: x509: certificate has expired or is not yet valid:  }, 
    { Addr: ac-l4ofxbw-shard-00-02.55n9jaw.mongodb.net:27017, 
    Type: Unknown, 
    Last error: tls: failed to verify certificate: x509: certificate has expired or is not yet valid:  }, ] }
    
    
    1 回复  |  直到 6 月前
        1
  •  2
  •   Sparsh Gahlot    6 月前

    您遇到的错误ReplicaSetNoPrimary表示您的MongoDB客户端无法在副本集中找到主节点。具体问题似乎与无效或过期的TLS证书有关,如每个服务器的错误所示:TLS:未能验证证书:x509:证书已过期或尚未生效。

    以下是您可以采取的几个步骤来诊断和解决此问题:

    1. 检查系统时间:确保您机器上的系统时间为 正确同步。证书验证依赖于系统 时间,如果您的系统时间不正确,可能会导致 证书显示为已过期或尚未生效。

    2. 验证证书有效性:检查证书的有效性 由您的MongoDB Atlas集群使用。您可以通过访问 MongoDB Atlas UI并检查集群的设置。确保 证书有效且未过期。 在此处输入代码

    3. 更新CA证书:确保您的系统已更新 证书颁发机构(CA)证书。这通常可以通过以下方式完成 正在更新系统上的ca证书包。

    4. 显式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)
    }