From ff7e7da6d10a1305b3c283d13ea19cd5898a34d0 Mon Sep 17 00:00:00 2001 From: Marius Date: Thu, 27 Aug 2026 12:28:54 +0300 Subject: [PATCH] docs(cluster): procedura de oprire planificata + corectii stare HA reala Runbook nou pentru oprirea controlata a celor 3 noduri (lucrari electrice, mutare rack, mentenanta UPS) fara ca HA sa relocheze resursele si fara ca watchdog-ul sa reseteze hard nodul ramas fara quorum. Doua capcane documentate: - /etc/pve/datacenter.cfg nu exista => shutdown_policy implicit `conditional` => poweroff pe nod declanseaza FAILOVER, nu freeze - watchdog-ul face reset hard dupa ~60s pe nodul care pierde quorumul cu servicii HA inca active Corectii in failover/README.md, verificate pe clusterul live: - VM 201 ESTE in HA (grup ha-prefer-pvemini), docul spunea ca nu e - CT 108 e in ha-prefer-pvemini (pvemini:100, pve1:50, pveelite:10), nu in ha-group-main cu pveelite:50/pve1:33 - replicare CT 108 si VM 201 la */15 min, nu */5 => RPO real 15 min Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01RRyaDj39hPQ89SZS6URRpS --- CLAUDE.md | 1 + proxmox/README.md | 5 + .../docs/oprire-planificata-cluster.md | 278 ++++++++++++++++++ proxmox/cluster/failover/README.md | 38 ++- 4 files changed, 316 insertions(+), 6 deletions(-) create mode 100644 proxmox/cluster/docs/oprire-planificata-cluster.md diff --git a/CLAUDE.md b/CLAUDE.md index cceba89..d075629 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -39,6 +39,7 @@ input/ # Oracle DMP files for import ## Key Documentation Entry Points - **Infrastructure overview**: `proxmox/README.md` +- **Oprire planificată a clusterului (lucrări electrice) — fără failover HA / fence**: `proxmox/cluster/docs/oprire-planificata-cluster.md` - **SQL migration guidelines**: `system_instructions/system_prompt.md` (always read before generating migration SQL) - **Oracle database setup**: `proxmox/lxc108-oracle/README.md` - **Migration orchestration**: `proxmox/lxc108-oracle/migration/00-MASTER-MIGRATION.sh` diff --git a/proxmox/README.md b/proxmox/README.md index a4ebdbf..be02d26 100644 --- a/proxmox/README.md +++ b/proxmox/README.md @@ -113,6 +113,9 @@ proxmox/ |--------|-----------| | `README.md` | Ghid complet: SSH, noduri, storage, comenzi Proxmox, hartă IP-uri | | `cluster-ha-monitor.sh` | Script monitorizare High Availability | +| `docs/oprire-planificata-cluster.md` | **Oprire controlată a celor 3 noduri fără failover HA / fence** | +| `failover/README.md` | Strategia HA pe nivele de criticitate, failover VM 201 | +| `incidents/` | Post-mortem-uri incidente cluster | | `ups/` | Sistem UPS: configurare NUT, shutdown orchestrat, test baterie | **Quick Start:** @@ -452,6 +455,8 @@ ssh root@10.0.20.201 "qm snapshot 302 pre-test --description 'Before ROA test'" - **Văd toate IP-urile și serviciile** → `cluster/README.md` - **Configurez SSH** → `cluster/README.md` → "Configurare Inițială SSH" - **Monitorizez HA cluster** → `cluster/cluster-ha-monitor.sh` +- **Opresc toate serverele (lucrări electrice, mutare rack)** → `cluster/docs/oprire-planificata-cluster.md` +- **Înțeleg strategia de failover / ce e în HA** → `cluster/failover/README.md` - **Gestionez UPS** → `cluster/ups/README.md` ### Flowise AI / Chatbot Maria (LXC 104) diff --git a/proxmox/cluster/docs/oprire-planificata-cluster.md b/proxmox/cluster/docs/oprire-planificata-cluster.md new file mode 100644 index 0000000..bdcf1e7 --- /dev/null +++ b/proxmox/cluster/docs/oprire-planificata-cluster.md @@ -0,0 +1,278 @@ +# Oprire planificată a clusterului (lucrări la rețeaua electrică) + +Procedura de oprire controlată a tuturor celor 3 noduri Proxmox **fără ca HA să +relocheze resursele** și **fără ca watchdog-ul să reseteze hard vreun nod**. + +Se aplică oricărei opriri planificate a întregului cluster: lucrări electrice, +mutare rack, mentenanță UPS, intervenții la switch. + +**Autor:** Claude Code · **Ultima verificare pe cluster live:** 2026-08-27 + +--- + +## TL;DR + +1. **Datacenter → Options → HA Settings → Shutdown Policy = `Freeze`** ← fără asta, HA mută resursele +2. Dezactivează cron-urile de alertă (`pvemini-down-alert`, `vm109-watchdog`, `pveelite-down-alert`, `oom-alert`) +3. Oprește guest-urile manual — **Oracle CT 108 primul**, cu `shutdown immediate` în DB +4. `ha-manager status` → toate serviciile trebuie să fie `stopped` +5. Oprește nodurile: **pveelite → pve1 → pvemini** + +La revenire: pornești **toate trei nodurile aproape simultan** (altfel nu ai quorum). + +--- + +## De ce nu poți pur și simplu să apeși „Shutdown" + +### Capcana 1 — politica implicită de shutdown este `conditional` + +Pe clusterul `romfast` **nu există** `/etc/pve/datacenter.cfg`, deci PVE folosește +default-ul `shutdown_policy=conditional`: + +| Acțiune pe nod | Comportament HA cu `conditional` | +|----------------|----------------------------------| +| **Reboot** | freeze — serviciile rămân pe nod | +| **Shutdown (poweroff)** | **failover** — serviciile se relochează pe alt nod | + +Adică exact ce vrei să eviți: un „Shutdown" pe pvemini trimite CT 108 Oracle, +VM 201 și restul resurselor HA pe pve1/pveelite — pe noduri care oricum urmează +să fie și ele oprite, cu 16 GB RAM pe pveelite și riscul din +[incidentul 2026-04-20](../incidents/2026-04-20-cluster-outage.md). + +### Capcana 2 — watchdog-ul se auto-fence la pierderea quorumului + +Cu 3 noduri, quorum = 2. Dacă oprești două noduri și al treilea **încă are +servicii HA active**, LRM-ul pierde agent lock-ul și watchdog-ul face **reset +hard** după ~60 s. Nu shutdown curat — reset brutal, peste Oracle pornit. + +Soluția e la Pasul 3: cu toate resursele HA în state `stopped`, LRM-ul nu mai +are nimic activ, **watchdog-ul nu mai e armat**, iar pierderea quorumului devine +inofensivă. + +### Ce să NU faci + +- ❌ **Nu folosi node maintenance mode** (`ha-manager crm-command node-maintenance + enable `) — acela migrează *intenționat* resursele, exact opusul scopului. +- ❌ **Nu opri două noduri și nu lăsa unul pornit cu servicii HA active** — vezi capcana 2. +- ❌ **Nu lăsa nodul să oprească el guest-urile** — Oracle și Windows au nevoie de + shutdown curat, nu de timeout. + +--- + +## Pas 0 — Shutdown Policy = Freeze + +**GUI:** `Datacenter → Options → HA Settings → Edit → Shutdown Policy: Freeze` + +**CLI (echivalent):** + +```bash +ssh root@10.0.20.201 "echo 'ha: shutdown_policy=freeze' >> /etc/pve/datacenter.cfg" +``` + +`Freeze` = la oprirea nodului serviciile HA sunt înghețate, **nu relocate**; +repornesc pe același nod când nodul revine. + +> **Recomandare permanentă:** lasă `freeze` și după intervenție. Docul de failover +> descrie deja un incident în care VM 201 a migrat nedorit în timpul unei +> mentenanțe — `freeze` e politica potrivită pentru acest cluster. + +--- + +## Pas 1 — dezactivează alertele automate + +Altfel primești zeci de mailuri, iar `vm109-watchdog.sh` conține un `qm start 109` +care poate porni VM 109 fix când nu trebuie. + +**Pe pveelite (10.0.20.202)** — `crontab -e`, comentează: + +``` +* * * * * /opt/scripts/pvemini-down-alert.sh +* * * * * /opt/scripts/vm109-watchdog.sh +* * * * * /opt/scripts/oom-alert.sh +``` + +**Pe pvemini (10.0.20.201):** `pveelite-down-alert.sh` +**Pe pve1 (10.0.20.200):** `oom-alert.sh` + +> `pvemini-down-alert.sh` doar **trimite mail** cu comanda de failover, nu o +> execută singur — verificat în cod. `vm109-watchdog.sh` însă chiar pornește VM 109. + +### Job-uri de backup + +Verifică dacă fereastra de lucrări prinde un job vzdump. Dacă da, dezactivează-l +din `Datacenter → Backup` înainte: + +| Job | Program | +|-----|---------| +| `backup-impare-oracle` (CT 108) | zile impare 02:00 | +| `backup-impare-rest` (100, 103, 106, 171) | zile impare 03:00 | +| `backup-pare-flowise` (CT 104) | zile pare 02:00 | +| `backup-pare-windows` (VM 201) | zile pare 03:30 | +| `backup-pve1-minecraft` (CT 101) | zile impare 22:00 | +| `backup-f1c87584` (VM 109) | sâmbătă 15:00, prima săptămână | + +Replicarea ZFS (`pvesr`) nu trebuie dezactivată — job-urile ratate se recuperează +singure la primul tick după revenire. + +--- + +## Pas 2 — oprește guest-urile manual + +Ordine importantă: **Oracle primul**, restul după. + +| Nod | Guest | În HA | Cum | +|-----|-------|-------|-----| +| pvemini | **CT 108** central-oracle | Da | `shutdown immediate` în DB, apoi Shutdown CT | +| pvemini | VM 201 roacentral | Da | Shutdown (guest agent) | +| pvemini | VM 302 oracle-test | Nu | Shutdown | +| pvemini | VM 303 Win11-Adina | Nu | Shutdown | +| pvemini | CT 100 portainer | Da | Shutdown | +| pvemini | CT 102 docker.romfast.ro | Nu | Shutdown | +| pvemini | CT 103 dokploy | Da | Shutdown | +| pvemini | CT 104 flowise | Da | Shutdown | +| pvemini | CT 106 gitea | Da | Shutdown | +| pvemini | CT 171 claude-agent | Da | Shutdown | +| pve1 | CT 101 minecraft | Da | Shutdown | +| pve1 | CT 110 moltbot | Da | Shutdown | +| pveelite | — | — | nimic pornit (CT 301 și VM 109 sunt `stopped`) | + +### Oracle CT 108 — shutdown curat al bazei + +```bash +ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle-xe bash -lc \ + \"printf 'shutdown immediate\nexit\n' | sqlplus -s / as sysdba\"" +``` + +Abia după ce comanda întoarce `Database closed / Database dismounted / ORACLE +instance shut down`, oprești containerul din GUI. + +### Restul + +După ce Oracle e jos, poți folosi **Bulk Actions → Bulk Shutdown** pe fiecare nod. + +> Oprirea unui guest HA din GUI îi setează automat state-ul HA pe `stopped` — CRM-ul +> nu îl va reporni. **Consecință:** la revenire trebuie să le pornești tu manual +> (pornirea îi pune state-ul înapoi pe `started`). + +--- + +## Pas 3 — verificare obligatorie înainte de oprirea nodurilor + +```bash +ssh root@10.0.20.201 "ha-manager status" +``` + +**Toate** liniile `service ...` trebuie să arate `(nod, stopped)`. + +Dacă vreuna arată `started`, `migrate`, `relocate` sau `fence` — **oprește-te**. +Nu opri niciun nod până nu se stabilizează, altfel intri fix în scenariul de la +capcana 2. + +Verificare rapidă că nu a mai rămas nimic pornit: + +```bash +for h in 10.0.20.200 10.0.20.201 10.0.20.202; do + echo "=== $h ===" + ssh root@$h "pct list; qm list" +done +``` + +--- + +## Pas 4 — oprirea nodurilor + +Ordine: **pveelite (.202) → pve1 (.200) → pvemini (.201)** + +pvemini ultimul: e nodul principal și serverul NFS. + +GUI: selectezi nodul în arbore → **Shutdown** (dreapta sus). +Așteaptă ca nodul să nu mai răspundă la ping înainte de a-l opri pe următorul. + +--- + +## Repornirea + +1. **Pornește toate trei nodurile aproximativ simultan.** Un singur nod pornit + nu are quorum → `/etc/pve` rămâne read-only → nu poți porni niciun guest și + nu poți modifica nimic în GUI. + +2. Așteaptă quorum complet: + + ```bash + ssh root@10.0.20.201 "pvecm status" # Quorate: Yes, Total votes: 3 + ssh root@10.0.20.201 "ha-manager status" + ``` + +3. **Pornește guest-urile în ordine inversă:** CT 108 Oracle întâi, apoi VM 201, + apoi restul. Pornirea unui guest HA îi repune state-ul pe `started`. + +4. Verifică Oracle: + + ```bash + ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle-xe bash -lc \ + \"printf 'select status from v\\\$instance;\nexit\n' | sqlplus -s / as sysdba\"" + ``` + +5. **Re-activează cron-urile** dezactivate la Pasul 1 și job-urile de backup. + +6. Verifică replicarea: + + ```bash + ssh root@10.0.20.201 "pvesr status" + ``` + + Job-urile `*/15` (108, 171, 201) au ratat rulări; recuperează la primul tick. + +7. Decide ce faci cu Shutdown Policy — vezi recomandarea de la Pasul 0. + +--- + +## Capcane de mediu + +### BIOS „Power On After AC Loss" + +Dacă setarea e pe **Power On**, nodurile pornesc singure în secunda în care revine +curentul — posibil eșalonat, posibil înainte să fii tu pregătit. Primul nod care +pornește nu are quorum. Incidentul 2026-04-20 conține exact acest simptom +(„pvemini revine SINGUR — BIOS auto-power-on sau watchdog reset"). + +Verifică setarea înainte de intervenție sau fii lângă servere la revenirea curentului. + +### UPS + +Dacă lucrarea implică și UPS-ul, vezi `../ups/README.md` și +`../ups/docs/UPS-SHUTDOWN-README.md` — NUT are propria logică de shutdown +orchestrat care poate intra peste procedura de aici. + +--- + +## Stare de referință a clusterului (2026-08-27) + +Resurse HA configurate — 10 în total: + +| Serviciu | Nod | Grup | Comentariu | +|----------|-----|------|------------| +| ct:100 | pvemini | ha-prefer-pvemini | portainer | +| ct:101 | pve1 | ha-prefer-pve1 | minecraft | +| ct:103 | pvemini | ha-prefer-pvemini | dokploy | +| ct:104 | pvemini | ha-prefer-pvemini | flowise | +| ct:106 | pvemini | ha-prefer-pvemini | gitea | +| ct:108 | pvemini | ha-prefer-pvemini | central-oracle | +| ct:110 | pve1 | ha-prefer-pve1 | moltbot | +| ct:171 | pvemini | ha-prefer-pvemini | claude-agent | +| vm:109 | pveelite | ha-prefer-pveelite | oracle-dr-windows (`stopped`) | +| vm:201 | pvemini | ha-prefer-pvemini | roacentral | + +Guest-uri **în afara** HA: CT 102, CT 301, VM 302, VM 303, VM 310. + +`nofailback` este `1` doar pe `ha-prefer-pveelite`; celelalte două grupuri au +`nofailback 0`, deci resursele se întorc automat pe nodul preferat când acesta revine. + +--- + +## Referințe + +- [Strategia de failover și HA](../failover/README.md) +- [Incident 2026-04-20 — cluster outage](../incidents/2026-04-20-cluster-outage.md) +- [Cluster README — SSH, storage, noduri](../README.md) +- [UPS](../ups/README.md) diff --git a/proxmox/cluster/failover/README.md b/proxmox/cluster/failover/README.md index 800e333..40439ea 100644 --- a/proxmox/cluster/failover/README.md +++ b/proxmox/cluster/failover/README.md @@ -6,16 +6,33 @@ Strategia HA pe cluster, separată pe nivele de criticitate. | Resursă | Criticitate | HA automat | Replicare | RPO | |---------|-------------|------------|-----------|-----| -| CT 108 Oracle central | Nivel 0 | Da | pveelite `*/5` min, pve1 `*/5` min | 5 min | -| VM 201 Windows roacentral | Nivel 0 | **NU** (failover manual) | pveelite `*/5` min, pve1 `*/5` min | 5 min | +| CT 108 Oracle central | Nivel 0 | Da | pveelite `*/15` min, pve1 `*/15` min | 15 min | +| VM 201 Windows roacentral | Nivel 0 | **Da** (din 2026, vezi mai jos) | pveelite `*/15` min, pve1 `*/15` min | 15 min | | CT 171 claude-agent | Nivel 1 | Da | pveelite `*/15` min, pve1 `*/15` min | 15 min | | CT 104 flowise | Nivel 2 | Da | zilnic 21:15 | 24h | | CT 106 gitea | Nivel 2 | Da | `*/2` ore | 2h | | CT 100 portainer | Nivel 2 | Da | zilnic | 24h | -## VM 201 — failover manual +## VM 201 — HA automat + procedură manuală de rezervă -VM 201 (Windows production) **nu este în HA deliberat**. Incident anterior: când pvemini a fost scos temporar din HA pentru mentenanță, VM 201 a migrat automat — comportament nedorit pentru Windows production care cere fereastră de mentenanță controlată. +> **Corectat 2026-08-27.** Docul spunea anterior că VM 201 nu este în HA. **Nu mai +> este adevărat** — verificat pe cluster live: `vm:201 (pvemini, started)`, grup +> `ha-prefer-pvemini`, `max_restart 3`, `max_relocate 2`. + +VM 201 (Windows production) **este acum în HA**, grup `ha-prefer-pvemini` +(pvemini:100, pve1:50, pveelite:10). Dacă pvemini cade, CRM-ul o repornește +automat pe pve1 din ultima replicare ZFS (RPO 15 min). + +Motivul pentru care a stat inițial în afara HA: la o mentenanță în care pvemini a +fost scos temporar din HA, VM 201 a migrat automat — comportament nedorit pentru +Windows production, care cere fereastră de mentenanță controlată. + +**Acest risc rămâne valabil.** Pentru orice oprire planificată setează +`shutdown_policy=freeze` înainte — vezi +[Oprire planificată a clusterului](../docs/oprire-planificata-cluster.md). + +Procedura manuală de mai jos rămâne validă ca **rezervă**, pentru cazul în care HA +nu reușește recovery-ul (lipsă quorum, pveelite fără RAM, replicare rămasă în urmă). ### Declanșator alertă @@ -68,9 +85,10 @@ Non-interactiv: adaugă `--yes`. ## CT 108 Oracle — HA automat -- Group `ha-group-main` (pvemini:100, pveelite:50, pve1:33) +- Group `ha-prefer-pvemini` (pvemini:100, pve1:50, pveelite:10) — *corectat 2026-08-27, + docul spunea `ha-group-main` cu alte priorități* - `max_restart 3, max_relocate 2` -- Replicare 5 min → failover automat cu RPO 5 min +- Replicare `*/15` min → failover automat cu RPO 15 min - **Constrângere RAM pveelite 16 GB**: dacă pvemini cade, pveelite trebuie să aibă spațiu pentru CT 108 (8 GB) + CT 101 existent + eventual alte CT-uri HA ## CT 171 claude-agent — HA automat @@ -103,3 +121,11 @@ ssh root@10.0.20.201 "pvesr run --id 108-1; pvesr run --id 201-1; pvesr run --id # Test script failover (dry — fără confirmare) ssh root@10.0.20.202 "/opt/scripts/failover-vm201.sh" # va abort dacă pvemini răspunde ``` + +## Oprire planificată a întregului cluster + +Pentru lucrări electrice, mutare rack sau mentenanță UPS — **nu folosi butonul +Shutdown direct**. Politica implicită `conditional` relochează resursele HA, iar +watchdog-ul resetează hard nodul rămas fără quorum. + +→ [Oprire planificată a clusterului](../docs/oprire-planificata-cluster.md)