Introduzione

Redis è un archivio dati di valori-chiave in memoria (in-memory key-value) open source. Una delle funzionalità più richieste è il supporto per la replica: qualsiasi server Redis può replicare i propri dati su un numero qualsiasi di repliche, consentendo un'elevata scalabilità di lettura e una forte ridondanza dei dati. Inoltre, Redis è stato progettato per consentire a molti client (fino a 10000, per impostazione predefinita) di connettersi e interagire con i dati, rendendolo una buona scelta per i casi in cui molti utenti hanno bisogno di accedere allo stesso set di dati.

Questo tutorial esamina i comandi utilizzati per gestire i client e le repliche Redis.

Prerequisiti

Configurare un ambiente Redis su Ubuntu 18.04:

Gestione delle repliche

Una delle caratteristiche più distintive di Redis è la sua replica integrata. Quando si utilizza la replica, Redis crea copie esatte dell'istanza primaria. Queste istanze secondarie si riconnettono al primario ogni volta che si interrompono le connessioni e mirano sempre a rimanere una copia esatta del primario.

Se non sei sicuro che l'istanza Redis a cui sei attualmente connesso sia un'istanza primaria o una replica, puoi verificare eseguendo il comando role:

role

Questo comando restituirà o master (primario) o slave (secondario), o potenzialmente, sentinel se si utilizza Redis Sentinel.

Per designare un'istanza Redis come una replica di un'altra istanza, eseguire il comando replicaof. Questo comando utilizza come argomento l'hostname o l'indirizzo IP o la porta del server primario previsto:

replicaof hostname_o_indirizzo_ip porta

Se il server era già una replica di un altro primario, smetterà di replicare il vecchio server e inizierà immediatamente la sincronizzazione con quello nuovo. Scarterà anche il vecchio set di dati.

Per promuovere una replica come primaria, eseguire il comando replicaof seguente:

replicaof no one

Ciò impedirà all'istanza di replicare il server primario, ma non eliminerà il set di dati che ha già replicato. Questa sintassi è utile nei casi in cui il primario originale non riesce. Dopo l'esecuzione di replicaof no one su una replica del primario non riuscito, la precedente replica può essere utilizzata come nuovo primario e avere le proprie repliche come fail-safe.

Nota: prima della versione 5.0.0, Redis includeva invece una versione di questo comando denominata slaveof.

Gestione dei client

Un client è qualsiasi macchina o software che si connette a un server per accedere a un servizio. Redis viene fornito con diversi comandi che aiutano a tracciare e gestire le connessioni client.

Il comando client list restituisce una serie di informazioni leggibili dall'uomo (human-readable) sulle connessioni client correnti:

client list
"id=18165 addr=[2001:db8:0:0::12]:47460 fd=7 name=jerry age=72756 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
id=18166 addr=[2001:db8:0:1::12]:47466 fd=8 name= age=72755 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=info
id=19381 addr=[2001:db8:0:2::12]:54910 fd=9 name= age=9 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
"

Ecco cosa significa ciascuno di questi campi:

  • id: un ID client univoco a 64 bit
  • name: il nome della connessione client, come definito da un comando client setname precedente
  • addr: l'indirizzo e la porta da cui il client si sta connettendo
  • fd: il descrittore di file che corrisponde al socket su cui si sta connettendo il client
  • age: la durata totale della connessione client, in secondi
  • flags: un insieme di uno o più flag a carattere singolo che forniscono dettagli più dettagliati sui client; consultare la documentazione del comando client list per maggiori dettagli
  • db: il numero ID del database corrente a cui è connesso il client (può essere da 0 a 15)
  • sub: il numero di canali a cui è abbonato il client
  • psub: il numero di abbonamenti di corrispondenza del modello del cliente
  • mutli: il numero di comandi che il client ha messo in coda in una transazione (mostrerà -1 se il client non ha iniziato una transazione o 0 se ha solo avviato una transazione e non ha messo in coda alcun comando)
  • qbuf: la lunghezza del buffer delle query del client, con 0 si intende che non ha query in sospeso
  • qbuf-free: la quantità di spazio libero nel buffer delle query del client, 0 significa che il buffer delle query è pieno
  • obl: lunghezza del buffer di output del client
  • oll: la lunghezza dell'elenco di output del client, in cui le risposte sono messe in coda quando il buffer è pieno
  • omem: la memoria utilizzata dal buffer di output del client
  • events: eventi del descrittore di file del client, questi possono essere r "leggibili", w "scrivibili" o entrambi
  • cmd: l'ultimo comando eseguito dal client

