Backup
L'esecuzione di backup è fondamentale per la manutenzione ordinaria del database. Come per tutti i database, il backup è l'operazione di memorizzare una copia dei dati su un altro supporto, allo scopo di averli disponibili per un restore, nell'eventualità di una perdita di dati accidentale, disastro o problemi hardware. Neo4j Enterprise permette diverse opzioni, che vedremo di seguito in dettaglio.
Tipi di backup
La prima distinzione importante è tra backup online e offline. Il backup online, cosiddetto a caldo, è indicato quando il sistema è in produzione e non si vuole interrompere il servizio per effettuare un backup. Il backup offline richiede invece lo spegnimento del database per effettuare il backup.
Neo4j supporta sia il backup in locale, sul server che lo ospita, sia da remoto. In ogni caso, è consigliabile mantenere il file di backup in uno storage a parte, possibilmente dislocato geograficamente in modo da poter ripristinare un database anche in caso di disastro (disaster recovery).
Un'altra distinzione è quella tra backup incrementale e backup full: nel primo caso vengono salvate solamente le modifiche rispetto a quanto già stato sottoposto a backup in precedenza.
Per questo esempio utilizzeremo Neo4j dentro un container Docker. Chi non abbia dimestichezza con Docker e i container, può consultare la nostra guida dedicata a questo argomento.
Per prima cosa lanciamo Neo4j in un nuovo container, utilizzando l'edizione Enterprise:
$ docker run --publish=7474:7474 \
--publish=7687:7687 \
--env=NEO4J_ACCEPT_LICENSE_AGREEMENT=yes \
--name=neo4html \
neo4j:enterprise
Docker scaricherà l'immagine dal repository, aprirà le porte indicate e imposterà una variabile d'ambiente per indicare che l'utente accetta la licenza, quindi avvierà il servizio. A questo punto entriamo nel container con il comando:
$ docker exec -it neo4html bash
Questo comando apre una shell dentro il container appena creato, da cui si può accedere ai tool di Neo4j Enterprise. Per effettuare un backup in Neo4j, si usa il tool neo4j-admin. Il backup viene effettuato su un processo parallelo a quello di esecuzione del servizio, e come già detto può essere fatto da remoto. Il modo più semplice è questo:
$ mkdir /mnt/backup
$ neo4j-admin backup --from=localhost \
--backup-dir=/mnt/backup \
--name=mydatabase.backup
Per prima cosa abbiamo creato una directory che conterrà i backup. Naturalmente possiamo fare il mount in questa cartella su dischi specifici o in cloud. Poi, con il comando neo4j-admin
, abbiamo effettuato un backup online del database in localhost nella directory /mnt/backup e con il nome indicato (mydatabase.backup). La prima volta che eseguiamo il comando, viene eseguito un backup full, perché il tool trova la directory vuota. Le volte successive, invece, poiché verrà trovato un backup preesistente, il tool effettuerà un backup incrementale verificando la consistenza del backup finale.
Restore
Supponiamo, ora, che si sia verificato un problema e sia necessario ripristinare un backup. Questa operazione non può essere effettuata a caldo, bisogna prima fermare il servizio:
$ neo4j stop
Poi dobbiamo effettuare il restore, specificando il nome del file e il nome del database:
$ neo4j-admin restore --force \
--from=/mnt/backup/mydatabase.backup \
--database=mydatabase.backup
Infine riavviamo il database con neo4j start
.
Monitoraggio
Neo4j può essere monitorato in vari modi. In generale, per attivare il monitoraggio è necessario modificare il file di configurazione neo4j.conf. Vediamo subito un esempio:
metrics.prometheus.enabled=true
metrics.prometheus.endpoint=prometheus1:8800
metrics.neo4j.tx.enabled=true
Con questa configurazione stiamo abilitando il monitoraggio su Prometheus, una piattaforma di monitoraggio centralizzata ben nota, anch'essa facilmente utilizzabile in Docker, indicando anche l'endpoint (hostname e porta). Infine, stiamo abilitando il monitoraggio delle transazioni (tx
). Ciò permetterà di monitorare le transazioni aperte, attive, chiuse, in rollback. Con la configurazione seguente, invece, abiliteremo il monitoraggio su file CSV dei thread della Java Virtual Machine usata da Neo4j:
metrics.csv.enabled=true
metrics.csv.interval=10s
metrics.jvm.threads.enabled=true
Per l'elenco delle metriche disponibili rimandiamo alla guida ufficiale.