Saltar al contenido

Capítulo 10 de 13

Observar, diagnosticar y crecer con motivo

Relacionar métricas con fallos reales, estimar capacidad y saber cuándo una réplica, Sentinel o Cluster cambia el diseño.

#Mide la espera que experimenta la aplicación

Un Redis rápido por dentro puede ofrecer respuestas lentas si el pool está agotado, la red tiene problemas o el cliente recibe valores enormes. Separa tiempo de adquirir conexión, viaje completo del comando, tamaño de respuesta y tiempo de deserialización. Observa percentiles, especialmente p95/p99, además de promedio: una media buena puede ocultar peticiones que agotan su plazo.

Registra contadores por operación y motivo de fallo, sin claves sensibles ni cuerpos completos. Un identificador de trabajo permite unir productor, consumidor y receptor. No registres contraseñas ni la URL Redis completa si contiene credenciales. Añade nombre de entorno y servicio para no mezclar una caída de pruebas con producción.

#Una primera inspección que contesta preguntas

docker exec redis-practica redis-cli INFO stats
docker exec redis-practica redis-cli INFO memory
docker exec redis-practica redis-cli INFO clients
docker exec redis-practica redis-cli INFO persistence
docker exec redis-practica redis-cli SLOWLOG GET 10
Señal Interpretación inicial Qué comprobar después
keyspace_hits, keyspace_misses Aciertos/ausencias de búsquedas Deltas del intervalo y métricas por función de caché
evicted_keys creciendo Se expulsan claves por memoria Política, cardinalidad, tamaños y TTL
expired_keys creciendo Vencen claves Si era esperado o caducaron juntas
used_memory, RSS, pico Memoria lógica y física Buffers, fragmentación, forks y límite del host
Conexiones/bloqueados Clientes y esperas bloqueantes Fugas, pools y consumidores que esperan mensajes
Estados de RDB/AOF Éxito de escrituras de persistencia Disco, permisos, espacio y latencia de almacenamiento
SLOWLOG Comandos cuyo trabajo interno superó el umbral Tamaño de operaciones y scripts; no incluye todo el viaje de red

Estos contadores suelen acumularse desde arranque o reset. Para un hit ratio de un minuto, resta las dos mediciones: Δhits / (Δhits + Δmisses). Si el denominador es cero, no hubo observaciones útiles. Los accesos internos de otras funciones también pueden contribuir: añade métricas de aplicación para saber si una caché concreta ayuda.

#Seguir un incidente en un orden útil

Si sube la latencia, comprueba primero si se agotó el pool y si Redis recibe tráfico. Después compara carga, errores y memoria con el periodo normal. Un incremento de misses puede explicar que ahora el cuello de botella sea la base de datos, aunque Redis funcione bien. Un OOM con noeviction es diferente de un timeout o de un error de permisos.

Si hay un comando lento, identifica su tamaño y patrón: ¿se pidió HGETALL de un hash enorme?, ¿un LRANGE 0 -1?, ¿un script recorre miles de elementos?, ¿un pipeline agrupa demasiadas respuestas? Limitar tamaño y paginar suele ser más útil que añadir otro servidor a ciegas.

MONITOR muestra comandos en vivo, pero añade carga y puede revelar valores sensibles. No lo dejes permanentemente activado como sistema de logs. SLOWLOG también puede contener argumentos: restringe su acceso y retención. Para depurar una consulta concreta, reproduce primero el patrón con datos de prueba.

#Una cola exige métricas diferentes de una caché

XLEN informes:trabajos
XINFO GROUPS informes:trabajos
XINFO CONSUMERS informes:trabajos generadores
XPENDING informes:trabajos generadores
XPENDING informes:trabajos generadores - + 10

Ejecuta esos comandos con redis-cli cuando hayas creado el mini proyecto. XLEN incluye historial, no solo trabajo pendiente. El lag del grupo estima entradas todavía no entregadas; en ciertas situaciones puede ser desconocido. La PEL registra entregadas sin confirmar. Necesitas las dos perspectivas para ver tanto falta de consumidores como consumidores que reciben y se atascan.

Mide edad del trabajo más antiguo, tiempo de procesamiento, reentregas, rechazos permanentes y diferencia entre intenciones registradas e informes terminados. Una tasa de ACK alta no prueba éxito si el código confirma antes de aplicar el efecto. Por eso el mini proyecto permite comprobar directamente las filas del receptor.

#Dimensionar con un experimento representativo

Anota tamaño medio y máximo del mensaje, mensajes por segundo, tiempo de cada efecto y retención. Si entran veinte trabajos por segundo y cada trabajador completa cinco, cuatro apenas mantienen el ritmo: no queda margen para picos, pausas o recuperación. El límite real puede ser la base receptora, no Redis.

Prueba un lote con la distribución de tamaños real, varios consumidores, Redis reiniciado y el receptor temporalmente indisponible. Mide tiempo hasta vaciar el atraso y recursos durante la recuperación. Un benchmark de SET con valores diminutos no estima un servicio con JSON grande, AOF, TLS y consultas externas.

Define alertas por impacto: pendientes de más de un plazo admitido, persistencia fallando, memoria sin margen, rechazos por capacidad y ausencia de progreso. Un umbral absoluto de número de claves sin relación con tamaño o carga suele avisar tarde o molestar sin motivo.

#Qué cambian réplica, Sentinel y Cluster

Necesidad Pieza Cambio que debes asumir
Mantener una copia operativa Réplica Puede ir retrasada; no sustituye un backup
Detectar caída y promover una réplica Sentinel Cliente debe descubrir el primario y reconectar; failover puede perder escrituras
Repartir el conjunto de datos entre nodos Cluster Cliente consciente del cluster, slots y restricciones sobre operaciones multiclave

Sentinel coordina descubrimiento y failover de un primario con réplicas. Los observadores deben repartirse entre fallos independientes; tres procesos en un mismo portátil no ofrecen disponibilidad ante la pérdida del portátil. Después de un cambio, conexiones y operaciones en vuelo pueden fallar o tener resultado incierto: tu aplicación sigue necesitando reintentos seguros y reconexión.

Redis Cluster reparte claves entre 16.384 slots. Una operación atómica que toque varias claves normalmente necesita que compartan slot. Un hash tag, como {usuario-42} dentro de limite:{usuario-42} y estado:{usuario-42}, permite agruparlas. Poner todas las claves bajo el mismo tag vacía de sentido el reparto y puede crear un nodo caliente. Tampoco reparte una sola clave enorme entre todos los nodos.

No necesitas desplegar un cluster para completar este recorrido. Primero separa caché/cola, limita datos, mide la instancia, ensaya restore y considera un servicio gestionado si su operación te aporta más que mantener varios servidores. La escala distribuida se justifica cuando una instancia bien dimensionada no alcanza el conjunto o la disponibilidad necesaria, y aceptas sus nuevas restricciones.

Las guías oficiales de Sentinel y Redis Cluster explican sus procedimientos. Aquí hemos fijado el mapa para tomar una decisión; el mini proyecto siguiente integra un alcance que puedes operar y verificar personalmente, sin fingir un despliegue distribuido que no se ha realizado.

    ↑ ↓ para recorrer · Intro para abrir · Ctrl K para buscar