InfraGuard

Sessions (Redis)

Surveillez la santé des sessions et du cache Redis par nœud (capacité, débit, taux de succès, gestion mémoire, espace de clés), lue depuis un modèle en lecture seule alimenté par un collecteur — sans connexion directe à Redis.

Vue d’ensemble — ce que fait cet écran

Service ▸ Sessions (Redis) surveille sur un seul écran la santé du magasin de sessions et de cache de vos nœuds Redis enregistrés. Il transpose sur Redis le récit de Service ▸ Base de données, en lisant selon deux axes :

  1. Plafond de capacité et état actuel — une jauge annulaire de saturation mémoire (used_memory ÷ plafond de capacité), les connexions clientes (connected / maxclients) et les clients bloqués.
  2. Débit — les opérations par seconde (instantaneous_ops_per_sec), le taux de succès sur la fenêtre récente (Δhits / Δ(hits+misses)) et les E/S réseau (entrée/sortie en kbps).

Un panneau de détail repliable ajoute une série temporelle de gestion mémoire (superposition du plafond de capacité et repères des épisodes d’éviction) ainsi que l’analyse de l’espace de clés et des sessions.

Cet écran ne se connecte jamais directement à Redis. Un collecteur représentatif du réseau interne (scripts/infr_redis_vts_collector.cjs, un cron pm2 exécuté chaque minute) lance redis-cli INFO sur chaque nœud et charge les instantanés dans la table MySQL centrale infr_redis_metric ; l’application se contente de la lire. L’application ne détient aucun identifiant Redis et n’exécute aucun démon résident (ce qui évite les pièges des fuites de connexions et des identifiants codés en dur).


Quand l’utiliser


Disposition

Indicateurs du haut

KPI Signification
Nœuds Cartes de nœuds Redis disposant d’un échantillon dans la fenêtre récente (30 min)
Actifs / Dégradés / Hors service Nombre de nœuds up / degraded / down
Total ops/s Somme de instantaneous_ops_per_sec sur l’ensemble des nœuds
Clés totales Somme de keyspace_keys sur l’ensemble des nœuds

Cartes de nœud (deux axes)

Chaque nœud correspond à une carte. L’en-tête affiche le nom ou l’alias de l’instance, la version de Redis et le rôle (master/replica) ; le corps porte les deux axes.

① Capacité · Libre (jauge annulaire de gauche) — la valeur centrale est used_pct (utilisé ÷ plafond de capacité). Bandeau de métriques :

Métrique Champ Remarques
Clients connected_clients / maxclients Connexions face à la limite ; près de la limite, les nouvelles connexions sont refusées
Bloqués blocked_clients Clients en attente sur BLPOP·BRPOP·WAIT (0 est sain)

② Débit (à droite) — sparkline et bandeau :

Métrique Champ Remarques
ops/s instantaneous_ops_per_sec Commandes traitées par seconde
Taux de succès Δhits / Δ(hits+misses) Taux de succès du cache sur la fenêtre récente (repli sur la valeur depuis le démarrage quand les échantillons sont rares)
E/S réseau instantaneous_input_kbps + output_kbps Entrée/sortie réseau par seconde

Scores d’efficacité (pied de carte)

Le score de fragmentation (frag_score) n’est calculé que lorsque used_memory atteint au moins 64 MB. Sur les petites instances, la surcharge fixe de l’allocateur domine le rapport et produit de fausses alertes ; en dessous de ce seuil, il est donc exclu à la fois du score et du statut.

Bandeau du flux de vie des sessions

Un bandeau pleine largeur en pied de carte représente avec expiration → flux → expirées cumulées. À gauche, les clés qui portent actuellement un TTL vivant (keyspace_expires, sur le point d’expirer naturellement) ; à droite, les clés expirées depuis le démarrage (expired_keys, la rotation des sessions). Un remplissage proche de ≈100 % signale un pur magasin de sessions.

Détail (dépliage)

Deux blocs s’ouvrent de façon repliable (la mise en page masonry se réorganise lorsque la hauteur change).

Bulles pédagogiques (edu)

Le survol de l’icône située à côté d’une métrique ouvre une bulle conçue pour expliquer causes et remèdes (les concepts plus poussés se trouvent dans Le réglage de Redis expliqué) :

