feat(failover): add VM 201 manual failover + recovery scripts, watchdog alert
VM 201 (Windows critical) stays out of HA by design. Added: - failover-vm201.sh: interactive failover pvemini -> pveelite with ZFS replication state - recover-vm201-to-pvemini.sh: interactive reverse migration with uptime + split-brain checks - pvemini-down-alert.sh: cron watchdog on pveelite, emails full runbook after 2min DOWN Replication RPO tightened: CT 108 + VM 201 to 5min, CT 171 to 15min. CT 171 added to HA (ha-group-main) for continuous Claude Code access. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
105
proxmox/cluster/failover/README.md
Normal file
105
proxmox/cluster/failover/README.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# Failover & High Availability
|
||||
|
||||
Strategia HA pe cluster, separată pe nivele de criticitate.
|
||||
|
||||
## Rezumat resurse critice
|
||||
|
||||
| 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 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 (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ă.
|
||||
|
||||
### Declanșator alertă
|
||||
|
||||
Cron pe pveelite verifică pvemini la fiecare minut:
|
||||
- Script: `/opt/scripts/pvemini-down-alert.sh`
|
||||
- După 2 minute DOWN consecutive → mail `mmarius28@gmail.com` cu comanda failover ready-to-run
|
||||
|
||||
### Execuție failover
|
||||
|
||||
Din orice sesiune SSH:
|
||||
|
||||
```bash
|
||||
ssh root@10.0.20.202 /opt/scripts/failover-vm201.sh
|
||||
```
|
||||
|
||||
Scriptul:
|
||||
1. Verifică pvemini efectiv DOWN (ping + ssh); abort dacă răspunde
|
||||
2. Verifică VM 201 nu rulează deja pe pveelite
|
||||
3. Afișează ultima replicare ZFS disponibilă local
|
||||
4. Cere confirmare interactivă (tastezi `DA`)
|
||||
5. `qm start 201` pe pveelite
|
||||
6. Trimite mail confirmare cu pași post-failover
|
||||
|
||||
Pentru automatizare (fără prompt):
|
||||
```bash
|
||||
ssh root@10.0.20.202 /opt/scripts/failover-vm201.sh --yes
|
||||
```
|
||||
|
||||
### După revenire pvemini — script interactiv
|
||||
|
||||
**NU porni automat VM 201 pe pvemini.** Date posibil divergente.
|
||||
|
||||
```bash
|
||||
ssh root@10.0.20.202 /opt/scripts/recover-vm201-to-pvemini.sh
|
||||
```
|
||||
|
||||
Scriptul verifică:
|
||||
- pvemini uptime min. 30 min + erori recente
|
||||
- pvemini reachable ssh + VM 201 nu rulează deja acolo (anti split-brain)
|
||||
- VM 201 running local pe pveelite
|
||||
|
||||
Pași executați automat (cu confirmare):
|
||||
1. `qm shutdown 201` pe pveelite
|
||||
2. `pvesr create-local-job 201-2 pvemini --source pveelite` + run forțat
|
||||
3. `qm migrate 201 pvemini` offline
|
||||
4. Cleanup job replicare inversă
|
||||
5. `qm start 201` pe pvemini
|
||||
|
||||
Non-interactiv: adaugă `--yes`.
|
||||
|
||||
## CT 108 Oracle — HA automat
|
||||
|
||||
- Group `ha-group-main` (pvemini:100, pveelite:50, pve1:33)
|
||||
- `max_restart 3, max_relocate 2`
|
||||
- Replicare 5 min → failover automat cu RPO 5 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
|
||||
|
||||
- Adăugat în HA pentru acces Claude Code continuu
|
||||
- Dacă pvemini cade, CT 171 pornește pe pveelite cu ultima replicare (max 15 min în urmă)
|
||||
- State = workspace files din `/workspace/` — replicate ZFS
|
||||
|
||||
## Fișiere relevante
|
||||
|
||||
| Fișier | Locație | Scop |
|
||||
|--------|---------|------|
|
||||
| `failover-vm201.sh` | `/opt/scripts/` pe pveelite | Failover manual VM 201 pvemini → pveelite |
|
||||
| `recover-vm201-to-pvemini.sh` | `/opt/scripts/` pe pveelite | Recovery interactiv VM 201 pveelite → pvemini |
|
||||
| `pvemini-down-alert.sh` | `/opt/scripts/` pe pveelite | Watchdog 1 min, mail dacă pvemini DOWN 2 min |
|
||||
| `oom-alert.sh` | `/opt/scripts/` pe toate nodurile | Alertă OOM kills |
|
||||
|
||||
## Comenzi utile
|
||||
|
||||
```bash
|
||||
# Stare replicare
|
||||
ssh root@10.0.20.201 "pvesr status"
|
||||
|
||||
# Stare HA
|
||||
ssh root@10.0.20.201 "ha-manager status"
|
||||
|
||||
# Forțează replicare acum (util înainte de mentenanță)
|
||||
ssh root@10.0.20.201 "pvesr run --id 108-1; pvesr run --id 201-1; pvesr run --id 171-1"
|
||||
|
||||
# Test script failover (dry — fără confirmare)
|
||||
ssh root@10.0.20.202 "/opt/scripts/failover-vm201.sh" # va abort dacă pvemini răspunde
|
||||
```
|
||||
Reference in New Issue
Block a user