Guida alla Configurazione della Replica Primario-Replica di Redis

Configura la replica primario-replica di Redis con replicaof, autenticazione, monitoraggio e controlli di sicurezza per la produzione.

Guida alla Configurazione della Replica Primario-Replica di Redis

La replica di Redis è un modello fondamentale per ottenere alta disponibilità, ridondanza dei dati e scalabilità in lettura. Configurando un primario (precedentemente chiamato master) e una o più repliche (precedentemente chiamate slave), garantisci che i dati scritti sul primario vengano automaticamente copiati su tutte le repliche connesse.

Questa guida mostra come configurare la replica primario-replica di Redis, verificare che la sincronizzazione funzioni ed evitare gli errori comuni che espongono Redis o lasciano le repliche silenziosamente obsolete.


Comprensione dei Fondamenti della Replica di Redis

La replica di Redis è asincrona (il che significa che il primario non attende che la replica confermi le scritture), consentendo prestazioni elevate. Opera principalmente attraverso due fasi: sincronizzazione iniziale e sincronizzazione continua.

Sincronizzazione Completa (SYNC)

Quando una replica si connette a un primario per la prima volta, o dopo un'interruzione di rete che impedisce la risincronizzazione parziale, si verifica una sincronizzazione completa:

  1. La replica invia un comando PSYNC al primario.
  2. Il primario avvia un processo di salvataggio in background per generare un file snapshot RDB (.rdb).
  3. Il primario bufferizza tutti i nuovi comandi di scrittura ricevuti mentre l'RDB viene creato.
  4. Una volta completato il file RDB, il primario lo invia alla replica.
  5. La replica carica il file RDB in memoria.
  6. Infine, il primario invia tutti i comandi di scrittura bufferizzati alla replica per mettersi in pari.

Risincronizzazione Parziale (PSYNC)

Redis 2.8+ supporta la risincronizzazione parziale. Se il collegamento tra primario e replica si interrompe brevemente, la replica può richiedere solo i comandi mancanti da quando il collegamento si è rotto, utilizzando il buffer di backlog della replica (un buffer circolare configurabile sul primario).

Prerequisiti e Configurazione

Prima di configurare la replica, assicurati di avere almeno due istanze Redis separate in esecuzione (o configurazioni separate su porte diverse sullo stesso server per i test).

Per questa guida, assumiamo la seguente configurazione:

Istanza Ruolo Indirizzo IP Porta File di Configurazione
Primario Primario 192.168.1.100 6379 redis-primary.conf
Replica 1 Replica 192.168.1.101 6380 redis-replica-1.conf

Passo 2.1: Configurare l'Istanza Primaria

Assicurati che la tua istanza primaria sia pronta ad accettare connessioni dalle repliche e sia configurata per gestire la persistenza (RDB o AOF) se richiesta per la stabilità del primario stesso.

Impostazioni Cruciali del Primario:

  1. Binding: Assicurati che il primario sia associato a un indirizzo IP pubblico o a 0.0.0.0 se in esecuzione su più macchine. Se utilizzi firewall, assicurati che la porta 6379 sia aperta per gli IP delle repliche.
  2. Persistenza: Sebbene non sia strettamente richiesta per la replica stessa, abilitare RDB/AOF è fortemente raccomandato per la persistenza dei dati del primario.
# redis-primary.conf
port 6379
bind 0.0.0.0 # Si associa a tutte le interfacce (necessario per repliche esterne)
# Abilita la persistenza RDB
save 900 1
save 300 10
save 60 10000

Passo 2.2: Configurare l'Istanza Replica

Il cuore della configurazione di una replica risiede nella direttiva replicaof. Questa indica all'istanza con quale primario deve sincronizzare i propri dati.

Impostazioni Cruciali della Replica:

  1. Porta: Utilizza una porta diversa se in esecuzione sulla stessa macchina.
  2. Direttiva di Replica: Utilizza replicaof o slaveof (il nome legacy).
# redis-replica-1.conf
port 6380

# *** Configurazione Essenziale della Replica ***
replicaof 192.168.1.100 6379

# Assicura che le repliche siano in sola lettura (predefinito da Redis 5)
replica-read-only yes

# Si consiglia di disabilitare la persistenza sulle repliche se l'HA è gestita da Sentinel/Cluster
# Se la persistenza è necessaria per riavvii rapidi, mantenerla abilitata.
save ""

Nota: Se il primario richiede una password, configura la replica con masterauth <password>. In Redis 6 e successive configurazioni ACL, configura anche masteruser quando l'utente di replica non è l'utente predefinito.

Metodi di Implementazione

Puoi implementare la replica modificando il file di configurazione e riavviando il server, oppure dinamicamente eseguendo il comando REPLICAOF da redis-cli.

Metodo 3.1: File di Configurazione (Raccomandato per la Produzione)

Dopo aver aggiornato redis-replica-1.conf come mostrato sopra, avvia entrambe le istanze:

# Avvia il Primario
redis-server redis-primary.conf

