Files
laboratori-cloud/labs/lab-05-database/tutorial/02-data-persistence.md
T

248 lines
5.0 KiB
Markdown

# Tutorial: Persistenza Dati Database (EBS Volume Simulation)
In questo tutorial imparerai come i dati del database persistono oltre il ciclo di vita del container, simulando EBS volumes in AWS.
## Obiettivo
Verificare che i dati del database sopravvivano al riavvio e alla rimozione del container.
## Prerequisiti
- Tutorial 01 completato
- Database in esecuzione
- Dati di test creati
---
## Passo 1: Verifica volume esistente
Verifica che il volume nominativo sia stato creato.
Esegui:
```bash
# Lista volumi Docker
docker volume ls | grep db-data
# Atteso:
# local lab-05-database_db-data
```
Il volume e nominativo (`local` driver), quindi i dati sopravvivono. Nel repository il nome reale include il prefisso del progetto compose: `lab-05-database_db-data`.
---
## Passo 2: Inserisci dati di test
Crea dati che persisteranno oltre il riavvio.
Esegui:
```bash
# Crea tabella con timestamp
docker exec lab05-db psql -U lab05_user -d lab05_db -c "
CREATE TABLE IF NOT EXISTS persistence_test (
id SERIAL PRIMARY KEY,
message TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
"
# Inserisci dati con timestamp unico
docker exec lab05-db psql -U lab05_user -d lab05_db -c "
INSERT INTO persistence_test (message)
VALUES ('Test persistenza - $(date +%s)');
"
```
---
## Passo 3: Verifica dati prima del riavvio
Esegui:
```bash
# Conta righe
docker exec lab05-db psql -U lab05_user -d lab05_db -t -c "
SELECT COUNT(*) FROM persistence_test;
"
# Salva l'ID per verifica
row_count=$(docker exec lab05-db psql -U lab05_user -d lab05_db -t -c "
SELECT COUNT(*) FROM persistence_test;" | tr -d ' ')
echo "Righe prima del riavvio: $row_count"
```
---
## Passo 4: Ferma e rimuovi il container
Simula un failure del database.
Esegui:
```bash
# Ferma il container
docker compose stop db
# Rimuovi il container (NON il volume!)
docker compose rm -f db
# Verifica che il container sia rimosso
docker ps -a | grep lab05-db
```
Atteso: Nessun output (container rimosso)
---
## Passo 5: Riavvia il database
Crea un nuovo container con lo stesso volume.
Esegui:
```bash
# Riavvia il database
docker compose up -d db
# Attendi che sia pronto
sleep 10
# Verifica health
docker exec lab05-db pg_isready -U lab05_user
```
---
## Passo 6: Verifica dati dopo riavvio
I dati devono essere ancora presenti.
Esegui:
```bash
# Conta righe dopo riavvio
new_row_count=$(docker exec lab05-db psql -U lab05_user -d lab05_db -t -c "
SELECT COUNT(*) FROM persistence_test;" | tr -d ' ')
echo "Righe dopo il riavvio: $new_row_count"
```
Verifica:
```bash
# Se i conti sono uguali, SUCCESSO
if [ "$row_count" = "$new_row_count" ]; then
echo "✓ DATI PERSISTITI CORRETTAMENTE"
else
echo "✗ DATI PERSI - ERRORE"
fi
```
---
## Passo 7: Verifica contenuto volume
Esplora il volume per capire come PostgreSQL memorizza i dati.
Esegui:
```bash
# Trova il mount point del volume
docker volume inspect lab-05-database_db-data --format '{{.Mountpoint}}'
# Lista file nel volume (come root)
sudo ls -la $(docker volume inspect lab-05-database_db-data --format '{{.Mountpoint}}')
```
Struttura chiave:
- `base/`: dati database
- `global/`: configurazione globale
- `pg_wal/`: write-ahead log
---
## Passo 8: Test persistenza totale
Rimuovi TUTTO e ricrea da zero.
Esegui:
```bash
# Ferma e rimuovi tutto
docker compose down -v
# Nota: -v rimuove anche i volumi! NON usare -v per preservare dati
# Riavvia
docker compose up -d
# Attendi che PostgreSQL sia pronto
sleep 15
# Verifica che i dati siano PERSI (corretto con -v)
docker exec lab05-db psql -U lab05_user -d lab05_db -c "
SELECT COUNT(*) FROM persistence_test;
"
```
Atteso: ERRORE (tabella non esiste) perché i dati sono stati rimossi.
---
## Parallelismo con AWS EBS
| Locale | AWS |
|--------|-----|
| Named volume | EBS volume |
| Volume mount point | EBS mount point |
| Data survives container restart | Data survives instance reboot |
| Data lost with volume rm | Data lost with EBS deletion |
---
## INF-04 Compliance Check
Verifica che la configurazione sia INF-04 compliant.
Esegui:
```bash
# Verifica volume montato nel container
docker inspect lab05-db --format '{{json .Mounts}}'
# Verifica volume nominativo
docker volume ls | grep db-data
```
Tutte le verifiche devono passare.
---
## Troubleshooting
### Dati persi dopo riavvio
```bash
# Verifica che il volume sia nominativo
docker volume inspect lab-05-database_db-data
# Verifica montaggio corretto
docker inspect lab05-db --format '{{json .Mounts}}' | jq
```
### Volume non trovato
```bash
# Lista tutti i volumi
docker volume ls
# Se il volume non esiste, ricrealo rialzando il compose
docker compose up -d
# Attendi che PostgreSQL sia pronto
sleep 15
```
### Permesso negato su volume
```bash
# Verifica proprietà volume
sudo ls -la $(docker volume inspect lab-05-database_db-data --format '{{.Mountpoint}}')
# PostgreSQL deve poter scrivere
sudo chown -R 999:999 $(docker volume inspect lab-05-database_db-data --format '{{.Mountpoint}}')
```
---
Prossimo tutorial: Configurare security e access control.