Un set di repliche significa che hai più istanze di MongoDB che rispecchiano tutti i dati l'uno dell'altro. Un set di repliche è composto da un Master (chiamato anche "Primario") e uno o più Slaves (aka Secondario). Le operazioni di lettura possono essere servite da qualsiasi slave, quindi è possibile aumentare le prestazioni di lettura aggiungendo più slave al set di repliche (a condizione che l'applicazione client sia effettivamente in grado di utilizzare diversi membri del set). Ma le operazioni di scrittura avvengono sempre sul master del set di repliche e vengono quindi propagate agli slave, quindi le scritture non diventeranno più veloci quando si aggiungono più slave.
I set di repliche offrono anche tolleranza d'errore. Quando uno dei membri del set di repliche scende, gli altri prendono il sopravvento. Quando il padrone scende, gli schiavi eleggeranno un nuovo padrone. Per tale motivo , si consiglia alla distribuzione produttiva di utilizzare sempre MongoDB come set di repliche di almeno tre server, due dei quali contengono dati (il terzo è un "arbitro" privo di dati necessario per determinare un nuovo master quando uno degli schiavi scende).
Un cluster frammentato significa che ogni frammento del cluster (che può anche essere un set di repliche) si occupa di una parte dei dati. Ogni richiesta, sia in lettura che in scrittura, viene servita dal cluster in cui risiedono i dati. Ciò significa che è possibile aumentare le prestazioni di lettura e scrittura aggiungendo più frammenti a un cluster. Quale documento risiede su quale frammento è determinato dalla chiave di frammento di ogni raccolta. Dovrebbe essere scelto in modo che i dati possano essere distribuiti uniformemente su tutti i cluster e in modo che sia chiaro per le query più comuni in cui risiede la chiave di shard (esempio: quando si esegue una query frequente da user_name
, la chiave di shard dovrebbe includere il campo in user_name
modo che ogni query possa essere delegata a un solo frammento che ha quel documento).
Lo svantaggio è che la tolleranza agli errori soffre. Quando un frammento del cluster si abbassa, tutti i dati su di esso sono inaccessibili. Per tale motivo ogni membro del cluster dovrebbe anche essere un set di repliche. Questo non è richiesto Quando non ti interessa l'alta disponibilità, un frammento può anche essere una singola istanza di mongod senza replica . Ma per l'uso in produzione dovresti sempre usare la replica .
Cosa significa questo per il tuo esempio?
Sharded Cluster
/ | \
Shard A Shard B Shard C
/ \ / \ / \
+-------+ +---------+ +-------+ +---------+ +-------+ +---------+
|Primary| |Secondary| |Primary| |Secondary| |Primary| |Secondary|
| 25GB |=| 25GB | | 25 GB |=| 25 GB | | 25GB |=| 25GB |
+-------+ +---------+ +-------+ +---------+ +-------+ +---------+
Quando si desidera dividere i dati di 75 GB in 3 frammenti di 25 GB ciascuno, sono necessari almeno 6 server di database organizzati in tre set di repliche. Ogni set di repliche è composto da due server con gli stessi 25 GB di dati.
Sono necessari anche server per gli arbitri dei tre set di repliche, nonché il router mongos e il server di configurazione per il cluster. Gli arbitri sono molto leggeri e sono necessari solo quando un membro del set di repliche si interrompe, quindi di solito possono condividere lo stesso hardware con qualcos'altro. Ma il router e il server di configurazione Mongos dovrebbero essere ridondanti e sui propri server.