Scaling Redis: Guida alla configurazione di un Cluster Redis

Scopri come configurare e gestire un Cluster Redis per l'alta disponibilità e lo scaling orizzontale. Questa guida passo-passo copre l'installazione, la configurazione di nodi Redis multipli, la creazione del cluster tramite redis-trib.rb, l'aggiunta di repliche per la tolleranza ai guasti e i comandi di gestione essenziali. Lettura essenziale per scalare il tuo deployment Redis.

85 visualizzazioni

Scalare Redis: Guida all'Impostazione di Redis Cluster

Redis, un potente store di strutture dati in memoria, è ampiamente utilizzato come database, cache e message broker. Sebbene una singola istanza Redis possa gestire un carico significativo, molte applicazioni richiedono alla fine maggiore disponibilità e la capacità di scalare orizzontalmente per accomodare volumi di dati e traffico crescenti. Redis Cluster fornisce una soluzione nativa per raggiungere entrambi questi obiettivi.

Questa guida ti accompagnerà attraverso il processo di impostazione, configurazione e gestione di un Redis Cluster. Copriremo i concetti fondamentali, forniremo istruzioni passo-passo per l'installazione e la configurazione, e discuteremo le attività di gestione essenziali per garantire che il tuo cluster rimanga robusto e performante.

Comprensione dei Concetti di Redis Cluster

Prima di addentrarci nell'impostazione, è cruciale comprendere i concetti chiave che sottendono Redis Cluster:

  • Sharding (Partizionamento): Redis Cluster partiziona il tuo set di dati su più nodi Redis. Ogni nodo è responsabile di un sottoinsieme degli hash slot (16384 in totale). Quando un client necessita di accedere a una chiave, la libreria client calcola a quale hash slot appartiene la chiave e indirizza la richiesta al nodo appropriato.
  • Replicazione: Per un'elevata disponibilità, ogni nodo primario nel cluster può avere uno o più nodi replica. Se un nodo primario fallisce, una delle sue repliche può essere promossa per prendere il suo posto, minimizzando i tempi di inattività.
  • Protocollo Gossip: I nodi Redis Cluster comunicano tra loro utilizzando un protocollo gossip. Questo consente ai nodi di scoprirsi a vicenda, scambiare informazioni sul loro stato e rilevare fallimenti.
  • Consenso: Quando un nodo primario fallisce, il cluster necessita di raggiungere un consenso tra i nodi primari rimanenti per eleggere un nuovo primario tra le sue repliche. Questo processo garantisce che il cluster rimanga operativo.

Prerequisiti

Per impostare un Redis Cluster, avrai bisogno di:

  • Server o macchine virtuali multipli (si raccomandano almeno 6 nodi per una configurazione pronta per la produzione: 3 primari e 3 repliche).
  • Redis installato su ciascun server. Assicurati di utilizzare la versione 3.0 o successiva di Redis.
  • Connettività di rete tra tutti i nodi. I nodi devono essere in grado di comunicare tra loro sulla loro porta client e sulla porta del cluster bus (porta client + 10000).
  • redis-cli, l'interfaccia a riga di comando di Redis, che include lo script redis-trib.rb per la creazione del cluster.

Impostazione di un Redis Cluster: Passo-Passo

Questa sezione fornisce una guida pratica, passo-passo, per creare un Redis Cluster di base. Per semplicità, assumeremo che tu stia impostando un cluster su una singola macchina utilizzando porte diverse per ogni nodo. In un ambiente di produzione, distribuiresti tipicamente questi nodi su diverse macchine fisiche o virtuali.

1. Installare Redis

Se Redis non è già installato, segui la guida ufficiale di installazione di Redis per il tuo sistema operativo. Ad esempio, su Debian/Ubuntu:

sudo apt update
sudo apt install redis-server

2. Configurare le Istanze Redis per la Modalità Cluster

Per ogni nodo del tuo cluster, necessiti di un file di configurazione Redis separato. Crea directory per ogni nodo e copia il file redis.conf di default.

