Il bilanciamento del carico del database distribuisce le richieste client simultanee a più server di database per ridurre la quantità di carico su ogni singolo server. Ciò può migliorare drasticamente le prestazioni del database. Fortunatamente, MongoDB può gestire le richieste di più client di leggere e scrivere gli stessi dati contemporaneamente per impostazione predefinita. Utilizza alcuni meccanismi di controllo della concorrenza e protocolli di blocco per garantire la coerenza dei dati in ogni momento.
In questo modo, MongoDB garantisce anche che tutti i client ottengano una visualizzazione coerente dei dati in qualsiasi momento. Grazie a questa funzionalità integrata di gestione delle richieste da più client, non devi preoccuparti di aggiungere un sistema di bilanciamento del carico esterno sopra i tuoi server MongoDB. Tuttavia, se desideri comunque migliorare le prestazioni del tuo database utilizzando il bilanciamento del carico, ecco alcuni modi per ottenerlo.
Ridimensionamento verticale MongoDB
In parole povere, il ridimensionamento verticale significa aggiungere più risorse al tuo server da gestire per caricare. Come tutti i sistemi di database, MongoDB preferisce più RAM e capacità IO. Questo è il modo più semplice per aumentare le prestazioni di MongoDB senza distribuire il carico su più server. Il ridimensionamento verticale del database MongoDB include in genere l'aumento della capacità della CPU o del disco e l'aumento del throughput (operazioni di I/O). Aggiungendo più risorse, il tuo server mongo diventa più capace di gestire le richieste di più clienti. Pertanto, un migliore bilanciamento del carico per il tuo database.
Lo svantaggio dell'utilizzo di questo approccio è la limitazione tecnica dell'aggiunta di risorse a un singolo sistema. Inoltre, tutti i fornitori di servizi cloud hanno le limitazioni sull'aggiunta di nuove configurazioni hardware. L'altro svantaggio di questo approccio è un singolo punto di errore. Con questo approccio, tutti i tuoi dati vengono archiviati in un unico sistema, il che può portare alla perdita permanente dei tuoi dati.
Ridimensionamento orizzontale MongoDB
Il ridimensionamento orizzontale si riferisce alla divisione del database in blocchi e all'archiviazione su più server. Il vantaggio principale di questo approccio è che puoi aggiungere server aggiuntivi al volo per aumentare le prestazioni del tuo database senza tempi di inattività. MongoDB fornisce il ridimensionamento orizzontale tramite lo sharding. Lo sharding di MongoDB offre capacità aggiuntiva per distribuire il carico di scrittura su più server (shard). Qui, ogni shard può essere visto come un database indipendente e la raccolta di tutti gli shard può essere vista come un grande database logico. Lo sharding consente a MongoDB di distribuire i dati su più server per gestire in modo efficiente le richieste simultanee dei client. Quindi, aumenta la velocità effettiva di lettura e scrittura del database.
Sharding MongoDB
Uno shard può essere una singola istanza mongod o un set di repliche che contiene il sottoinsieme del database suddiviso in mongo. Puoi convertire lo shard in un set di repliche per garantire un'elevata disponibilità di dati e ridondanza.
Come puoi vedere nell'immagine sopra, lo shard 1 contiene un sottoinsieme di raccolta 1 e intera raccolta2, mentre lo shard 2 contiene solo un altro sottoinsieme di raccolta1. Puoi accedere a ogni shard usando l'istanza mongos. Ad esempio, se ti connetti all'istanza shard1, sarai in grado di vedere/accedere solo a un sottoinsieme di collection1.
Mongo
Mongos è il router di query che fornisce l'accesso al cluster frammentato per le applicazioni client. Puoi avere più istanze mongos per un migliore bilanciamento del carico. Ad esempio, nel tuo cluster di produzione, puoi avere un'istanza mongos per ogni server delle applicazioni. Ora qui puoi utilizzare un sistema di bilanciamento del carico esterno, che reindirizzerà la richiesta del tuo server delle applicazioni all'istanza mongos appropriata. Durante l'aggiunta di tali configurazioni al server di produzione, assicurati che la connessione da qualsiasi client si connetta sempre alla stessa istanza mongos ogni volta che alcune risorse mongo come i cursori sono specifiche dell'istanza mongos.
Configura server
I server di configurazione memorizzano le impostazioni di configurazione e i metadati sul tuo cluster. Da MongoDB versione 3.4, devi distribuire i server di configurazione come set di repliche. Se stai abilitando lo sharding in un ambiente di produzione, è obbligatorio utilizzare tre server di configurazione separati, ciascuno su macchine diverse.
Puoi seguire questa guida per convertire il cluster del set di repliche in un cluster partizionato. Ecco l'illustrazione di esempio del cluster di produzione partizionato:
Bilanciamento del carico MongoDB utilizzando la replica
A volte la replica MongoDB può essere utilizzata per gestire più traffico dai client e per ridurre il carico sul server primario. Per fare ciò, puoi indicare ai client di leggere dai server secondari anziché dal server primario. Ciò può ridurre la quantità di carico sul server primario poiché tutte le richieste di lettura provenienti dai client verranno gestite dai server secondari e il server primario si occuperà solo delle richieste di scrittura.
Di seguito è riportato il comando per impostare la preferenza di lettura su secondaria:
db.getMongo().setReadPref('secondary')
Puoi anche specificare alcuni tag da indirizzare a secondari specifici durante la gestione delle query di lettura.
db.getMongo().setReadPref(
"secondary", [
{ "datacenter": "APAC" },
{ "region": "East"},
{}
])
Qui, MongoDB proverà a trovare il nodo secondario con il valore del tag del datacenter come APAC. Se trovato, Mongo servirà le richieste di lettura da tutti i secondari con tag datacenter:"APAC". Se non viene trovato, Mongo proverà a trovare i secondari con il tag regione:"Est". Se non vengono ancora trovate secondarie, {} funzionerà come caso predefinito e Mongo gestirà le richieste di tutte le secondarie idonee.
Tuttavia, non è consigliabile utilizzare questo approccio per il bilanciamento del carico per aumentare il throughput di lettura. Perché qualsiasi modalità di preferenza di lettura diversa da quella primaria può restituire i vecchi dati in caso di recenti aggiornamenti di scrittura sul server primario. Di solito, il server primario impiega del tempo per gestire le richieste di scrittura e propaga le modifiche ai server secondari. Durante questo periodo, se qualcuno richiede un'operazione di lettura sugli stessi dati, il server secondario restituirà dati obsoleti poiché non sono sincronizzati con il server primario. Puoi utilizzare questo approccio se la tua applicazione ha operazioni di lettura pesanti rispetto alle operazioni di scrittura.
Conclusione
Poiché MongoDB può gestire le richieste simultanee da solo, non è necessario aggiungere un sistema di bilanciamento del carico nel tuo cluster MongoDB. Per il bilanciamento del carico delle richieste del client, puoi scegliere il ridimensionamento verticale o il ridimensionamento orizzontale in quanto non è consigliabile utilizzare secondari per ridimensionare le operazioni di lettura e scrittura. Il ridimensionamento verticale può raggiungere i limiti tecnici, come discusso sopra. Pertanto, è adatto per applicazioni su piccola scala. Per le grandi applicazioni, il ridimensionamento orizzontale tramite sharding è l'approccio migliore per bilanciare il carico delle operazioni di lettura e scrittura.