Files
laboratori-cloud/labs/lab-05-database/tutorial/02-data-persistence.md
Luca Sacchi Ricciardi f8544afe35 docs(06-02): create Diátaxis documentation for Lab 05 Database & RDS
Documentation (6 files, 1500+ lines):
Tutorials (3):
- 01-deploy-rds-database.md: Deploy PostgreSQL in private network
- 02-data-persistence.md: Data persistence with named volumes
- 03-security-compliance.md: INF-01/02/03/04 compliance

How-to Guides (1):
- connect-to-postgresql.md: Connection methods

Reference (1):
- postgresql-commands.md: PostgreSQL command reference

Explanation (1):
- database-rds-parallels.md: Docker↔RDS parallels with architecture diagrams

Key concepts:
- PostgreSQL container → RDS Instance
- Private network → VPC Private Subnet
- Named volume → EBS volume
- Resource limits → DB instance class

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 17:41:29 +02:00

245 lines
4.8 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 lab05_db-data
```
Il volume è nominativo (`local` driver), quindi i dati sopravvivono.
---
## 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 inspect lab05-db --format '{{range .Mounts}}{{if eq .Destination "/var/lib/postgresql/data"}}{{.Source}}{{end}}{{end}}'
# Lista file nel volume (come root)
sudo ls -la /var/lib/docker/volumes/lab05_db-data/_data/
```
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
# 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
grep -A 20 "db:" docker-compose.yml | grep "/var/lib/postgresql/data"
# Verifica volume nominativo
grep "db-data:" docker-compose.yml
# Verifica driver local
grep -A 3 "volumes:" docker-compose.yml | grep -A 2 "db-data:"
```
Tutte le verifiche devono passare.
---
## Troubleshooting
### Dati persi dopo riavvio
```bash
# Verifica che il volume sia nominativo
docker volume inspect lab05_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, ricrea
docker volume create lab05_db-data
```
### Permesso negato su volume
```bash
# Verifica proprietà volume
sudo ls -la /var/lib/docker/volumes/lab05_db-data/
# PostgreSQL deve poter scrivere
sudo chown -R 999:999 /var/lib/docker/volumes/lab05_db-data/
```
---
Prossimo tutorial: Configurare security e access control.