Supponiamo di impostare un cluster primario a 3 nodi senza repliche per questa configurazione iniziale. Utilizzeremo le porte 7000, 7001 e 7002.

# Crea directory per ogni nodo
mkdir cluster
cd cluster
mkdir 7000 7001 7002

# Copia redis.conf in ogni directory
cp /etc/redis/redis.conf ./7000/
cp /etc/redis/redis.conf ./7001/
cp /etc/redis/redis.conf ./7002/

Ora, modifica il file di configurazione per ogni nodo. Per 7000/redis.conf, 7001/redis.conf e 7002/redis.conf, effettua le seguenti modifiche:

  • port 700X (dove X è 0, 1 o 2)
  • cluster-enabled yes
  • cluster-config-file nodes-700X.conf (Questo file è gestito da Redis stesso e non dovrebbe essere modificato manualmente. Memorizza lo stato del cluster.)
  • cluster-node-timeout 5000 (Timeout consigliato in millisecondi per considerare un nodo in errore.)
  • appendonly yes (Consigliato per la durabilità dei dati, specialmente in produzione)

Esempio per 7000/redis.conf:

port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
# Assicurati che bind sia impostato su 0.0.0.0 o sull'IP corretto se in esecuzione su una macchina remota
bind 0.0.0.0

Ripeti queste modifiche per 7001/redis.conf (porta 7001) e 7002/redis.conf (porta 7002).

3. Avviare le Istanze Redis

Avvia ogni istanza Redis utilizzando il suo specifico file di configurazione:

redis-server ./7000/redis.conf
redis-server ./7001/redis.conf
redis-server ./7002/redis.conf

Se hai Redis in esecuzione come servizio, potresti dover interrompere l'istanza predefinita (sudo systemctl stop redis-server) e avviarle manualmente come mostrato sopra, o configurare più file di servizio.

4. Creare il Cluster utilizzando redis-trib.rb

Lo script redis-trib.rb è una gemma Ruby che aiuta ad automatizzare la creazione di un Redis Cluster. È incluso nelle distribuzioni Redis.

