• redis-introduzione

    Le basi del database NoSQL Redis

    In questo articolo faremo una prima introduzione a Redis, un database NoSQL di strutture dati in memoria.

    Introduzione

    Redis (abbreviazione di REmote DIctionary Server) è un database basato su strutture dati residenti in memoria. Si tratta di un progetto open-source sviluppato dal programmatore Siciliano Salvatore Sanfilippo e sponsorizzato dai Redis Labs.

    Redis supporta diversi tipi di strutture dati: stringhe, liste, mappe, set, set ordinati, hyperloglogs, bitmpap e indici spaziali. Redis è un database ad alta disponibilità, replica e partizionamento automatico.

    Redis è stato scritto in ANSI C, e quindi è particolarmente adatto ai sistemi basati su Unix, come Mac o Linux. Per Windows non c’è una versione ufficiale, ma il Microsoft Open Tech Group ha sviluppato e mantiene un porting per piattaforme Win64.

    Secondo il ranking mensile stilato da DB-Engines, Redis è il database basato su chiave-valore più popolare e tra i primi database NoSQL per quanto riguarda la soddisfazione degli utenti e la presenza sul mercato.

    db-engine-ranking

     

    Tipi di dati disponibili in Redis

    Esaminiamo rapidamente i tipi di dati disponibili in Redis. Le chiavi in Redis sono simili alle chiavi di qualsiasi altro oggetto JavaScript con un approccio chiave-valore.

    redis-strutture-dati

    La chiave è il nome della proprietà, a cui è associato un valore. Il tipo di dati del valore può essere uno dei seguenti:

    • stringhe;
    • liste (elenchi ordinati);
    • hash table;
    • set: (elenchi non ordinate e univoci)
    • set ordinati (elenchi ordinati in base alla chiave definita dall’utente per i valori)

     

    La persistenza in Redis

    Tutte le operazioni in Redis vengono eseguite in memoria e ci sono due opzioni di persistenza: AOF e RDB.

    Con l’opzione AOF (Append-Only File), Redis memorizza ogni operazione nel file system. Quando il server Redis viene riavviato, il database viene ricostruito a partire dal file system. Questo file può crescere in dimensioni molto rapidamente, ma Redis in questo caso utilizza l’ultima versione del set di dati, riducendo il file a dimensioni gestibili.

    L’opzione RDB utilizza delle istantanee dello stato del database in memoria, creando copie dei dati che è possibile recuperare in qualsiasi momento. Quando vengono soddisfatte determinate condizioni (ad esempio dopo un certo tempo, o quando si ha un certo numero di nuovi elementi nei dati), Redis crea un’istantanea dei dati e li scrive in un file RDB. Questa è l’impostazione predefinita quando si installa Redis per la prima volta.

    Conviene utilizzare AOF quando è importante la velocità e la disponibilità, mentre RDB nel caso di disaster recovery. Per configurare l’opzione di persistenza, apri la cartella in cui è installato Redis. Nel mio caso è la directory ~/opt/packages/redis/redis-4.0.8/

    Apri il file redis.conf e cerca la stringa SNAPSHOTTING (riga 196 nel mio caso). Quindi, questa è la sezione in cui c’è la configurazione dell’opzione RDB.

    Il salvataggio dell’istantanea avviene in uno dei seguenti casi:

    • dopo 900 secondi (15 minuti) se è stata modificata almeno una chiave ;
    • dopo 300 secondi (5 minuti) se sono state modificate almeno 10 chiavi;
    • dopo 60 secondi (un minuto) se sono state modificate almeno 10.000 chiavi.

    Queste sono le impostazioni di default e ovviamente possono essere modificate, aggiungendone di nuove o cambiando i valori di quelle esistenti.

    Le impostazioni relative all’opzione AOF . Cerca la stringa “appendonly” nel file redis.conf (riga 672 nel mio caso). Troverai il valore impostato a no. Se vuoi modificarlo, puoi cambiarlo in yes e salvare le modifiche.

    Stoppa il server (dal terminale da cui l’hai avviato, lancia ctrl+c). Riavvia il server indicando il percorso del file di configurazione, come mostrato sotto.

    Verrà creato il file appendonly.aof nella cartella /Users/MobileUp/opt/packages/redis/redis-4.0.8/ che conterrà un log delle transazioni che hanno avuto luogo su Redis.

     

    Replica del database con Redis

    La replica di un database consiste nel copiare i dati da un database in un server ad un altro database in un altro server con una frequenza elevata, così che gli utenti possono accedere alle stesse informazioni su entrambi i server. Redis offre un meccanismo di replica molto semplice, basato sul meccanismo master-slave, in cui il server Redis slave è una copia del server Redis master. Il maccanismo è il seguente:

    • Quando master e slave sono collegati, il master mantiene aggiornato lo slave inviando un flusso di comandi per replicare lo stato master sullo slave.
    • Quando il collegamento tra master e slave si interrompe (per problemi di rete o perché viene rilevato un timeout nel master o nello slave), lo slave si ricollega e tenta di procedere con una risincronizzazione parziale, cioè cercherà di ottenere solo la parte del flusso di comandi che ha perso durante la disconnessione.
    • Quando non è possibile effettuare una risincronizzazione parziale, lo slave chiederà una risincronizzazione completa, che comporta un processo più complesso in cui il master deve creare un’istantanea di tutti i suoi dati, inviarlo allo slave e quindi continuare a inviare il flusso di comandi man mano che i dati cambiano.

     

    Vediamo come lanciare un server Redis slave per la replica del master. Apri la cartella /Users/MobileUp/opt/packages/redis/redis-4.0.8/ e copia il file redis.conf nel file redis-slave.conf. Cerca l’occorrenza della stringa “port 6379” (la porta di default che utilizza il server Redis master) e modificala in “port 6380” (una porta diversa da quella del master per lo slave). Sempre nel file redis-slave.conf cerca la voce “slaveof” e togli il commento (cioè il cancelletto davanti) alla riga # slaveof <masterip> <masterport>, e modificando masterip con 127.0.0.1 e masterport con 6379.

    Infine, cerca la stringa “appendfilename” nel file redis-slave.conf e modificane il valore da “appendonly.aof” a “appendonly-slave.aof”.

    Puoi anche aggiungere un livello di sicurezza ulteriore, impostando una password nel file redis.conf (alla voce requirepass, togliendo il commento e modificando la password) e specificando la stessa password nel file redis-slave.conf (alla voce masterauth, togliendo il commento e impostando la password settata sul file redis.conf). Per la connessione con il client da linea di comando, occorre specificare la password con l’opzione -a seguita dalla password:

    Ricapitolando: il server master sarà in esecuzione sull’indirizzo IP 127.0.0.1, porta 6379; il server slave sarà in esecuzione sull’indirizzo IP 127.0.0.1, porta 6380. A questo punto puoi lanciare i due server. Apri un terminale e digita i seguenti comandi:

    Apri un altro terminale e digita i seguenti comandi:

    I due server sono in esecuzione. Apri un altro terminale e avvia il client da linea di comando:

    A questo punto verifica che alla chiave autore non corrisponde nulla, poi setta il valore di autore a “Giulio Cantali” e infine verifica che tutto sia stato impostato correttamente.

    Infine apri un altro terminale e lancia avvia il client da linea di comando per la connessione al server slave (opzione -p 6380 per specificare la porta del server slave):

    Per verificare che i dati siano stati replicati sul server slave, basta interrogare il database sulla chiave “autore”:

     

     

    Giulio Cantali – IT Consultant

    Creatore di Database Master, il primo percorso per diventare esperti di database

Lascia un commento

Se vuoi condividere la tua opinione, lascia un commento

Puoi usare questi tag e attributi: HTML:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">