Newer Older
f16725e 3 months ago History
104 lines | 4.138kb
Bogdan Timofte authored 3 months ago
1
# PGS - Intenție, Probleme și Compromis
2

            
3
## Intenție
4

            
5
Scopul inițial a fost simplu:
6
- să se poată salva starea guest-urilor active înainte de lucrări de mentenanță;
7
- să se poată restaura după revenirea nodurilor;
8
- să se evite pornirea guest-urilor care erau deja suspendate sau oprite înainte de operație.
9

            
10
Pentru VM-uri QEMU, asta a însemnat `qm suspend --todisk 1`.
11
Pentru containere LXC, asta a însemnat `pct shutdown`, urmat de `pct start` la restaurare.
12

            
13
## Abordarea inițială
14

            
15
Prima variantă a fost automată:
16
- `systemd` apela `suspend` la oprirea nodului;
17
- `systemd` apela `resume` la revenirea nodului;
18
- un fișier JSON local păstra lista guest-urilor care trebuiau restaurate.
19

            
20
Motivația a fost să existe un flux "hands-off" pentru reboot și shutdown.
21

            
22
## Probleme întâmpinate
23

            
24
În practică, abordarea automată a fost fragilă pe un cluster Proxmox real.
25

            
26
Problemele observate:
27
- imagini stale de suspend:
28
  - `disk image '...state-suspend-....raw' already exists`
29
- scrieri eșuate în `pmxcfs` / `/etc/pve`:
30
  - `Permission denied`
31
  - `Device or resource busy`
32
- ferestre fără quorum în timpul opririi sau revenirii nodurilor;
33
- VM-uri care porneau, dar rămâneau cu `lock: suspended`;
34
- restaurări parțiale, cu numai o parte din guest-uri repornite;
35
- comportament dependent de ordinea exactă în care reveneau rețeaua, corosync, storage-ul și `pve-cluster`.
36

            
37
Problema structurală a fost aceasta:
38
- `qm suspend` și `qm resume` nu sunt operații pur locale;
39
- ele au nevoie de scrieri coerente în `/etc/pve`;
40
- `/etc/pve` depinde de `pmxcfs` și de starea clusterului;
41
- în scenarii în care mai multe noduri se opresc sau pornesc în același timp, această dependență devine sursă de curse și inconsistențe.
42

            
43
Am adăugat mai multe remedieri tactice:
44
- cleanup pentru imagini stale;
45
- retry după eșec;
46
- relaxare temporară de quorum cu `pvecm expected 1`;
47
- curățare automată pentru `lock: suspended`.
48

            
49
Aceste remedieri au redus unele erori, dar nu au schimbat faptul că modelul automat rămânea nedeterminist în scenarii de mentenanță pe întregul cluster.
50

            
51
## Concluzie
52

            
53
Automatizarea la shutdown/boot nu a fost suficient de robustă pentru mediul real.
54

            
55
Mai exact:
56
- pentru reboot de un singur nod, putea funcționa uneori acceptabil;
57
- pentru lucrări în care mai multe noduri sau întregul cluster sunt oprite, rezultatele nu au fost suficient de predictibile.
58

            
59
Problema nu mai era un bug punctual, ci o nepotrivire între design și condițiile reale de operare.
60

            
61
## Compromisul ales
62

            
63
A fost aleasă o variantă mai simplă și mai controlabilă:
64
- fără automatizare `systemd`;
65
- fără hook-uri la shutdown sau boot;
66
- suspendarea se rulează manual înainte de mentenanță;
67
- restaurarea se rulează manual după revenirea clusterului.
68

            
69
Comenzile sunt:
70

            
71
```bash
72
/usr/local/sbin/pgs suspend -v
73
/usr/local/sbin/pgs resume -v
74
```
75

            
76
## De ce acest compromis este acceptabil
77

            
78
Se pierde comoditatea automatizării, dar se câștigă:
79
- control explicit asupra momentului execuției;
80
- posibilitatea de a aștepta revenirea clusterului înainte de `resume`;
81
- debug mai simplu;
82
- mai puține efecte surprinzătoare în timpul shutdown-ului;
83
- separare clară între pregătirea mentenanței și restaurarea ulterioară.
84

            
85
Practic, operatorul decide când clusterul este suficient de stabil pentru restaurare, în loc să lase asta pe seama ordinii de pornire a serviciilor.
86

            
87
## Ce rămâne intenționat în cod
88

            
89
Deși automatizarea a fost eliminată, scriptul păstrează unele protecții utile:
90
- detecție și cleanup pentru imagini stale de suspend;
91
- tratament pentru guest-uri deja pornite sau deja suspendate;
92
- cleanup pentru `lock: suspended` când este posibil;
93
- jurnalizare clară în `journalctl -t pgs`.
94

            
95
Acestea rămân utile și în fluxul manual.
96

            
97
## Ce nu mai face proiectul
98

            
99
Proiectul nu mai încearcă:
100
- să orchestreze reboot-ul nodurilor;
101
- să decidă automat momentul corect pentru restore;
102
- să garanteze restaurare automată după revenirea clusterului.
103

            
104
Acesta este acum un utilitar manual de guest state, nu un manager de reboot.