mongodbgomongodb-replica-setavailability-zone

Problem connecting to MongoDB ReplicaSet using Golang and Robo3T


I am trying hard to connect to my MongoDB Replica Set but nothing seems to work.

I have deployed Replica set with 3 node, each on a separate AWS Availability Zone but in the same Region.

Below is the code I am using to connect to Replica Set.

    mongoURL := "mongodb://myuser:password@<publicIP>:27017,<publicIP>:27017,<publicIP>:27017/?replicaSet=replica01&authSource=admin"
    clientOptions := options.Client().ApplyURI(mongoURL)
    clientOptions = clientOptions.SetMaxPoolSize(100) //100 is default driver setting
    log.Println("Connection String: " + clientOptions.GetURI())
    client, err := mongo.Connect(ctx, clientOptions)

I have also created DNS mapping and used that also, but that's also not working.
Below is the connection URL
mongodb://adminuser:password@rs1.domain.com:27017,rs2.domain.com:27017,rs3.domain.com:27017/?replicaSet=replica01&authSource=admin

Robo3T

When I am trying to connect Replica Set with Robo3T using public IP I get the following error

Cannot connect to replica set "IP-RS"[public-ip:27017]. Set's primary is unreachable.

Reason: No member of the set is reachable. Reason: Connect failed

When I use sub-domain name to connect to replica set, I get the following error

Cannot connect to replica set "SRV Replica"[rs1.domain.com:27017]. Set's primary is unreachable.

Reason: Failed to initialize MongoWorker. Reason: connect failed


