From 940234806d4769ab4dfac088b0995aa7896bfae4 Mon Sep 17 00:00:00 2001 From: alkatrazz Date: Wed, 27 May 2026 19:43:31 +0200 Subject: [PATCH] =?UTF-8?q?docs(incidents):=202026-05-27=20=E2=80=94=20d?= =?UTF-8?q?=C3=A9faillance=20sdd,=20corruptions=20multiples,=20retrait=20R?= =?UTF-8?q?AID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Documente l'incident complet : - Cause racine : sdd défaillant (44 secteurs morts, 6 ans d'utilisation) write-back cache masquant les échecs d'écriture → corruption silencieuse - Corruptions résolues : Qdrant RocksDB, PostgreSQL grafana+litellm, Prometheus TSDB, Docker registry, sacrifice-web - Correctif permanent : sdd retiré du RAID (mdadm.conf + initramfs) - Actions restantes listées : remplacement sdd, câble sda, APM sdb, UPS, e2fsck Co-Authored-By: Claude Sonnet 4.6 --- admin/incidents.md | 151 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) diff --git a/admin/incidents.md b/admin/incidents.md index 31dd24b..64e7918 100644 --- a/admin/incidents.md +++ b/admin/incidents.md @@ -4,6 +4,7 @@ | Date | Composant | Résumé | Sévérité | |---|---|---|---| +| 2026-05-27 | RAID5 / sdd | Disque sdd défaillant (44 secteurs morts) — corruptions multiples en cascade | Critique | | 2026-05-14 | Grafana | OOMKilled — limite 256Mi trop serrée pour Grafana 13 | Warning | | 2026-05-13 | AlertManager | Receiver "null" non défini — ReconciliationFailed | Warning | | 2026-05-13 | llama-server | `/metrics` retourne 501 Not Implemented — flag `--metrics` absent | Warning | @@ -13,6 +14,156 @@ --- +## 2026-05-27 — RAID5 : défaillance sdd — corruptions multiples en cascade + +### Symptômes + +Au démarrage du cluster (`funk-start --k8s`) : + +- Qdrant en `CrashLoopBackOff` : `RocksDB open error: Corruption: no log_file_number ... MANIFEST-000033 may be corrupted` +- Grafana en `CrashLoopBackOff` : `pq: relation mapping file "base/24737/pg_filenode.map" contains invalid data` +- LiteLLM DB : `ERROR: invalid page in block 0 of relation base/16385/2838` +- Prometheus en `CrashLoopBackOff` : `corrupted block 01KSGFC9WP7STGTXWDNECY2FS0: read symbols: invalid checksum` +- Docker registry retournant 500 sur toutes les requêtes : `filesystem: stat ... data: input/output error` +- `sacrifice-web` en `ImagePullBackOff` (registry inaccessible) + +Pattern observé : corruptions récurrentes tous les 3-4 démarrages depuis ~7 semaines. + +### Cause racine + +Disque `sdd` (WDC WD10EALX-009BA0, S/N WD-WCATR9001223) en défaillance progressive : + +``` +Current_Pending_Sector : 44 ← secteurs illisibles, non réalloués +Offline_Uncorrectable : 44 ← secteurs confirmés irrécupérables +Power_On_Hours : 52816 ← 6 ans d'utilisation (MTBF constructeur = 5 ans) +``` + +Historique des self-tests SMART (tous en échec) : +``` +#1 Short LBA 1555355176 read failure (nouveau secteur mort) +#2 Short LBA 1413976229 read failure +#4 Extended LBA 1413976229 read failure (premier secteur mort, découvert il y a ~49 jours) +``` + +**Mécanisme de corruption silencieuse :** + +Le RAID dit `[4/4] [UUUU]` et `State: clean` car sdd ne retourne pas d'erreur au moment de l'écriture — son write-back cache (activé) acquitte l'écriture avant de la commettre sur le plateau. La donnée qui tombait sur les secteurs défaillants était silencieusement perdue, la parité RAID5 devenait incohérente avec les données réelles. Le RAID n'en savait rien. + +À chaque session d'utilisation (~10-12h), les services NFS/k8s écrivaient sur `/srv/data`. Une fraction des writes tombait sur les zones corrompues de sdd et accumulait de la corruption dans les métadonnées ext4 (directory blocks, btree). Au bout de 3-4 sessions, assez de structures critiques étaient corrompues pour faire crasher les services. + +**Problèmes secondaires identifiés :** +- `sda` : `UDMA_CRC_Error_Count = 6` → câble SATA défaillant ou port SATA instable +- `sdb` : `Start_Stop_Count = 17780` pour 8847h → spin-down APM trop agressif (~49 cycles/jour) +- Tous les disques : write-back cache activé sans onduleur → risque de corruption sur coupure de courant + +### Résolution — corruptions de données + +**Qdrant :** collection `funk-docs` supprimée et réingérée. +```bash +sudo systemctl stop qdrant +sudo rm -rf /srv/data/qdrant/storage/collections/funk-docs +sudo systemctl start qdrant +rag-ingest # → 308 chunks réindexés +``` + +**PostgreSQL — bases grafana et litellm :** +```bash +sudo systemctl stop litellm +sudo -u postgres psql -c "DROP DATABASE litellm;" +sudo -u postgres psql -c "CREATE DATABASE litellm OWNER litellm;" +sudo -u postgres psql -c "DROP DATABASE grafana;" +sudo -u postgres psql -c "CREATE DATABASE grafana OWNER grafana;" +sudo systemctl start litellm +kubectl rollout restart deployment/kube-prometheus-stack-grafana -n monitoring +# → Grafana rejoue 709 migrations, recrée le schéma +``` + +**Prometheus TSDB :** deux blocs corrompus supprimés du NFS. +```bash +PROM_NFS="/srv/data/nfs/k8s/monitoring-prometheus-...-pvc-aa1a187f-.../prometheus-db" +sudo rm -rf "$PROM_NFS/01KSGF0DXNXJ4HC5CEZX9THT5B" +sudo rm -rf "$PROM_NFS/01KSGFC9WP7STGTXWDNECY2FS0" +kubectl delete pod prometheus-kube-prometheus-stack-prometheus-0 -n monitoring +``` + +**Docker registry :** PVC corrompu recréé (NFS provisioner génère un répertoire propre). +```bash +kubectl scale deployment registry -n infra --replicas=0 +kubectl delete pvc registry-pvc -n infra +kubectl delete pv pvc-c5e1e86e-da56-4b31-bf52-07d5d619c9ea +# Recréer la PVC — le NFS provisioner provisionne un nouveau répertoire +kubectl apply -f - <