Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

pymongo: Advantage of using MongoReplicaSetClient?

It seems that both MongoClient and MongoReplicaSetClient can connect to mongo replica sets. In fact, their documentation pages are nearly identical - same options, same methods, etc - except that the latter's constructor requires me to specify a replicaSet.

In both cases, we may specify a read preference. In both cases, we must handle the AutoReconnect exception if a stepdown occurs.

So my questions are:

  1. Why would one use one versus the other, since one can perform the exact same operations with both?

  2. Both can perform secondary reads, correct? The documentation says that the advantage of a ReplicaSetClient is that we can do secondary reads, but clearly they are supported in both.

  3. The documentation says that the ReplicaSetClient features "replica set health monitoring." What exactly does that mean? Are there new methods I can invoke which tell me about a replset's health that I cannot otherwise do with MongoClient?

  4. In theory a MongoReplicaSetClient will connect to all members of the replset, rather than just one. This is false: you may munge or omit any of the servers in the connection string, and both MongoClient and MongoReplicaSetClient are still able to connect. Am I missing something?

like image 519
poundifdef Avatar asked Oct 24 '13 00:10

poundifdef


People also ask

What is MongoClient in PyMongo?

Python PyMongo MongoClient allows Developers to establish a connection between their Python application and MongoDB to manage data in a NoSQL Database. Python PyMongo MongoClient makes it easier for Developers to access all the features of the NoSQL Database and build a scalable and flexible Python application.

Is PyMongo synchronous?

pymongo is synchronous unlike its javascript counter part.

Is PyMongo an API?

The MongoDB Query API is purpose-built to handle data of any structure. Quickly query, transform, and analyze data as your schema evolves.


1 Answers

This is was a confusing API choice that we regret in PyMongo 2.x. We will merge all the client classes into MongoClient in PyMongo 3, in April 2015:

http://emptysqua.re/blog/good-idea-at-the-time-pymongo-mongoreplicasetclient/

Meanwhile:

  1. Use MongoReplicaSetClient when you plan to connect to a whole replica set. MongoClient only connects to one member.
  2. A single MongoReplicaSetClient can be used to perform primary or secondary reads, as well as more sophisticated decision-making with read preferences, see my blog post on the subject. A MongoClient will connect to one member of the replica set (the primary) and always read from it, unless you make a direct connection to a secondary using MongoClient, in which case it will always read from that secondary.
  3. MongoReplicaSetClient monitors the set's health with a background thread that periodically checks on all the members. The client tracks whether members are up, it tracks their ping times, and it notices when a member is added. This will reduce the number of exceptions you see on a flaky network or when the replica set's configuration changes, and it allows the client to correctly implement read preferences.
  4. A MongoReplicaSetClient does in fact connect to all members, whereas a MongoClient only connects to one member. MongoReplicaSetClient tries to connect to each member listed in the connection string; as soon as it connects to one it asks that member for a list of all other members. From this point forward it ignores your connection string and uses the list it got from the member it connected to.
like image 102
A. Jesse Jiryu Davis Avatar answered Oct 04 '22 02:10

A. Jesse Jiryu Davis