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>
This commit is contained in:
244
labs/lab-05-database/tutorial/02-data-persistence.md
Normal file
244
labs/lab-05-database/tutorial/02-data-persistence.md
Normal file
@@ -0,0 +1,244 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user