InfraGuard

Service ▸ Base de données

Se connecte directement aux bases de données enregistrées et utilise SHOW GLOBAL STATUS + information_schema pour surveiller la charge en direct (concurrence, débit) et la structure du schéma.

Vue d’ensemble — ce que fait cet écran

Service ▸ Base de données (/service/database) est un écran de supervision en direct qui se connecte directement aux collecteurs de base de données enregistrés (access=database) afin d’échantillonner des métriques de charge et d’analyser la structure du schéma. Chaque base de données est rendue sous forme d’une carte, et chaque carte expose deux axes de charge d’un coup d’œil.

La supervision des bases de données s’articule autour de deux axes de charge :

Axe Question Métriques clés
① Charge de concurrence Combien s’accumule en ce moment ? threads_running, saturation des connexions (conn_pct), requêtes en attente (waiting)
② Débit et inefficacité Combien de travail, et combien de gaspillage ? QPS (Δquestions/Δt), taux de requêtes lentes (Δslow_queries/Δt)

À cela s’ajoutent l’analyse du schéma (taille totale · plus grosses bases · plus grosses tables · répartition des moteurs), les scores d’efficacité (taux de succès du cache du buffer pool · utilisation des index) et un bloc de gestion mémoire InnoDB (vidage des pages sales · checkpoint).

Cet écran n’installe aucun agent sur la base cible. L’application InfraGuard se connecte simplement au MySQL/MariaDB distant avec les identifiants enregistrés et exécute des requêtes SHOW GLOBAL STATUS / information_schema.

Quand l’utiliser

Disposition

Indicateurs du haut

Indicateur Signification
Nombre de BD Total des collecteurs access=database enregistrés
Up / Degraded / Down Agrégat de l’état des cartes (up/degraded/down)
QPS total Somme des QPS de toutes les cartes
Connexions Somme des threads_connected de toutes les cartes

En-tête de carte

① Charge de concurrence

② Débit et inefficacité

Pied de carte — efficacité · verrous

Métrique Formule Notes
Taux de succès du cache 1 − Δinnodb_buffer_pool_reads / Δinnodb_buffer_pool_read_requests Excellent ≥ 99,5 % · Bon ≥ 98 % · Correct ≥ 90 %
Utilisation des index Δhandler_read_key / (Δhandler_read_key + Δhandler_read_rnd_next) Excellent ≥ 90 % · Bon ≥ 70 % · Correct ≥ 40 %
lock innodb_row_lock_time_avg (attente moyenne de verrou de ligne, ms) Plus c’est bas, mieux c’est

Chaque libellé de métrique (cache · index · lock · checkpoint) porte un popover pédagogique qui explique les causes et les remèdes (par exemple augmenter innodb_buffer_pool_size, utiliser des index couvrants, éviter les verrous d’intervalle).

Analyse du schéma (repliable)

Repliée par défaut, elle s’ouvre avec [Déplier]. Agrégée depuis information_schema.tables, elle affiche la taille totale · le nombre de tables · le nombre de schémas · les 8 plus gros schémas par taille · les 14 plus grosses tables par taille · la répartition des moteurs.

L’analyse du schéma est par nature une requête lente côté serveur (mesurée à ~3,5 s), elle est donc contournée par un cache long de 30 minutes. L’ordonnanceur (infr:collect-db) préchauffe le cache, si bien que les requêtes web le trouvent toujours. Quand le cache est vide, la section est brièvement masquée puis apparaît au sondage suivant.

Gestion mémoire InnoDB (vidage des pages sales)

Agencement des cartes

La grille de cartes prend en charge le réordonnancement par glisser-déposer (SortableJS · ordre conservé dans localStorage) avec une disposition en maçonnerie par row-span. L’écran se rafraîchit par sondage toutes les 30 secondes.

Mode d’emploi

  1. Enregistrez d’abord un collecteur access=database dans Administration ▸ Collecteurs. Saisissez host/port/database/username plus le mot de passe (stocké chiffré par Crypt sur le collecteur), ou définissez cred_ref = env:PREFIX pour réutiliser un jeu d’identifiants existant du fichier .env.
  2. Ouvrez /service/database ; les bases enregistrées apparaissent sous forme de cartes. À l’entrée, si le dernier échantillon date de plus de 60 secondes, un échantillon unique immédiat (ensureFresh) est prélevé.
  3. Repérez la base problématique grâce au badge d’état de l’en-tête, puis affinez la cause selon les deux axes de charge (concurrence / débit).
  4. Dépliez l’analyse du schéma pour inspecter les plus gros schémas et tables (la maçonnerie se réagence automatiquement au changement de hauteur).
  5. Faites glisser les cartes pour remonter en haut les bases qui vous intéressent (l’ordre est enregistré dans le navigateur).

Réutiliser des identifiants via cred_ref

Avec cred_ref = env:PREFIX, les clés suivantes sont lues depuis .env, de sorte qu’aucun secret n’est stocké en base :

Par exemple : env:STATS_DB → serveur blue, env:STATS_GLORY_DB → serveur glory.

Pour voir les requêtes en attente à l’échelle du serveur