Solution

  • Here is the solution.

    The problem was the hostname. I used the hostname while configuring the replica set.

    Here is my configuration

    $ config = {
      _id : "mongo-cluster",
       members : [
           {_id : 0, host : "mongo-1:27017"},
           {_id : 1, host : "mongo-2:27017"},
           {_id : 2, host : "mongo-3:27017"},
       ]
    }
    
    $ rs.initiate(config)
    

    Solution

    I changed the hostname with private-ip.
    Please note that, since my 3 replica nodes resides in the same AWS region but in different availability zones, so I used private ip to make connection between nodes.

    $ config = {
      _id : "replica01",
       members : [
           {_id : 0, host : "private-ip:27017"},
           {_id : 1, host : "private-ip:27017"},
           {_id : 2, host : "private-ip:27017"},
       ]
    }
    
    rs0:PRIMARY> rs.reconfig(config)
    

    MongoDB conf setting on all 3 nodes

    File: /etc/mongod.conf
    
        net:
          port: 27017
          bindIp: 127.0.0.1, 172.16.1.x (private-ip)
    
        security:
          keyFile: /opt/mongo/mongo-keyfile
    
        replication:
          replSetName: replica01
    

    Hostentry on all the 3 nodes

    File: /etc/hosts
    
        172.16.1.x    mongo-1
        172.16.1.x    mongo-2
        172.16.1.x    mongo-3
    

    Your each machine's name should match with the name defined in /etc/hosts file

    $ sudo nano /etc/hostname 
    mongo-1 
    

    Replica Status

    > rs.status()
    
    {
        "set" : "replica01",
        "date" : ISODate("2021-03-13T12:42:45.971Z"),
        "myState" : 2,
        "term" : NumberLong(8),
        "syncSourceHost" : "172.16.1.x:27017",
        "syncSourceId" : 2,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "majorityVoteCount" : 2,
        "writeMajorityCount" : 2,
        "votingMembersCount" : 3,
        "writableVotingMembersCount" : 3,
        "optimes" : {
            "lastCommittedOpTime" : {
                "ts" : Timestamp(1615639361, 1),
                "t" : NumberLong(8)
            },
            "lastCommittedWallTime" : ISODate("2021-03-13T12:42:41.356Z"),
            "readConcernMajorityOpTime" : {
                "ts" : Timestamp(1615639361, 1),
                "t" : NumberLong(8)
            },
            "readConcernMajorityWallTime" : ISODate("2021-03-13T12:42:41.356Z"),
            "appliedOpTime" : {
                "ts" : Timestamp(1615639361, 1),
                "t" : NumberLong(8)
            },
            "durableOpTime" : {
                "ts" : Timestamp(1615639361, 1),
                "t" : NumberLong(8)
            },
            "lastAppliedWallTime" : ISODate("2021-03-13T12:42:41.356Z"),
            "lastDurableWallTime" : ISODate("2021-03-13T12:42:41.356Z")
        },
        "lastStableRecoveryTimestamp" : Timestamp(1615639331, 1),
        "members" : [
            {
                "_id" : 1,
                "name" : "172.16.1.x:27017",
                "health" : 1,
                "state" : 2,
                "stateStr" : "SECONDARY",
                "uptime" : 159132,
                "optime" : {
                    "ts" : Timestamp(1615639361, 1),
                    "t" : NumberLong(8)
                },
                "optimeDate" : ISODate("2021-03-13T12:42:41Z"),
                "syncSourceHost" : "172.16.1.x:27017",
                "syncSourceId" : 2,
                "infoMessage" : "",
                "configVersion" : 2,
                "configTerm" : 8,
                "self" : true,
                "lastHeartbeatMessage" : ""
            },
            {
                "_id" : 2,
                "name" : "172.16.1.x:27017",
                "health" : 1,
                "state" : 1,
                "stateStr" : "PRIMARY",
                "uptime" : 62213,
                "optime" : {
                    "ts" : Timestamp(1615639361, 1),
                    "t" : NumberLong(8)
                },
                "optimeDurable" : {
                    "ts" : Timestamp(1615639361, 1),
                    "t" : NumberLong(8)
                },
                "optimeDate" : ISODate("2021-03-13T12:42:41Z"),
                "optimeDurableDate" : ISODate("2021-03-13T12:42:41Z"),
                "lastHeartbeat" : ISODate("2021-03-13T12:42:45.616Z"),
                "lastHeartbeatRecv" : ISODate("2021-03-13T12:42:44.778Z"),
                "pingMs" : NumberLong(1),
                "lastHeartbeatMessage" : "",
                "syncSourceHost" : "",
                "syncSourceId" : -1,
                "infoMessage" : "",
                "electionTime" : Timestamp(1615477956, 1),
                "electionDate" : ISODate("2021-03-11T15:52:36Z"),
                "configVersion" : 2,
                "configTerm" : 8
            },
            {
                "_id" : 3,
                "name" : "172.16.1.x:27017",
                "health" : 1,
                "state" : 2,
                "stateStr" : "SECONDARY",
                "uptime" : 62213,
                "optime" : {
                    "ts" : Timestamp(1615639361, 1),
                    "t" : NumberLong(8)
                },
                "optimeDurable" : {
                    "ts" : Timestamp(1615639361, 1),
                    "t" : NumberLong(8)
                },
                "optimeDate" : ISODate("2021-03-13T12:42:41Z"),
                "optimeDurableDate" : ISODate("2021-03-13T12:42:41Z"),
                "lastHeartbeat" : ISODate("2021-03-13T12:42:45.095Z"),
                "lastHeartbeatRecv" : ISODate("2021-03-13T12:42:45.321Z"),
                "pingMs" : NumberLong(0),
                "lastHeartbeatMessage" : "",
                "syncSourceHost" : "172.16.1.x:27017",
                "syncSourceId" : 2,
                "infoMessage" : "",
                "configVersion" : 2,
                "configTerm" : 8
            }
        ],
        "ok" : 1,
        "$clusterTime" : {
            "clusterTime" : Timestamp(1615639361, 1),
            "signature" : {
                "hash" : BinData(0,"2ujactkx3HytFTyWhh+JkzyQy+8="),
                "keyId" : NumberLong("6936222258616598531")
            }
        },
        "operationTime" : Timestamp(1615639361, 1)
    }
    
    

    Go Connection String

    mongoURL := "mongodb://username:pass@$172.16.1.x:27017,172.16.1.x:27017,172.16.1.x:27017/mydb?replicaSet=replica01&authSource=admin"