Per motivi di sicurezza e ottimizzazione delle prestazioni, i server per database molto spesso lavorano in "gruppo", ed ogni nodo della rete vede installata
una versione del DBMS attiva. Una delle modalità più comuni di tale attività è la replication, in cui un server svolge il ruolo di master
ed uno o più incarnano quello di slave, sincronizzandosi con il primo.
I DBMS NoSQL si sono sempre distinti per la loro "naturale" capacità di interagire in maniera quasi automatica con propri simili nella stessa rete. Redis, come vedremo,
non infrange tale tradizione.
Sperimenteremo direttamente la replication, e tale scopo prepareremo due istanze di Redis che svolgeranno ciascuna un ruolo, in modo da avere un nodo master, ed uno slave. Ognuna di esse sarà riconoscibile da indirizzo IP e porta TCP.
La replication si basa su un file di log AOF, che verrà mantenuto dal server mentre il client potrà farvi accesso:
entrambe le macchine saranno munite di password di autenticazione. Per sperimentare le seguenti configurazioni, possono essere
utilizzate anche due macchine virtuali, purchè riescano reciprocamente a raggiungersi attraverso la rete. A scopo didattico, si possono anche predisporre
due installazioni diverse di Redis sulla stessa macchina, creando due cartelle differenti del progetto e avviandole su due porte TCP diverse.
Preparazione master
La configurazione che assegneremo al master seguirà i seguenti punti, che verranno applicati nel file redis.conf:
- specifichiamo le coordinate di rete che vogliamo assegnare, vale a dire porta TCP e indirizzo IP (andranno personalizzate in base
alla propria rete e preferenze):
bind 192.168.56.3 port 5555
- impostiamo una parola chiave (nel nostro caso la stringa "sonomaster") per rendere sicuro l'accesso:
requirepass sonomaster
- indichiamo che dovrà essere mantenuto un file in formato AOF, quello che
permetterà di condividere i dati da replicare:
appendonly yes appendfilename "master.aof"
A questo punto il master sarà pronto e lo si potrà avviare per provarlo. Una volta collegati mediante redis-cli, potremo provare la configurazione
mediante il comando INFO
, ma dovremo sempre tenere a mente che abbiamo impostato una password; pertanto, sarà necessario autenticarsi con AUTH
:
$ src/redis-cli -p 5555
> AUTH sonomaster
OK
> INFO replication
# Replication
role:master
connected_slaves:0
...
...
Con INFO
abbiamo consultato la sezione "replication" della configurazione attiva e dalle prime due righe dell'output possiamo evincere che il server
è stato riconosciuto come master e che al momento non si ravvisano slave connessi.
Preparazione slave
La preparazione dello slave segue in buona parte i passaggi che abbiamo eseguito per il master:
- anche in questo caso specifichiamo le coordinate di rete da personalizzare nuovamente al momento dell'utilizzo:
bind 192.168.56.4 port 7777
- assegniamo una parola chiave (nel nostro caso la stringa "sonoclient"):
requirepass sonoclient
- infine - tematiche specifiche per questo ruolo - indichiamo quale sarà il master di riferimento e la parola chiave per farvi accesso:
slaveof 192.168.56.3 5555 masterauth sonomaster
All'avvio dello slave, se tutto sarà andato a buon fine, noteremo subito messaggi che avviseranno di una sincronizzazione in corso con il master:
Connecting to MASTER 192.168.56.3:5555
MASTER <-> SLAVE sync started
...
Master replied to PING, replication can continue...
...
...
MASTER <-> SLAVE sync: receiving 175 bytes from master
MASTER <-> SLAVE sync: Flushing old data
...
MASTER <-> SLAVE sync: Finished with success
Analogamente, appena loggati allo slave, potremo verificare la configurazione attivata:
$ src/redis-cli -p 7777
> AUTH sonoclient
OK
> INFO replication
# Replication
role:slave
master_host:192.168.56.3
master_port:5555
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:112
slave_priority:100
slave_read_only:1
...
...
Verifica finale della replication
Per la verifica complessiva, possiamo ricontrollare tramite redis-cli la configurazione del master:
> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.56.4,port=7777,state=online,offset=433,lag=1
...
...
Come notiamo, è stato registrato dal master uno slave connesso, qualificato come "slave0", del quale vengono riportate le coordinate di rete e lo stato
attuale.
Altra prova fondamentale sarà quella da svolgere con i dati. In virtù della replication attivata, dovremo poter inserire informazioni nel master e
leggerli dallo slave. Proviamo. Nella macchina master impartiamo:
> SET nome Replication
OK
> GET nome
"Replication"
e nella macchina slave:
> GET nome
"Replication"
La prova è pertanto riuscita: il valore inserito nel master è stato immediatamente copiato nello slave. D'altro canto, provando ad inserire un valore direttamente
nello slave, verremo bloccati nel seguente modo:
> SET citta Roma
(error) READONLY You can't write against a read only slave.
Anche Redis si è così dimostrato in grado di gestire la replication tra due istanze. La configurazione è stata rapida ed ha richiesto il minimo dei parametri
per gestire riconoscimento reciproco delle macchine e sicurezza dei dati.