Per qualsiasi database, il bilanciamento del carico di tutte le richieste provenienti dai client è un meccanismo importante e fondamentale per garantire la scalabilità. Una corretta soluzione di bilanciamento del carico distribuisce tutte le richieste del client in modo uniforme su tutte le risorse del database. Se il cluster di database non è protetto con una soluzione di bilanciamento del carico adeguata, il tuo database non sarà in grado di gestire l'aumento del carico di traffico su di esso.
Fortunatamente, MongoDB fornisce supporto integrato per il bilanciamento del carico del traffico elevato supportando il ridimensionamento orizzontale tramite lo sharding. Puoi distribuire i dati delle tue raccolte su più server utilizzando lo sharding. Puoi anche aggiungere nuovi server/macchine al tuo cluster per gestire l'aumento del traffico sul database. Puoi seguire questa guida per convertire il tuo cluster di replica MongoDB in un cluster di partizionamento orizzontale.
In questo articolo, impareremo il comportamento del processo di bilanciamento che viene eseguito nei cluster sharded MongoDB e come modificarne il comportamento. Il processo di bilanciamento di MongoDB si occupa di distribuire le tue raccolte in modo uniforme tra gli shard. Ad esempio, se uno shard del tuo cluster contiene troppi blocchi della tua raccolta partizionata, quel particolare shard può ricevere più traffico rispetto ad altri shard. Pertanto, il processo di bilanciamento bilancia correttamente i blocchi di raccolte tra gli shard. Nella maggior parte delle distribuzioni di MongoDB, le configurazioni predefinite del processo di bilanciamento sono sufficienti per le normali operazioni. Tuttavia, in alcune situazioni, gli amministratori di database potrebbero voler modificare il comportamento predefinito di questo processo. Se desideri modificare il comportamento predefinito del processo di bilanciamento per qualsiasi esigenza a livello di applicazione o requisito operativo, puoi seguire questa guida.
Iniziamo con alcuni comandi di base per ottenere alcune informazioni sullo stato e lo stato del processo del bilanciatore.
Stato stato bilanciatore
Questo comando controlla se il bilanciatore è abilitato o autorizzato all'esecuzione o meno. Se il processo di bilanciamento non è in esecuzione, questo comando restituirà false. Questo non verificherà se il processo di bilanciamento è in esecuzione o meno.
sh.getBalancerState()
Abilita il processo di bilanciamento
Se il bilanciatore non è abilitato per impostazione predefinita, puoi abilitarlo eseguendo il comando seguente. Questo comando non avvierà il processo di bilanciamento, ma abiliterà il processo e garantisce che il bilanciamento dei blocchi non venga bloccato alla successiva esecuzione del processo di bilanciamento.
sh.enableBalancing(<collection_name/namespace>)
Disabilita il processo di bilanciamento
Il processo di bilanciamento viene eseguito in qualsiasi momento per impostazione predefinita. Pertanto, se desideri disabilitare il processo di bilanciamento per un determinato periodo di tempo, puoi utilizzare il comando seguente. Uno scenario ideale per utilizzare questo comando è quando si esegue un backup del database.
sh.stopBalancer()
Assicurati che il processo di bilanciamento sia interrotto prima di eseguire il backup. Se il processo è abilitato durante l'esecuzione del backup del database, potresti ritrovarti con una replica incoerente del tuo database. Ciò può verificarsi quando il processo di bilanciamento sposta alcuni blocchi tra gli shard per il bilanciamento del carico durante il processo di backup.
Puoi anche disabilitare il bilanciamento su alcune collezioni specifiche fornendo lo spazio dei nomi completo di una collezione come parametro usando il comando seguente.
sh.disableBalancing("<db_name>.<collection_name>")
Stato di funzionamento del bilanciatore
Questo comando controlla se il processo di bilanciamento è in esecuzione o meno. Verifica anche se sta gestendo attivamente i blocchi di partizionamento orizzontale o meno. Restituisce true se il processo è in esecuzione, altrimenti restituisce false.
sh.isBalancerRunning()
Configurazioni di dimensioni Chunk predefinite
Per impostazione predefinita, la dimensione del blocco in qualsiasi cluster sharded MongoDB è 64 MB. Per la maggior parte degli scenari, questo è abbastanza buono per migrare o dividere i blocchi partizionati. Tuttavia, a volte il normale processo di migrazione non coinvolge più operazioni di I/O di quante ne possa elaborare l'hardware. In questi tipi di situazioni, potresti voler ridurre le dimensioni dei blocchi. Puoi farlo eseguendo il seguente set di comandi.
use config
db.settings.save( { _id:"chunksize", value: <sizeInMB> } )
Se modifichi la dimensione predefinita del blocco nel cluster partizionato, tieni a mente quanto segue
- Puoi specificare la dimensione del blocco solo tra 1 e 1024 MB
- La divisione automatica avverrà solo all'inserimento o all'aggiornamento
- Le dimensioni dei blocchi inferiori porteranno a più tempo durante il processo di divisione.
Programma il bilanciamento per un'ora specifica
Quando le dimensioni del database sono enormi, i processi di bilanciamento o migrazione possono influire sulle prestazioni complessive del database. Pertanto, è consigliabile pianificare il processo di bilanciamento durante un intervallo di tempo specifico quando il carico sul database è molto inferiore. Puoi utilizzare i seguenti comandi per impostare l'intervallo di tempo per l'esecuzione del processo di bilanciamento.
use config
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } }, true )
Esempio
Il comando seguente imposterà l'intervallo di tempo dall'1:00 alle 5:00 per l'esecuzione del processo di bilanciamento.
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "01:00", stop : "05:00" } } }, true )
Assicurati che il periodo di tempo indicato sia sufficiente per un processo di bilanciamento completo.
Puoi anche rimuovere qualsiasi finestra temporale del processo di bilanciamento esistente eseguendo il comando seguente.
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })
Oltre ai comandi precedenti, puoi anche modificare il comportamento di replica mentre esegui il processo di migrazione dei blocchi utilizzando il parametro _secondaryThrottle. Inoltre, puoi utilizzare la proprietà _waitForDelete con il comando moveChunk per indicare al processo di bilanciamento di attendere la fase di eliminazione della migrazione corrente prima di iniziare con la nuova fase di migrazione dei blocchi.
Conclusione
Si spera che questo sia tutto ciò di cui hai bisogno mentre modifichi il comportamento predefinito del processo di bilanciamento di MongoDB. Il bilanciamento è un aspetto molto importante di qualsiasi cluster partizionato MongoDB. Quindi, se conosci in dettaglio il processo di bilanciamento, diventa molto facile modificare il comportamento predefinito del processo di bilanciamento in base alle tue esigenze e casi d'uso.