# Avvia la Replica 1
redis-server redis-replica-1.conf

All'avvio, la Replica 1 tenterà immediatamente di connettersi al primario su 192.168.1.100:6379 e inizierà il processo di sincronizzazione.

Metodo 3.2: Configurazione Dinamica

Se un'istanza Redis è già in esecuzione e desideri convertirla in una replica senza riavviarla, esegui REPLICAOF tramite redis-cli.

  1. Connettiti all'istanza che desideri convertire in una replica (in esecuzione sulla porta 6380 nel nostro esempio):

    redis-cli -p 6380
    
  2. Esegui il comando di replica:

    127.0.0.1:6380> replicaof 192.168.1.100 6379
    OK
    

L'istanza sulla porta 6380 eliminerà tutti i dati precedenti e avvierà una sincronizzazione completa (SYNC) con il nuovo primario.

⚠️ Avvertenza: Disabilitazione della Replica

Per trasformare una replica di nuovo in un'istanza primaria autonoma, esegui replicaof no one su quell'istanza.

4. Monitoraggio dello Stato della Replica

Monitorare lo stato della connessione è fondamentale per garantire la coerenza dei dati. Utilizza il comando INFO replication tramite redis-cli sia sul primario che sulla replica.

4.1 Verifica dello Stato del Primario

Connettiti al primario (6379) e controlla quante repliche sono connesse e il loro stato:

redis-cli -p 6379 INFO replication

Estratto dell'Output Atteso (Primario):

# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.101,port=6380,state=online,offset=2048,lag=0
master_replid:a9b1c2...
master_replid2:000000...
master_repl_offset:2048
  • role:master conferma il suo ruolo.
  • connected_slaves:1 conferma che la replica è visibile.
  • state=online è lo stato stazionario desiderato.
  • lag=0 o un valore basso significa che la replica risponde prontamente. La replica di Redis è ancora asincrona, quindi questa non è una garanzia di zero perdita di dati.

4.2 Verifica dello Stato della Replica

Connettiti alla replica (6380) e controlla lo stato del collegamento al primario:

redis-cli -p 6380 INFO replication

Estratto dell'Output Atteso (Replica):

# Replication
role:slave
master_host:192.168.1.100
master_port:6379
master_link_status:up
master_sync_in_progress:0
slave_priority:100
slave_read_only:1
  • role:slave conferma il suo ruolo.
  • master_link_status:up conferma che la connessione è attiva e sana.
  • master_sync_in_progress:0 significa che la sincronizzazione iniziale è completa.

Best Practice e Ottimizzazione della Replica

5.1 Modalità Sola Lettura della Replica

Per impostazione predefinita, le repliche sono in sola lettura (replica-read-only yes). Questo è un meccanismo di sicurezza critico. Tentare di scrivere su una replica restituirà un errore, garantendo la coerenza dei dati nel cluster.

Se disabiliti la modalità sola lettura, qualsiasi scrittura sulla replica sarà locale e verrà sovrascritta se il collegamento di replica si interrompe e si verifica una sincronizzazione completa.

5.2 Ottimizzazione del Tempo di Sincronizzazione

Se il tuo dataset è molto grande, il processo SYNC iniziale può essere lento. Considera questi fattori:

  1. Larghezza di Banda di Rete: Assicurati una larghezza di banda sufficiente tra primario e repliche per il trasferimento RDB.
  2. Generazione RDB: Il primario necessita di CPU e I/O del disco per generare il file RDB. Assicurati che il server abbia risorse disponibili durante la sincronizzazione.
  3. Disabilita la Persistenza su Disco sulle Repliche (Opzionale): Se il primario gestisce tutta la persistenza e la replica è solo per il scaling in lettura, impostare save "" sulla replica evita il sovraccarico I/O della scrittura dei file RDB, accelerando i riavvii.

5.3 Configurazione di Sicurezza e Rete

È fondamentale che il primario non esponga pubblicamente la sua porta di replica (6379 o altra) a Internet. Configura regole firewall per consentire il traffico di replica solo dagli indirizzi IP designati dei server replica.

5.4 Utilizzare le Repliche per lo Scaling in Lettura

Il vantaggio principale della replica è la distribuzione del carico di lettura. Indirizza le applicazioni che eseguono principalmente operazioni di lettura alle istanze replica, riservando il primario per le operazioni di scrittura, migliorando la produttività complessiva del sistema.

Cosa Fare Dopo

Configurare la replica primario-replica di Redis è essenziale per costruire applicazioni resilienti e ad alte prestazioni. Configurando correttamente la direttiva replicaof e monitorando regolarmente lo stato del collegamento utilizzando INFO replication, crei una base per l'alta disponibilità e uno scaling efficace in lettura.

Sebbene questa guida si concentri sulla configurazione di base, gli ambienti di produzione spesso integrano ulteriori livelli di automazione, come Redis Sentinel per la promozione automatica del primario e il rilevamento dei guasti, o Redis Cluster per il partizionamento automatico e la distribuzione dei dati su più nodi.