In questa lezione vedremo come impostare le configurazioni più utili per il setup del database, e quelle più importanti per il tuning.
Setup
Il file di configurazione di Neo4j si chiama neo4j.conf. La sua posizione dipende dal sistema operativo. Su Windows, si trova nella stessa posizione degli altri file (Generalmente in C:\Program files\Neo4j\), mentre in Linux può essere o in /etc/neo4j/neo4j.conf oppure in neo4j-home/conf/neo4j.conf. Nel caso della Docker image ufficiale, lo troviamo in /var/lib/neo4j/conf.
Modificando questo file, possiamo accedere ad impostazioni importanti relative a sicurezza e performance. Ad esempio, per abilitare HTTPS dovremo specificare:
dbms.connector.https.enabled=true
Con questa impostazione, potremo ora accedere tramite browser utilizzando l'URL https://localhost:7473, metodo ovviamente più raccomandabile rispetto ad HTTP. Purtroppo non si può disabilitare del tutto la porta HTTP, per cui bisogna farlo in un altro modo, ad esempio con il firewall (per Docker è sufficiente non pubblicare la porta con il comando publish).
Un'altra impostazione utile è quella che permette di cambiare la porta usata, utile quando si desidera installare più di una istanza di Neo4j nello stesso sistema:
dbms.connector.https.listen_address=0.0.0.0:443
Sempre al fine di incrementare il livello di sicurezza, si può usare un certificato rilasciato da una CA, configurando opportunamente il sistema:
dbms.ssl.policy.legacy.base_directory=certificates
dbms.ssl.policy.legacy.private_key=myCert.key
dbms.ssl.policy.legacy.public_certificate=myOrganization.cert
dbms.ssl.policy.legacy.allow_key_generation=false
dbms.ssl.policy.legacy.client_auth=NONE
Qui abbiamo impostato:
- la directory usata per i certificati e gli altri file;
- il nome del file della chiave privata;
- il nome del file contenente il certificato pubblico;
- una configurazione per evitare che Neo4j generi dei certificati autofirmati e per disabilitare l'autenticazione del client, nel caso di connessione tra servers. Un'opzione alternativa è rappresentata dall'uso di
REQUIRED
, che rende obbligatorio specificare la posizione dei certificati X.509 necessari per autenticare i client.
Sempre modificando questo file, è inoltre possibile configurare un cluster, come vedremo nella prossima lezione.
Tuning
Per rendere effettiva ogni modifica del file, sarà necessario riavviare Neo4j. Tuttavia, per alcune configurazioni, nella Enterprise Edition è possibile cambiare le impostazioni a runtime, con un comando specifico:
CALL dbms.setConfigValue(impostazione, valore)
Ad esempio, se monitorando il database si nota che esso viene usato per transazioni lunghe che rallentano tutto il sistema, oppure se semplicemente si vuole evitare che un utente lanci troppe query pesanti, bloccando di conseguenza il server, si può impostare un timeout di esecuzione delle transazioni (che per default non è impostato):
CALL dbms.setConfigValue("dbms.transaction.timeout", "30s")
Possiamo fare la stessa cosa tramite file:
dbms.transaction.timeout=30s
Configurazione della memoria
Neo4j usa tre aree di memoria:
- Memoria del processo, ovvero quella fornita dal sistema operativo;
- Cache, usata per velocizzare il caricamento di grafi e indici;
- Heap, usato per tutto il resto: esecuzione di query, transazioni, ecc.
Sul primo punto non si può fare molto per configurare la massima RAM occupata. Per gli altri due, invece, è possibile applicare delle configurazioni specifiche. Ad esempio, per impostare la RAM occupata dalla cache a 2 GB, possiamo usare la direttiva seguente:
dbms.memory.pagecache.size=2g
Invece, per intervenire sull'heap impostandolo a 4GB, e preallocando tutto lo spazio necessario, usiamo quanto segue:
dbms.memory.heap.initial_size=4g
dbms.memory.heap.max_size=4g
L'applicazione console neo4j-admin è molto utile perché è in grado di dare una stima delle configurazioni necessarie allo stato attuale. Basta invocare il comando seguente:
$ neo4j-admin memrec
Il risultato sarà di questo tipo:
dbms.memory.heap.initial_size=3000m
dbms.memory.heap.max_size=3000m
dbms.memory.pagecache.size=988m
Altra configurazione utile è quella relativa al pool di thread in ascolto sulla porta di Bolt. Ovviamente, ha senso aumentare questo valore se la domanda del numero di utenti e transazioni è più grande di quanto il servizio riesca ad erogare. Per farlo, usiamo le impostazioni seguenti:
dbms.connector.bolt.thread_pool_min_size=20
dbms.connector.bolt.thread_pool_max_size=80
dbms.connector.bolt.thread_pool_keep_alive=10m