Pour agréger waiting à l’échelle du serveur, le compte de supervision doit disposer du privilège PROCESS ; sinon, seules ses propres connexions sont comptées. Un compte de supervision à privilèges minimaux :

CREATE USER 'infra_monitor'@'%' IDENTIFIED BY 'YOUR_DB_PASSWORD';
GRANT PROCESS, SELECT ON *.* TO 'infra_monitor'@'%';
FLUSH PRIVILEGES;

La décision de portée (le compte détient-il PROCESS ?) est figée par compte, elle est donc mise en cache pendant 1 heure. Si vous accordez le privilège plus tard, il prend effet dans l’heure (videz le cache pour un effet immédiat).

Sources de données

Requêtes d’origine (exécutées sur la base distante)

Requête Objet
SHOW GLOBAL STATUS Tous les compteurs threads · questions · slow_queries · bytes · buffer pool · handler · InnoDB
SELECT @@GLOBAL.max_connections etc. max_connections, réglages de vidage InnoDB (cache 1 h)
information_schema.processlist Nombre de requêtes en attente et décision de portée
information_schema.tables Analyse du schéma (cache de 30 minutes)
SHOW ENGINE INNODB STATUS Âge du checkpoint (LSN − dernier checkpoint · nécessite PROCESS)
SHOW GRANTS FOR CURRENT_USER() Détection du privilège PROCESS (portée)

Table de stockage

Les données échantillonnées sont écrites dans la série temporelle infr_db_metric (migration 000681). Les compteurs cumulés (questions/slow_queries/bytes_*) sont également stockés afin que l’échantillon suivant puisse calculer par delta les QPS · le taux de requêtes lentes · les scores d’efficacité.

infr_db_metric
  collector_id  host  sampled_at  uptime_sec
  threads_connected/running/cached  max_connections  conn_pct
  waiting  waiting_scope
  questions  slow_queries  qps  slow_qps
  bytes_received/sent  recv_bps/sent_bps  innodb_row_lock_waits
  ok  message  raw(json: efficiency + InnoDB memory-management derivations)

Aucune fuite de connexion (la leçon du [1040]). Chaque échantillon crée une connexion à l’exécution puis la libère immédiatement par DB::purge dans un bloc finally. Un délai d’expiration PDO (5 s par défaut) évite que les requêtes web et l’ordonnanceur ne restent bloqués sur un hôte distant lent. Si cette discipline est rompue, le max_connections du MySQL partagé est épuisé et même la production est affectée.

Planification de la collecte · conditions

La série temporelle est alimentée par la commande artisan infr:collect-db. Elle s’exécute une fois puis se termine (ce n’est pas un démon) ; l’ordonnanceur l’invoque chaque minute.

# Prendre un échantillon immédiat pour un seul collecteur (contourner la condition)
php artisan infr:collect-db --key=db@blue --force

La politique d’exploitation (Administration ▸ Politique d’exploitation · OpsPolicy) conditionne les exécutions planifiées :

Paramètre Valeur par défaut Signification
db_collect_mode economy economy = collecter uniquement s’il y a un utilisateur de la console (présence) · always = collecter en continu
db_collect_interval_sec 60 Intervalle de collecte (s). Le tic est chaque minute, mais la période effective est cette valeur

Seuils degraded/down

DbCollectorService::statusOf décide de l’état via OpsPolicy::dbThresholds().

Motif Condition Seuil par défaut
conn_saturation conn_pct ≥ 80 %
high_concurrency threads_running ≥ 40
query_backlog waiting ≥ 5
slow_query_rate slow_qps ≥ 1/s
down Aucun échantillon / ok=false, ou dernier échantillon de plus de 5 minutes (stale) —

Tout motif présent → degraded ; aucun → up.

Accès

Dépannage et FAQ

Une carte affiche « down »

QPS / taux de requêtes lentes / scores d’efficacité affichent « — »

Les valeurs dérivées sont calculées comme un delta par rapport à l’échantillon réussi précédent. Au premier échantillon, après un redémarrage de la base (uptime a diminué → compteur remis à zéro) ou quand un compteur régresse, la valeur n’est pas fiable et reste à null (—). Elle s’affiche normalement à partir du deuxième échantillon.

Les requêtes en attente affichent « uniquement la connexion courante »

Le compte de supervision ne dispose pas du privilège global PROCESS, si bien que seules ses propres connexions sont visibles dans information_schema.processlist. Accordez PROCESS avec le SQL de Pour voir les requêtes en attente à l’échelle du serveur (effet sous une heure, à l’expiration du cache de portée).

La section gestion mémoire / checkpoint est vide

L’analyse du schéma clignote vide puis apparaît

analysisCached est une consultation uniquement en cache. À la première entrée, le cache est vide et la section est masquée ; une fois que l’ordonnanceur l’a préchauffé, elle apparaît au sondage suivant de 30 secondes. Les échecs ne sont mis en cache que 30 s (les succès, 30 minutes), de sorte qu’une erreur passagère n’est pas figée longtemps.

Voir aussi

데이터베이스 관제 — 연결 포화·QPS·슬로우 쿼리
데이터베이스 관제 — 연결 포화·QPS·슬로우 쿼리