Naviga nella directory in cui si trova redis-trib.rb (spesso in /usr/share/redis/ o potresti doverlo trovare all'interno della tua installazione Redis). Potrebbe essere necessario installare Ruby se non è presente (sudo apt install ruby-full).

Esegui lo script per creare un cluster con 3 nodi master:

# Assicurati di essere nella directory cluster o fornisci percorsi completi
# ruby /path/to/redis/src/redis-trib.rb create --replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002

# Oppure se redis-trib.rb è nel tuo PATH
redis-trib.rb create --replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002

Questo comando:
* create: Dice a redis-trib.rb di creare un nuovo cluster.
* --replicas 0: Specifica che vogliamo 0 repliche per master. Per una configurazione di produzione, useresti --replicas 1 (o più).
* 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002: Elenca i nodi che parteciperanno al cluster.

Lo script chiederà conferma. Digita yes per procedere. Assegnerà quindi gli hash slot a ciascun nodo master e configurerà il cluster.

5. Verificare il Cluster

Dopo che redis-trib.rb ha finito, puoi connetterti a qualsiasi nodo e controllare lo stato del cluster:

redis-cli -c -p 7000
CLUSTER INFO
CLUSTER NODES

Il comando CLUSTER INFO dovrebbe mostrare cluster_state:ok. Il comando CLUSTER NODES elencherà tutti i nodi nel cluster, i loro ruoli e gli slot assegnati.

Suggerimento: Usa il flag -c con redis-cli (redis-cli -c) per abilitare la modalità cluster. Questo consente a redis-cli di reindirizzare automaticamente i comandi al nodo corretto quando è necessaria una migrazione o un reindirizzamento di hash slot.

Aggiungere Repliche a un Cluster Esistente

Per un'elevata disponibilità, dovresti aggiungere repliche. Aggiungiamo una replica per il nodo sulla porta 7000 (master) sulla porta 7003.

  1. Configurare il nuovo nodo: Crea una nuova directory (es. cluster/7003), copia redis.conf e aggiornala per la porta 7003, abilitando la modalità cluster e impostando il cluster-config-file.
    ini port 7003 cluster-enabled yes cluster-config-file nodes-7003.conf cluster-node-timeout 5000 appendonly yes bind 0.0.0.0
  2. Avviare il nuovo nodo: redis-server ./7003/redis.conf
  3. Aggiungere la replica utilizzando redis-trib.rb: Connettiti al tuo cluster esistente usando redis-cli -c -p 7000 e usa il comando CLUSTER REPLICATE oppure usa di nuovo redis-trib.rb. Usare redis-trib.rb è generalmente più semplice per la configurazione iniziale.

    ```bash

    Esempio che utilizza redis-trib.rb per aggiungere una replica al nodo 7000

    Hai bisogno dell'ID del nodo del master che vuoi replicare.

    Prima, ottieni l'ID del nodo: redis-cli -p 7000 CLUSTER NODES

    Supponiamo che l'ID del nodo master sia 'your_master_node_id'

    redis-trib.rb --cluster-add-node 127.0.0.1:7003 --cluster-slave --cluster-master-id 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
    `` *Nota*: Il comandoredis-trib.rbper aggiungere nodi può essere un po' complesso. Un approccio più semplice per aggiungere repliche è portare prima su l'istanza replica, quindi connettersi al nodo master tramiteredis-clied eseguire il comandoCLUSTER REPLICATE `.

    In alternativa, puoi usare redis-trib.rb per riconfigurare un cluster esistente con repliche:

    ```bash

    Esempio per aggiungere repliche a un cluster esistente a 3 master

    redis-trib.rb replace-node-master --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
    ```
    Questo comando è più complesso e presuppone che tu abbia configurato nodi aggiuntivi (7003, 7004, 7005) come repliche.

6. Gestione del Cluster

  • Aggiunta/Rimozione Nodi: Puoi aggiungere nuovi nodi master e repliche per scalare il cluster. Si possono usare redis-trib.rb o comandi manuali. La rimozione di nodi comporta prima la migrazione degli slot dal nodo.
  • Failover: Redis Cluster gestisce automaticamente il failover. Se un nodo master diventa irraggiungibile, le sue repliche tenteranno di essere promosse. Puoi simulare fallimenti usando CLUSTER FAILOVER (su una replica) o arrestando un nodo.
  • Spostamento Slot: Puoi spostare manualmente gli hash slot tra i nodi master usando i comandi CLUSTER SETSLOT <slot> IMPORTING/NODE e MIGRATE. Questo è utile per ribilanciare il cluster o prepararsi alla rimozione di un nodo.

Migliori Pratiche per Redis Cluster

  • Utilizza almeno 6 nodi: Un cluster pronto per la produzione dovrebbe avere almeno 3 master e 3 repliche (una replica per master) per tolleranza ai guasti.
  • Distribuisci i nodi tra le zone di disponibilità: Per i deployment cloud, posiziona i nodi in diverse zone di disponibilità per proteggerti da fallimenti a livello di zona.
  • Monitora il tuo cluster: Usa gli strumenti di monitoraggio di Redis e sistemi di monitoraggio esterni per tracciare prestazioni, utilizzo della memoria e stato dei nodi.
  • Configura protected-mode no: Se esegui Redis Cluster su una rete, assicurati che protected-mode no sia impostato nel tuo redis.conf e usa un firewall per limitare l'accesso.
  • Usa appendonly yes: Per la durabilità dei dati, assicurati che la persistenza del file append-only sia abilitata.
  • Supporto libreria client: Assicurati che la tua libreria client Redis supporti Redis Cluster e gestisca correttamente il reindirizzamento.

Conclusione

L'impostazione di un Redis Cluster è un passo critico per le applicazioni che richiedono elevata disponibilità e scalabilità orizzontale. Comprendendo i concetti chiave di sharding, replicazione e comunicazione del cluster, puoi distribuire e gestire con successo un robusto Redis Cluster. Ricorda di pianificare la topologia del tuo cluster, monitorarne lo stato e seguire le migliori pratiche per garantire prestazioni e affidabilità ottimali.