2013-10-24 11 views
6

Sembra che sia MongoClient sia MongoReplicaSetClient possano connettersi ai set di repliche mongo. In effetti, le loro pagine di documentazione sono quasi identiche - stesse opzioni, stessi metodi, ecc. - tranne che il costruttore di quest'ultimo mi richiede di specificare una replica.pymongo: vantaggio dell'utilizzo di MongoReplicaSetClient?

In entrambi i casi, è possibile specificare una preferenza di lettura. In entrambi i casi, dobbiamo gestire l'eccezione di AutoReconnect se si verifica un passaggio.

Quindi le mie domande sono:

  1. Perché si potrebbe usare uno contro l'altro, dal momento che si può eseguire le stesse operazioni esatte con entrambi?

  2. Entrambi possono eseguire letture secondarie, correggere? La documentazione dice che il vantaggio di un ReplicaSetClient è che possiamo eseguire letture secondarie, ma clearly sono supportate in entrambi.

  3. Il numero documentation indica che ReplicaSetClient dispone di "monitoraggio dello stato delle repliche". Cosa significa esattamente? Ci sono nuovi metodi che posso richiamare che mi dicono della salute di un replset che non posso fare altrimenti con MongoClient?

  4. In theory un MongoReplicaSetClient si connetterà a tutti i membri del replset, piuttosto che a uno solo. Questo è falso: puoi munge o omettere nessuno dei server nella stringa di connessione, e sia MongoClient che MongoReplicaSetClient sono ancora in grado di connettersi. Mi sto perdendo qualcosa?

risposta

9

Questa è stata una scelta API confusa che ci dispiace in PyMongo 2.x. Noi unire tutti le classi client in MongoClient in PyMongo 3, nel mese di aprile 2015:

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

Nel frattempo:

  1. Usa MongoReplicaSetClient quando si prevede di connettersi a un set di repliche intero. MongoClient si connette solo a un membro.
  2. Un singolo oggetto MongoReplicaSetClient può essere utilizzato per eseguire letture primarie o secondarie, nonché un processo decisionale più sofisticato con le preferenze di lettura, vedere my blog post on the subject. Un MongoClient si connetterà a un membro del set di repliche (il primario) e leggerà sempre da esso, a meno che non si effettui una connessione diretta a un secondario utilizzando MongoClient, nel qual caso leggerà sempre da quel secondario.
  3. MongoReplicaSetClient controlla lo stato del set con un thread in background che verifica periodicamente tutti i membri. Il client tiene traccia se i membri sono attivi, tiene traccia dei loro tempi di ping e nota quando viene aggiunto un membro. Ciò ridurrà il numero di eccezioni che si vedono su una rete traballante o quando la configurazione del set di repliche cambia e consente al client di implementare correttamente le preferenze di lettura.
  4. Un MongoReplicaSetClient si collega effettivamente a tutti i membri, mentre un MongoClient si connette solo a un membro. MongoReplicaSetClient tenta di connettersi a ciascun membro elencato nella stringa di connessione; non appena si connette a uno, chiede a quel membro un elenco di tutti gli altri membri. Da questo punto in avanti ignora la stringa di connessione e utilizza l'elenco ricevuto dal membro a cui è connesso.
+1

A proposito, PyMongo 3 unirà MongoClient e MongoReplicaSetClient in una classe chiamata "MongoClient", che terminerà questa situazione confusa. –