Monitorare un database è molto importante per sapere cosa sta succedendo in un dato momento nel sistema, e quindi capire il prima possibile se si verificheranno dei problemi. Può essere utile anche per capire cosa bisogna fare per migliorare le performance. Nella prossima lezione ci occuperemo proprio di quest'ultimo aspetto, mentre in questa lezione introdurremo alcuni strumenti che permettono di monitorare un database o un cluster MongoDB.
MongoDB HTTP interface
Il primo strumento che vediamo in azione viene fornito con MongoDB e anzi ne è parte integrante. Si tratta di un insieme di semplici pagine HTML che generate da un web server incorporato nel servizio mongod. Per avviarlo è necessario utilizzare la riga di comando seguente:
mongod --dbpath mongodata --httpinterface
Una volta avviato il server viene stampato un messaggio simile al seguente:
[websvr] admin web console waiting for connections on port 28017
Adesso possiamo richiedere via browser l'IP locale sulla porta sopra indicata (si tratta in genere della porta del server, di default 27017 più 1000). Quindi andiamo su http://localhost:28017/, e visualizzeremo una pagina web simile alla seguente:
Questa pagina ci offre una serie di informazioni utili. Alcune riguardano la configurazione del server: la versione di MongoDB, il sistema operativo, l’architettura della macchina, da quanto tempo MongoDB è acceso, se è attivo un Replica Set (sezione overview).
Segue quindi un elenco molto interessante (sezione client) che ci dice quali connessioni sono attive su questo database, ognuna con i relativi IP (colonna client). Dove si vede solo la porta si intende che il client è un sevizio interno dello stesso server. Nella colonna Query vediamo l’ultima istruzione eseguita dal client. Le colonne Locking e Waiting sono molto importanti, la prima perché ci dice se il client ha un lock attivo, mentre la seconda ci informa che il client è bloccato in attesa di acquisire un lock. MongoDB, infatti, utilizza i lock in lettura e in scrittura per gestire la concorrenza tra i client: se un client acquisisce il lock in scrittura (write lock) su un database, nessun altro lock, né in lettura (read lock) né in scrittura può essere acquisito finché non viene rilasciato. Al contrario, diversi read lock possono essere acquisiti contemporaneamente. Tutto ciò è ovviamente del tutto trasparente per i client, che acquisiscono e rilasciano i lock quando effettuano le query. Può succedere però che, per qualche problema, infrastrutturale o semplicemente perché un client sta effettuando una lunga operazione, un write lock possa protrarsi per un tempo troppo lungo, bloccando di fatto gli altri client.
Bloccare un’operazione
Una volta individuato un client, se ne può bloccare l’operazione utilizzando il comando db.killOp
e passando come parametro l’id dell’operazione (colonna OpId):
> db.killOp(1328)
Bisogna fare molta attenzione con questo comando, perché per errore (utilizzando degli OpId errati) potrebbero essere erroneamente bloccate alcune operazioni di sistema.
La sezione dbtop mostra le statistiche sull’uso degli indici dei database. Per ogni tipo di operazione (lettura, scrittura, ...) vengono mostrati i numeri assoluti e percentuali.
Mongostat e mongotop
Per monitorare il sistema in tempo reale si possono utilizzare due applicazioni di console fornite con l’installazione di MongoDB: mongostat e mongotop. Entrambe restituiscono i dati in forma tabellare a intervalli di tempo regolari. La prima fornisce le informazioni sull’uso dei database e permette di capire quanto un database è usato rispetto agli altri, quindi ci fornisce indicazioni utili per capire se è necessario passare in sharding, se è meglio aggiungere altre repliche, etc... La seconda utility, mongotop, ci fornisce informazioni sul tempo impiegato da MongoDB in lettura e scrittura.
Lo strumento mongostat fornisce molte informazioni: oltre all’uso per ogni operazione (lettura, scrittura, inserimenti, avanzamenti dei cursori, etc...), consente di ottenere anche il numero di client che sono in coda e attendono a causa di un lock. Con mongotop, invece, vediamo fondamentalmente l’impatto delle operazioni sul disco fisso, tramite cui possiamo sapere se dobbiamo intervenire sull’organizzazione dei file oppure se è opportuno aggiungere uno shard per ridurre il carico delle scritture sul singolo nodo.
Comandi
MongoDB fornisce una serie di comandi che possono essere lanciati direttamente dalla console mongo per monitorare il sistema.
Il comando più semplice per sapere quali operazioni sono in corso è db.currentOp
. In figura 3 vediamo due esempi di output:
Nel primo caso vediamo un’operazione in esecuzione di inserimento sul database test da 4 microsecondi, che ha due lock. L’utilità di questa funzione è che possiamo identificare operazioni troppo lunghe che stanno rallentando il sistema, e magari bloccarle con killOp come abbiamo visto sopra.
Altri comandi utili sono:
-
db.stats
, che restituisce lo stato del server relativamente allo storage: numero di oggetti salvati, quantità di spazio occupato in MegaByte, numero di files usati, etc...; -
sh.status
, a cui abbiamo accennato nella precedente lezione, che mostra lo stato dello sharding. In particolare, ci fa vedere come sono distribuiti gli oggetti delle collezioni tra shard. e quindi se il carico è bilanciato; -
rs.status
, che abbiamo visto nella lezione sull’alta affidabilità, ci da un ragguaglio sullo stato delle repliche. Utile per capire se qualche replica è in errore; -
db.serverStatus
fornisce moltissime informazioni: stato dei database, lock in corso, uso della memoria, numero di connessioni, uso della rete, una statistica delle operazioni effettuate, etc...
Strumenti di terze parti
Esistono diversi strumenti e servizi di terze parti, gratuiti e a pagamento, che forniscono non tanto informazioni più dettagliate, ma un output più leggibile e di immediata comprensione. Alcuni sono in hosting, altri si possono installare. Ne segnaliamo alcuni:
- MMS: è un servizio di hosting di database MongoDB che fornisce un supporto avanzato di Monitoring;
- Scout: è un servizio online di monitoraggio per server, tramite due plugin permette di monitorare anche un database MongoDB. Per ulteriori informazioni rimandiamo a questo post del blog ufficiale del servizio;
- ServerDensity: è un servizio simile e fornisce una dashboard molto ricca, che offre una visualizzazione molto completa e chiara dei dati, grazie anche ad alcuni grafici autoesplicativi;
- per restare in ambito open source e gratuito, Nagios è uno strumento web per Apache molto utilizzato in ambito IT per il monitoraggio delle infrastrutture, ed ha un’attiva community che realizza molti plug-in. Uno di questi è nagios-plugin-mongodb, che colleziona una serie di indicatori e ne permette il monitoraggio.