Differenza tra frammentazione e replica su MongoDB


77

Sono solo confuso riguardo allo Sharding e alla replica sul modo in cui funzionano ... Secondo la definizione

Replica: un set di repliche in MongoDB è un gruppo di processi mongod che mantengono lo stesso set di dati.

Frammentazione: la scheggiatura è un metodo per l'archiviazione di dati su più macchine.

Secondo la mia comprensione se ci sono dati di 75 GB, quindi per replica (3 server), memorizzerà i dati di 75 GB su ogni server significa 75 GB su Server-1, 75 GB su server-2 e 75 GB su server-3 .. (correggimi se sbaglio) .. e partizionando verranno archiviati come dati da 25 GB sul server-1, dati da 25Gb sul server-2 e dati da 25 GB sul server-3. (Giusto?) ... ma poi ho incontrato questa riga in il tutorial

I frammenti memorizzano i dati. Per fornire elevata disponibilità e coerenza dei dati, in un cluster suddiviso in produzione, ogni frammento è un set di repliche

Poiché il set di repliche è di 75 GB ma il frammento di 25 GB, allora come possono essere equivalenti ... questo mi fa confondere molto ... Penso che mi manchi qualcosa di eccezionale in questo. Per favore, aiutatemi in questo.

Risposte:


111

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_namemodo 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.


2
Grazie mille per la risposta dettagliata ... un'altra domanda ... se il primario è inattivo mentre è in corso un'operazione di scrittura o lettura ... 1) qual è il ritardo nella selezione del primario dai secondari e 2) durante tale ritardo, dove saranno archiviati temporaneamente i dati?
Saad Saadi,

4
@SaadSaadi Il processo elettorale principale è descritto nella documentazione . I secondari impiegano tra 10 e 12 secondi per notare che il primario è inattivo. Le stesse elezioni primarie di solito dureranno solo millisecondi. Il set di repliche è di sola lettura mentre non è presente alcun primario. Qualsiasi tentativo da parte delle applicazioni di scrivere dati durante questo periodo non andrà a buon fine.
Philipp,

1
@Philipp: Solo due commenti: (1) la chiave di shard non può essere modificata (cioè non puoi shard usando una chiave diversa) e (2) puoi leggere dai nodi secondari del set di repliche ma la coerenza dipende dalla preoccupazione di scrittura (in per essere coerente, l'opzione w dovrebbe essere uguale al set di repliche sth che non è praticabile poiché ogni frammento può avere deliberatamente diverse dimensioni del set di repliche o a causa di guasti del nodo).
Mike Argyriou,

@Philipp puoi rispondere a ulteriori domande di follow-up su dba.stackexchange.com/questions/208482/… ?
user3198603

18
  • La frammentazione suddivide il set di dati in parti discrete.
  • La replica duplica il set di dati.

Queste due cose possono impilarsi poiché sono diverse. L'uso di entrambi significa che dividerai il tuo set di dati su più gruppi di repliche. Detto in altro modo, replicare frammenti; un set di dati senza frammenti è un singolo "frammento".

Un cluster Mongo con tre frammenti e 3 repliche avrebbe 9 nodi.

  • 3 set di repliche a 3 nodi.
  • Ogni set di repliche contiene un singolo frammento.

Per un file di grandi dimensioni, è memorizzato in un frammento o in più frammenti (quindi attraverso i nodi)?
Tony,

Nota che in MongoDB 3.4 o versioni successive, avrai bisogno anche di server mongoDB per la configurazione e di un server aggiuntivo che funga da router mongos. Ciò porta il totale del cluster 3x3 nell'esempio a un totale di 13 server.
Dthrasher,

9

Con lo sharding , hai diviso la tua collezione in più parti.
Replicare il database significa creare mirror del set di dati.


4

In termini di funzionalità fornita. Il coccio fornisce scalabilità e parallelismo. La replica fornisce disponibilità


no, la replica fornisce solo scalabilità e parallelismo dato che le letture sono molto più frequenti delle scritture
Kristóf Szalay
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.