Introducción
Redis es un almacén de datos de valor-clave en memoria de código abierto. Una de las características más solicitadas es la compatibilidad con la replicación: cualquier servidor Redis puede replicar sus datos en cualquier número de réplicas, lo que permite una alta escalabilidad de lectura y una sólida redundancia de datos. Además, Redis fue diseñado para permitir que muchos clientes (hasta 10,000, de manera predeterminada) se conecten e interactúen con los datos, lo que lo convierte en una buena opción para los casos en los que muchos usuarios necesitan acceder al mismo conjunto de datos.
Este tutorial examina los comandos que se utilizan para administrar los clientes y las réplicas de Redis.
Prerrequisitos
Configuración de un entorno Redis en Ubuntu 18.04:
Gestión de la replicación
Una de las características más distintivas de Redis es su replicación incorporada. Al usar la replicación, Redis crea copias exactas de la instancia principal. Estas instancias secundarias se vuelven a conectar a la primaria cada vez que se pierden conexiones y siempre apuntan a seguir siendo una copia exacta de la primaria.
Si no está seguro de si la instancia de Redis a la que está conectado actualmente es una instancia principal o una réplica, puede verificarlo ejecutando el comando de role
role
Este comando devolverá master
(primario) o slave
(secundario), o potencialmente, sentinel
si usa Redis Sentinel.
Para designar una instancia de Redis como réplica de otra instancia, ejecute el comando replicaof
Este comando toma el nombre de host o la dirección IP o el puerto del servidor primario esperado como argumento:
replicaof hostname_o_indirizzo_ip porta
Si el servidor ya era una réplica de otro servidor primario, dejará de replicar el servidor anterior y comenzará inmediatamente a sincronizarse con el nuevo. También descartará el antiguo conjunto de datos.
Para promover una réplica como principal, ejecute el siguiente replicaof
replicaof no one
Esto evitará que la instancia replique el servidor principal, pero no eliminará el conjunto de datos que ya ha replicado. Esta sintaxis es útil en los casos en que falla el primario original. Después de ejecutar replicaof no one
en una réplica principal fallida, la réplica anterior se puede utilizar como la nueva principal y tener sus propias réplicas como a prueba de fallos.
Notaslaveof
Gestión de clientes
Un cliente es cualquier máquina o software que se conecta a un servidor para acceder a un servicio. Redis viene con varios comandos que ayudan a rastrear y administrar las conexiones de los clientes.
El client list
devuelve un conjunto de información legible por humanos sobre las conexiones de clientes actuales:
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
"
Esto es lo que significa cada uno de estos campos:
id
: un ID de cliente único de 64 bitsname
: el nombre de la conexión del cliente, según lo definido por unclient setname
addr
: la dirección y el puerto desde el que se conecta el clientefd
: el descriptor de archivo que corresponde al socket en el que se conecta el clienteage
: la duración total de la conexión del cliente, en segundosflags
: un conjunto de una o más banderas de un solo carácter que proporcionan detalles más detallados del cliente; consulte la documentación del comando declient list
db
: el número de identificación de la base de datos actual a la que está conectado el cliente (puede ser de0
a15
)sub
: el número de canales a los que el cliente está suscritopsub
: el número de suscripciones que coinciden con el modelo del clientemutli
: el número de comandos que el cliente ha puesto en cola en una transacción (mostrará-1
si el cliente no ha iniciado una transacción o0
si solo ha iniciado una transacción y no ha puesto en cola ningún comando)qbuf
: la longitud del búfer de consultas del cliente,0
significa que no tiene consultas pendientesqbuf-free
: la cantidad de espacio libre en el búfer de consulta del cliente,0
significa que el búfer de consulta está llenoobl
: longitud del búfer de salida del clienteoll
: la longitud de la lista de salida del cliente, donde las respuestas se ponen en cola cuando el búfer está llenoomem
: la memoria utilizada por el búfer de salida del clienteevents
descriptor de archivo del cliente, estos pueden serr
"legibles",w
"escribibles" o amboscmd
: el último comando ejecutado por el cliente
La configuración de los nombres de los clientes es útil para depurar las pérdidas de conexión en cualquier aplicación que utilice Redis. Cada nueva conexión comienza sin un nombre asignado, pero el nombre de conjunto de client setname
se puede usar para crear uno para la conexión de cliente actual. No hay límite en la longitud de los nombres de los clientes, aunque Redis generalmente limita la longitud de las cadenas a 512 MB. Sin embargo, tenga en cuenta que los nombres de los clientes no pueden incluir espacios:
client setname elaine
Para recuperar el nombre de una conexión de cliente, use el comando client getname
client getname
"elaine"
Para recuperar el ID de conexión de un cliente, use el comando de client id
client id
(integer) "19492"
Los ID de cliente de Redis nunca se repiten y son monótonamente incrementales. Esto significa que si un cliente tiene un ID mayor que otro, se ha establecido más tarde.
Bloquear clientes y cerrar conexiones de clientes
Los sistemas de replicación se describen generalmente como síncronos o asincrónicos. En la replicación sincrónica, cada vez que un cliente agrega o modifica datos, debe recibir un tipo de reconocimiento de un cierto número de réplicas para que el cambio se registre como confirmado. Esto ayuda a prevenir conflictos de datos entre nodos, pero tiene un costo de latencia, ya que el cliente tiene que esperar para realizar otra operación hasta que recibe una respuesta de un cierto número de réplicas.
Sin embargo, en la replicación asincrónica, el cliente ve una confirmación de que la operación ha finalizado tan pronto como los datos se escriben en la memoria local. Sin embargo, puede haber un retraso entre esto y cuando las réplicas realmente escriben los datos. Si una de las réplicas falla antes de poder escribir el cambio, esa escritura se perderá para siempre. Por lo tanto, aunque la replicación asincrónica permite a los clientes continuar realizando operaciones sin la latencia causada por la espera de réplicas, puede generar conflictos de datos entre nodos y puede requerir trabajo adicional por parte del administrador de la base de datos para resolver esos conflictos.
Debido a su enfoque en el rendimiento y la baja latencia, Redis implementa la replicación asincrónica de forma predeterminada. Sin embargo, la replicación síncrona se puede simular con el comando wait
wait
bloquea la conexión del cliente actual durante un período de tiempo específico (en milisegundos) hasta que todos los comandos de escritura anteriores se transfieren con éxito y son aceptados por un número específico de réplicas. Este comando usa la siguiente sintaxis:
wait number_of_replicas number_of_milliseconds
Por ejemplo, si desea bloquear la conexión del cliente hasta que todas las escrituras anteriores sean registradas por al menos 3 réplicas dentro de un tiempo de espera de 30 milisegundos, la wait
debería verse así:
wait 3 30
El wait
devuelve un número entero que representa el número de réplicas que han reconocido los comandos de escritura, aunque no todas las réplicas lo hacen:
2
Para desbloquear una conexión de cliente que estaba previamente bloqueada, desde los xread
wait
, brpop
o xread, puede ejecutar un client unblock
con la siguiente sintaxis:
client unblock client_id
Para suspender temporalmente a todos los clientes conectados actualmente al servidor de Redis, puede utilizar el client pause
es útil en los casos en que necesita realizar cambios en la configuración de Redis de forma controlada. Por ejemplo, si está promocionando una de sus réplicas como instancia principal, puede pausar todos los clientes antes para poder promover la réplica y hacer que los clientes se conecten a ella como la nueva principal sin perder ninguna escritura en el proceso.
El client pause
solicita que especifique la cantidad de tiempo (en milisegundos) que desea pausar los clientes. El siguiente ejemplo suspenderá a todos los clientes durante un segundo:
client pause 1000
La client kill
permite cerrar una sola conexión o un conjunto de conexiones específicas basadas en diferentes filtros. La sintaxis se ve así:
client kill filter_1 value_1... filter_n value_n
Los siguientes filtros están disponibles en las versiones 2.8.12 y posteriores de Redis:
addr
: cierra una conexión de cliente desde una dirección IP y un puerto especificadosclient-id
: cierra una conexión de cliente en función de su campo de ID únicotype
: cierra cualquier cliente de un tipo determinado, que puede sernormal
,master
,slave
opubsub
skipme
: las opciones de valor para este filtro sonyes
yno
: sino
especifica no, el cliente que llama alclient kill
del cliente no será ignorado y terminará si se aplican otros filtros. Siyes
especifica sí, el cliente que ejecuta el comando será ignorado y el comando kill no tendrá ningún efecto en el cliente.skipme
siempre esyes
por defecto
Conclusión
Esta guía detalla un conjunto de comandos que se utilizan para administrar clientes y réplicas de Redis. Si hay otros comandos, temas o procedimientos relacionados que le gustaría que se describieran en esta guía, pregunte o haga sugerencias en los comentarios a continuación.