L'impostazione dei nomi dei client è utile per il debug delle perdite di connessione in qualunque applicazione stia utilizzando Redis. Ogni nuova connessione inizia senza un nome assegnato, ma client setname può essere utilizzata per crearne una per la connessione client corrente. Non c'è limite alla lunghezza dei nomi dei client, sebbene Redis di solito limiti le lunghezze delle stringhe a 512 MB. Si noti, tuttavia, che i nomi dei client non possono includere spazi:

client setname elaine

Per recuperare il nome di una connessione client, utilizzare il comando client getname:

client getname
"elaine"

Per recuperare l'ID connessione di un client, utilizzare il comando client id:

client id
(integer) "19492"

Gli ID client Redis non vengono mai ripetuti e sono monotonicamente incrementali. Ciò significa che se un client ha un ID maggiore di un altro, è stato stabilito in un secondo momento.

Bloccare i client e chiudere le connessioni client

I sistemi di replica sono generalmente descritti come sincroni o asincroni. Nella replica sincrona, ogni volta che un client aggiunge o modifica dati deve ricevere un tipo di riconoscimento da un certo numero di repliche affinché la modifica venga registrata come impegnata. Questo aiuta a prevenire conflitti di dati tra i nodi, ma comporta un costo di latenza, poiché il client deve attendere di eseguire un'altra operazione fino a quando non riceve risposta da un determinato numero di repliche.

Nella replica asincrona, invece, il client vede una conferma che l'operazione è terminata non appena i dati vengono scritti nella memoria locale. Tuttavia, può esserci un ritardo tra questo e il momento in cui le repliche scrivono effettivamente i dati. Se una delle repliche fallisce prima che possa scrivere la modifica, quella scrittura andrà persa per sempre. Pertanto, mentre la replica asincrona consente ai client di continuare a eseguire operazioni senza la latenza causata dall'attesa di repliche, può portare a conflitti di dati tra nodi e può richiedere un lavoro extra da parte dell'amministratore del database per risolvere tali conflitti.

A causa della sua attenzione alle prestazioni e alla bassa latenza, Redis implementa la replica asincrona per impostazione predefinita. Tuttavia, è possibile simulare la replica sincrona con il comando wait. wait blocca la connessione client corrente per un determinato periodo di tempo (in millisecondi) fino a quando tutti i precedenti comandi di scrittura non vengono trasferiti e accettati correttamente da un numero specificato di repliche. Questo comando utilizza la sintassi seguente:

wait number_of_replicas number_of_milliseconds

Ad esempio, se si desidera bloccare la connessione client fino a quando tutte le precedenti scritture non vengono registrate da almeno 3 repliche entro un timeout di 30 millisecondi, la sintassi di wait dovrebbe apparire così:

wait 3 30

Il comando wait restituisce un numero intero che rappresenta il numero di repliche che hanno riconosciuto i comandi di scrittura, anche se non tutte le repliche lo fanno:

2

Per sbloccare una connessione client che è stato bloccato in precedenza, dai comandi wait, brpop o xread, è possibile eseguire un comando client unblock con la seguente sintassi:

client unblock client_id

Per sospendere temporaneamente tutti i client attualmente connessi al server Redis, è possibile utilizzare il comando client pause Ciò è utile nei casi in cui è necessario apportare modifiche alla configurazione di Redis in modo controllato. Ad esempio, se stai promuovendo una delle tue repliche come istanza primaria, potresti mettere in pausa tutti i client in anticipo in modo da poter promuovere la replica e fare in modo che i client si connettano ad essa come nuovo primario senza perdere alcuna operazione di scrittura nel processo.

Il comando client pause richiede di specificare la quantità di tempo (in millisecondi) che si desidera sospendere i client. L'esempio seguente sospenderà tutti i client per un secondo:

client pause 1000

La sintassi client kill consente di chiudere una singola connessione o un insieme di connessioni specifiche in base a diversi filtri. La sintassi è simile al seguente:

client kill filter_1 value_1 ... filter_n value_n

Nelle versioni 2.8.12 e successive di Redis sono disponibili i seguenti filtri:

  • addr: consente di chiudere una connessione client da un indirizzo IP e una porta specificati
  • client-id: consente di chiudere una connessione client in base al suo campo ID univoco
  • type: Chiude ogni cliente di un dato tipo, che può essere normal, master, slave, o pubsub
  • skipme: le opzioni di valore per questo filtro sono yes e no:  Se specificato no, il client che chiama il comando client kill non verrà ignorato e verrà terminato se gli altri filtri si applicano ad esso. Se specificato yes, il client che esegue il comando verrà ignorato e il comando kill non avrà alcun effetto sul client. skipme è sempre yes di default

Conclusione

Questa guida descrive in dettaglio una serie di comandi utilizzati per gestire i client e le repliche Redis. Se ci sono altri comandi, argomenti o procedure correlati che vorresti vedere delineati in questa guida, chiedi o fai suggerimenti nei commenti qui sotto.