Scale · 02 · Persistenza e durabilità
Obiettivo dell’unità: scegliere consapevolmente il compromesso tra durabilità e latenza, e saper ricostruire un’istanza da zero.
Prerequisito: istanza di lab su 6379.
Esercizio 2.1 — RDB: snapshot su richiesta
Sezione intitolata “Esercizio 2.1 — RDB: snapshot su richiesta”redis-cli CONFIG SET save "" # disattiva i trigger automaticiredis-cli MSET a 1 b 2 c 3redis-cli BGSAVEsleep 1redis-cli INFO persistence | grep -E 'rdb_bgsave_in_progress|rdb_last_bgsave_status|rdb_changes_since_last_save|rdb_last_save_time'redis-cli LASTSAVEls -l ~/redis-lab/single/dump.rdbOutput atteso:
rdb_changes_since_last_save:0rdb_bgsave_in_progress:0rdb_last_bgsave_status:okVerifica: rdb_changes_since_last_save torna a 0 solo a snapshot
completato. LASTSAVE restituisce un timestamp Unix: confrontarlo prima e dopo
è il modo affidabile per sapere se un BGSAVE è andato a buon fine in uno
script.
Riattiva i trigger e osserva la sintassi:
redis-cli CONFIG SET save "900 1 300 10 60 10000"redis-cli CONFIG GET saveSignificato: salva se almeno 1 chiave è cambiata in 900 s, oppure 10 in 300 s, oppure 10000 in 60 s.
Esercizio 2.2 — AOF attivato a caldo
Sezione intitolata “Esercizio 2.2 — AOF attivato a caldo”Obiettivo: passare a AOF senza restart e capire il layout multi-part (Redis 7+).
redis-cli CONFIG SET appendonly yessleep 1redis-cli INFO persistence | grep -E 'aof_enabled|aof_rewrite_in_progress|aof_last_bgrewrite_status|aof_last_write_status'ls -l ~/redis-lab/single/appendonlydir/Output misurato:
aof_enabled:1aof_last_bgrewrite_status:okaof_last_write_status:ok
appendonly.aof.1.base.rdbappendonly.aof.1.incr.aofappendonly.aof.manifestVerifica: da Redis 7 l’AOF non è più un file unico ma una directory con
un base file (in formato RDB, se aof-use-rdb-preamble yes), uno o più file
incrementali e un manifest. Ogni script di backup scritto per Redis 6 che copia
appendonly.aof fallisce silenziosamente su Redis 7: è la trappola più
comune negli upgrade.
Rendi persistente la modifica (a caldo CONFIG SET non riscrive il file):
redis-cli CONFIG REWRITE # solo se l'istanza è partita da un file di configEsercizio 2.3 — Le tre policy di fsync
Sezione intitolata “Esercizio 2.3 — Le tre policy di fsync”redis-cli CONFIG GET appendfsyncfor p in always everysec no; do redis-cli CONFIG SET appendfsync $p > /dev/null echo -n "$p: "; redis-benchmark -n 20000 -c 10 -t set -q | tail -1doneredis-cli CONFIG SET appendfsync everysec| Policy | Perdita massima | Costo |
|---|---|---|
always | ~1 comando | throughput crolla, un fsync per scrittura |
everysec | ~1 secondo | default, compromesso corretto nel 95% dei casi |
no | a discrezione del kernel | massime prestazioni, nessuna garanzia |
Verifica: misura la differenza sul tuo storage. Su SSD locale il delta
always vs everysec è marcato; su NFS o storage di rete condiviso always è
di fatto inutilizzabile.
Esercizio 2.4 — Rewrite e crescita dell’AOF
Sezione intitolata “Esercizio 2.4 — Rewrite e crescita dell’AOF”for i in $(seq 1 5000); do redis-cli SET k:$i $i > /dev/null; doneredis-cli INFO persistence | grep -E 'aof_base_size|aof_current_size|aof_pending_rewrite'redis-cli BGREWRITEAOFsleep 2redis-cli INFO persistence | grep -E 'aof_last_bgrewrite_status|aof_rewrite_in_progress'ls -l ~/redis-lab/single/appendonlydir/Verifica: dopo il rewrite l’indice dei file nel manifest è incrementato
(appendonly.aof.2.*). Il rewrite automatico scatta su
auto-aof-rewrite-percentage (default 100) rispetto a
auto-aof-rewrite-min-size (default 64mb):
redis-cli CONFIG GET auto-aof-rewrite-percentage auto-aof-rewrite-min-sizeEsercizio 2.5 — Verificare l’integrità dei file
Sezione intitolata “Esercizio 2.5 — Verificare l’integrità dei file”redis-check-rdb ~/redis-lab/single/dump.rdbredis-check-aof ~/redis-lab/single/appendonlydir/appendonly.aof.manifestOutput atteso:
All AOF files and manifest are validVerifica: su Redis 7 redis-check-aof va puntato al manifest, non al
singolo .aof. In caso di file troncato (crash durante la scrittura):
redis-check-aof --fix ~/redis-lab/single/appendonlydir/appendonly.aof.manifest--fix tronca l’AOF all’ultimo comando valido: perdi le scritture finali, ma
l’istanza riparte. Fai sempre una copia del file prima di usarlo.
Esercizio 2.6 — Restore reale (il lab che conta)
Sezione intitolata “Esercizio 2.6 — Restore reale (il lab che conta)”Obiettivo: ricostruire un’istanza da un backup, senza scorciatoie.
# 1. stato notoredis-cli DBSIZEredis-cli BGSAVE && sleep 1cp ~/redis-lab/single/dump.rdb /tmp/backup-$(date +%F).rdb
# 2. distruggiredis-cli FLUSHALLredis-cli DBSIZE # 0
# 3. restoreredis-cli SHUTDOWN NOSAVE 2>/dev/nullrm -rf ~/redis-lab/single/appendonlydircp /tmp/backup-$(date +%F).rdb ~/redis-lab/single/dump.rdbredis-server --port 6379 --dir ~/redis-lab/single --daemonize yes --logfile r.logsleep 1redis-cli DBSIZE # il valore di partenzaProcedura corretta per un restore da RDB su istanza AOF:
# 1. avvia con appendonly no 2. carica l'RDB 3. CONFIG SET appendonly yes# (Redis rigenera l'AOF dal dataset in memoria)Domande di verifica
Sezione intitolata “Domande di verifica”rdb_last_bgsave_status:err. Quali sono le due cause più probabili e come le distingui?- Perché con
appendonly yesun restore dadump.rdbpuò risultare vuoto? - Il tuo script di backup copia
appendonly.aof. Su Redis 7 cosa ottieni? latest_fork_usecè 800000. Cosa significa per gli SLO di latenza?
Prossimo passo: 03 · Alta disponibilità.