I use mongo connection uri string to connect to my mongo.
mongodb+srv://myname:mypass#mydb.mongodb.net/myDb?retryWrites=true&w=majority
This replica set has 4 nodes. I wish to execute my read operation on a specifc node. I have the node url. But I am not sure where I should specify this in the connection uri. I could not find anything regarding this in the connection-options for connection uri.
This can be done using the readPreferenceTags. The node that I wanted to connect to had a tag with key nodeType and a value analytics. So my connection uri had to be modified to
mongodb+srv://myname:mypass#mydb.mongodb.net/myDb?retryWrites=true&w=majority&readPreference=secondary&readPreferenceTags=nodeType:ANALYTICS
Related
When connecting to mongo cluster do we need replicaSet option in connection URI like below
mongodb://db1.example.net:27017,db2.example.net:2500/?replicaSet=test
What happens if replicaSet option is not used but all the nodes are given in connection URI like below
mongodb://db1.example.net:27017,db2.example.net:2500/
What is the advantage of giving and not giving replicaSet in the connection URI for the above 2 cases.
It's always recommended to include the replicaSet in the MongoDB connection String URI Format as a best practice. Enabling this will help to explore much more options for better application connectivity.
Advantages of including replicaSet:
Once enabled the client/driver will be aware of the all other members in the replica set.
If fail-over occurs client/driver automatically connects to next available member with zero downtime.
Using readConcern we can scale the reads better with other replica members.
replicaSet=myRepl&readConcernLevel=majority
To acknowledge all the write operation we can use write concern along with the URI
replicaSet=myRepl&w=majority&wtimeoutMS=5000
We can enable the connection timeout to maintain a better connectivity.
replicaSet=test&connectTimeoutMS=200000
Securing the application to use only TLS/SSL encrypted connections.
replicaSet=myRepl&ssl=true
For better secured application support and connectivity always use the replicaSet on connection String URI.
You should specify also the replicaSet.
If you don't specify the replicaSet then you still connect to the PRIMARY node. However, in case the PRIMARY becomes unavailable then your connection is lost. If you specify the replicaSet then the client will automatically re-connect to the new primary member.
You an play around and make test with these commands:
db.hello().primary returns the current primary member
db.hostInfo().system.hostname returns the member where you are currently connected to
if you have an endpoint like: mongodb+srv://username:password#mycluster.mik05g.mongodb.net
run the nslookup CLI
nslookup -type=TXT mycluster.mik05g.mongodb.net
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
mycluster.mik05g.mongodb.net text = "authSource=admin&replicaSet=MyCluster-shard-0"
So the replicaSet name here is: MyCluster-shard-0
While creating new connection on Mongo Compass the UI try to discover the entire replica set topology and connect to the primary/secondary IP.
Is there a way to create a DIRECT connection to an HOST/IP+Port just like the clients api and disable the topology discovery step?
From pymongo documentation:
directConnection (optional): if True, forces this client to
connect directly to the specified MongoDB host as a standalone. If false, the client connects to the entire replica set of which the given MongoDB host(s) is a part
If you don't want to connect to a replicaset, use a mongodb connection string (as opposed to mongodb+srv), use a host IP / port, and drop the &replicaSet= parameter.
A bug ticket was opened to Mongo on Jira
https://jira.mongodb.org/browse/COMPASS-4534
The fix should be in version 1.42.2
I am deploying multiple mongdb replica set, and wondering should I give each set a unique replSetName?
I have read the suggestion on mongodb offical document about choosing unique replSetName for each set. https://docs.mongodb.com/manual/reference/configuration-options/#replication.replSetName
So I'am curious to know "what drivers may group replica set connections by replica set name ?".
For the below reason:
1. mongo doesn't allow you to assign same name to all members of the replicaset
2. To easily identify which node is impacted or having problem
Clarify:
1. Why do you want to assign the same name to all nodes of the replica set?
In your driver's connection string, you must mention name and port of all members of the replica set to achieve HA so that it can automatically connect to the new Primary node
I am using MongoDB with Loopback in my application with a loopback connector to the MongoDB. My application was working fine but now it throws an error
not master and slaveOk=false.
try running rs.slaveOk() in a mongoDB shell
You are attempting to connect to secondary replica whilst previously your app (connection) was set to connect likely to the primary, hence the error. If you use rs.secondaryOk() (slaveOk is deprecated now) you will possibly solve the connection problem but it might not be what you want.
To make sure you are doing the right thing, think if you want to connect to the secondary replica instead of primary. Usually, it's not what you want.
If you have permissions to amend the replica configuration
I suggest to connect using MongoDB Compass and execute rs.status() first to see the existing state and configuration for the cluster. Then, verify which replica is primary.
If necessary, adjust priorities in the replicaset configuration to assign primary status to the right replica. The highest priority number sets the replica as primary. This article shows how to do it right.
If you aren't able to change the replica configuration
Try a few things:
make sure your hostname points to the primary replica
if it is a local environment issue - make sure you added your local replica hostnames to the /etc/hosts pointing to 127.0.0.1
experiment with directConnection=true
experiment with multiple replica hosts and ?replicaSet=<name> - read this article (switch tabs to replica)
The best bet is that your database configuration has changed and your connection string no longer reflects it correctly. Usually, slight adjustments in the connection string are needed or just checking to what instance you want to connect.
When opening a connection to multiple mongoDB servers with ReactiveMongo, we can pass it a list of hosts to connect to.
However I don't find any way to provide the replicaSet name (as we can do in standard MongoDB URIs). Even the URI parser of ReactiveMongo ignores it.
Is it a problem? Will the driver it work correctly without knowledge of the replicaSet name?
The list you provide is called "seed list". When your driver connects to one of these servers, be it a primary or secondary, the driver will be informed that it connected to the replica set and which server is the current primary (if there is one) amongst other details.
Your driver even should be informed when a new primary elected and it should automatically connect to the newly elected primary.
As per ReactiveMongo docs which you should read throughly:
[...]ReactiveMongo provides support for Replica Sets. That means the following:
the driver will detect if it is connected to a Replica Set;
it will probe for the other nodes in the set and connect to them;
it will detect when the primary has changed and guess which is the new one;
[...]