Bulle Contenu
SLOWLOG 7 causes d’accumulation de commandes lentes (commandes O(N) · grosses clés · pression mémoire · blocages de fork · Lua · pipelines · DEL massifs)
Taux de succès Base du ratio de succès du keyspace et moyens de l’améliorer (garder le jeu de travail résident · ajuster le TTL · atténuer les ruées)
Fragmentation Plage saine de RSS / used (1,0–1,5) · activedefrag · avertissement de swap (< 1,0)
Bases logiques Concept des bases numérotées de Redis (0–15) · séparation par usage · portabilité vers Cluster
Expiration · éviction Expiration (durée de vie normale) face à l’éviction (pression mémoire) · comment les lire

Comment l’utiliser

  1. Interrogation périodique — après le chargement, la page interroge /service/session/live toutes les 30 secondes pour rafraîchir les indicateurs et les cartes (le serveur met le tableau de bord en cache pendant 20 secondes).
  2. Réordonner les cartes — faites glisser les cartes pour les classer par priorité (SortableJS ; l’ordre est conservé dans localStorage).
  3. Déplier le détail — utilisez le bouton [Déplier] de la carte pour ouvrir les blocs de gestion mémoire et d’espace de clés.
  4. Apprendre avec edu — survolez l’icône d’une métrique pour afficher la bulle cause/remède.
  5. Plein écran — le bouton plein écran situé à côté de l’indicateur LIVE de l’en-tête masque la navigation supérieure et bascule en mode tableau de bord (ESC pour quitter).

Si aucune carte n’apparaît, c’est qu’aucun nœud Redis n’a encore été enregistré ni collecté. Dans Administration ▸ Collecteurs, enregistrez les nœuds redis_host sur le collecteur redis_vts, puis déployez le collecteur avec pm2 sur l’hôte représentatif.


Sources de données

Modèle en lecture seule infr_redis_metric

L’application mappe cette table comme un modèle en lecture seule de style Legacy (App\Models\Infr\InfrRedisMetric, $timestamps=false). Aucune migration n’existe pour elle, et c’est délibéré : le collecteur la provisionne lui-même avec CREATE TABLE IF NOT EXISTS, si bien qu’un Schema::create côté application entrerait en conflit.

Discipline du constructeur App\Services\Redis\RedisMetricService::dashboard() :

-- Conceptuel (en réalité du Eloquent). Récupérer la fenêtre récente par lot, regrouper en PHP.
SELECT * FROM infr_redis_metric
 WHERE sampled_at >= (NOW() - INTERVAL 30 MINUTE)
 ORDER BY sampled_at;

Collecteur — scripts/infr_redis_vts_collector.cjs

Un unique hôte représentatif du réseau interne s’exécute via un cron pm2 : à chaque passage, il balaie le Redis de plusieurs nœuds (redis-cli -h {ip} INFO) ainsi que le vts de nginx, charge directement les données dans le MySQL central, puis se termine (non résident → un processus neuf à chaque exécution, sans fuite). La configuration ne réside que dans le bloc CONFIG en tête de fichier (pas de variables d’environnement, pas d’identifiants codés en dur).

# Déploiement sur l’hôte représentatif (balayage chaque minute, non résident)
npm i mysql2                 # la seule dépendance npm (pour le chargement). Installez redis-cli via le paquet du système.
pm2 start infr_redis_vts_collector.cjs --name infr-collector \
  --no-autorestart --cron-restart "* * * * *"
pm2 save

Jointure d’instance (alias / clé étrangère entière)

À l’écriture, le collecteur résout l’alias du nœud en identifiant dans infr_instance et écrit directement un instance_id (entier). L’application joint en priorité sur metric.instance_id = infr_instance.id (comparaison d’entiers — indépendante du classement et indexée par clé primaire). Les instances non enregistrées ou enregistrées tardivement basculent sur node_alias (en minuscules) → infr_instance.alias, et le remplissage différé infr:link-metrics (contrôlé par le leader, toutes les 5 minutes) complète ensuite instance_id.

Calcul du plafond de capacité (cap)

La référence des 100 % de la jauge annulaire et du graphique mémoire est résolue dans cet ordre.

