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 bitname
: il nome della connessione client, come definito da un comandoclient setname
precedenteaddr
: l'indirizzo e la porta da cui il client si sta connettendofd
: il descrittore di file che corrisponde al socket su cui si sta connettendo il clientage
: la durata totale della connessione client, in secondiflags
: un insieme di uno o più flag a carattere singolo che forniscono dettagli più dettagliati sui client; consultare la documentazione del comandoclient list
per maggiori dettaglidb
: il numero ID del database corrente a cui è connesso il client (può essere da0
a15
)sub
: il numero di canali a cui è abbonato il clientpsub
: il numero di abbonamenti di corrispondenza del modello del clientemutli
: il numero di comandi che il client ha messo in coda in una transazione (mostrerà-1
se il client non ha iniziato una transazione o0
se ha solo avviato una transazione e non ha messo in coda alcun comando)qbuf
: la lunghezza del buffer delle query del client, con0
si intende che non ha query in sospesoqbuf-free
: la quantità di spazio libero nel buffer delle query del client,0
significa che il buffer delle query è pienoobl
: lunghezza del buffer di output del clientoll
: la lunghezza dell'elenco di output del client, in cui le risposte sono messe in coda quando il buffer è pienoomem
: la memoria utilizzata dal buffer di output del clientevents
: eventi del descrittore di file del client, questi possono esserer
"leggibili",w
"scrivibili" o entrambicmd
: 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 specificaticlient-id
: consente di chiudere una connessione client in base al suo campo ID univocotype
: Chiude ogni cliente di un dato tipo, che può esserenormal
,master
,slave
, opubsub
skipme
: le opzioni di valore per questo filtro sonoyes
eno
: Se specificatono
, il client che chiama il comandoclient kill
non verrà ignorato e verrà terminato se gli altri filtri si applicano ad esso. Se specificatoyes
, il client che esegue il comando verrà ignorato e il comando kill non avrà alcun effetto sul client.skipme
è sempreyes
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.