Type de cap Condition Plafond Espace libre estimé (est_free)
maxmemory maxmemory > 0 La valeur configurée de maxmemory (plafond dur) maxmemory − used
budget maxmemory non défini RAM totale − buffer pool de la base − réserve du système budget − used

Détermination du statut et seuils

statusOf() classe chaque nœud comme up / degraded / down.

Statut Condition
down Échec de la collecte (ok=0) ou état stale (dernier échantillon plus ancien que redis_stale_min)
degraded Une ou plusieurs des raisons ci-dessous
up Aucune raison

Raisons et seuils de degraded (Administration ▸ Politique d’exploitation, infr_setting group=ops) :

Raison Condition Clé de seuil Valeur par défaut
Saturation mémoire used_pct ≥ redis_mem_pct 85
Fragmentation frag_score ≥ redis_frag_ratio 1.6
Clients bloqués blocked_clients ≥ redis_blocked 1
Lien de réplique rompu master_link_status = down — —
Échec de sauvegarde RDB rdb_last_bgsave_status = err — —

Le taux de succès n’est PAS un axe de statut. Un magasin de sessions manque sa cible à chaque nouvelle connexion, à chaque expiration et à chaque déconnexion : un taux de succès de 40 à 60 % est donc normal (par exemple 44,75 % sur un nœud de sessions parfaitement sain). Auparavant, un taux de succès inférieur à redis_hit_rate_min (50 par défaut) produisait un degraded rouge injustifié ; désormais le taux de succès est uniquement affiché sur l’indicateur de la carte, la jauge de niveau et la bulle edu, et ne colore jamais un nœud en rouge. Les vrais problèmes de cache (saturation mémoire, éviction, fragmentation) sont détectés par mem_saturation/fragmentation quelle que soit la charge de travail.


Accès

Cet écran n’a aucune action destructrice : il n’écrit donc pas de journal d’audit propre (les modifications de collecteurs et de politique sont auditées sur leurs écrans d’administration respectifs).


Dépannage et FAQ

Aucune carte n’apparaît (« Aucun nœud Redis collecté »)

infr_redis_metric ne contient aucun échantillon récent. Vérifiez que (1) vous avez enregistré des nœuds redis_host sur le collecteur redis_vts dans Administration ▸ Collecteurs, (2) infr_redis_vts_collector.cjs tourne bien sous pm2 sur l’hôte représentatif et (3) l’hôte représentatif atteint le port Redis de chaque nœud via redis-cli.

Un nœud affiche « Hors service (stale) »

Le dernier échantillon est plus ancien que redis_stale_min (5 min par défaut). Le processus pm2 du collecteur représentatif est probablement mort, ou son cron s’est arrêté. Inspectez avec pm2 list / pm2 logs infr-collector.

Le plafond de la jauge annulaire paraît faux / l’espace libre semble énorme

Les nœuds sans maxmemory utilisent un budget comme plafond (RAM totale − buffer pool de la base − 20 % de réserve système). Pour un plafond dur, définissez maxmemory sur Redis : cette valeur devient alors directement le plafond.

Le bloc espace de clés / sessions est vide

Le détail par base (raw.keyspace) et les métriques de la base de sessions sont alimentés par le collecteur étendu. Avec un collecteur ancien, redéployez-le (ce qui ajoute de façon idempotente total_system_memory, keyspace_keys et les colonnes raw par base) et le bloc apparaîtra. Si rien n’est collecté, la section se masque proprement.

Le taux de succès est faible — est-ce un problème ?

Pour une charge de sessions, non (voir l’avertissement ci-dessus). S’il s’agit d’un pur cache et que le taux de succès est faible, le jeu de travail n’est peut-être pas résident ou le TTL est trop court — voyez le sujet consacré au taux de succès dans Le réglage de Redis expliqué.

Le score de fragmentation ne s’affiche pas

Lorsque used_memory est inférieur à 64 MB, le rapport de fragmentation est dominé par la surcharge fixe et n’a plus de sens : il est donc exclu du score et du statut.


Voir aussi

Redis 세션 관제 — 수용률·처리량·적중률
Redis 세션 관제 — 수용률·처리량·적중률