Skip to content

Instantly share code, notes, and snippets.

@Davoleo
Created June 30, 2025 15:16
Show Gist options
  • Save Davoleo/f5068146ae55106d548975dc01d7fd86 to your computer and use it in GitHub Desktop.
Save Davoleo/f5068146ae55106d548975dc01d7fd86 to your computer and use it in GitHub Desktop.
AD Summary

Macro 1

Perché Distribuire un database relazionale?

Scalabilità affidabilità, disponibilità. Centrale Limite della scalabilità verticale! Distribuzione:

  • Scalabilità orizzontale
  • Disponibilità in caso di guasti
  • Collocazione dati più vicino all'utente

Frammentazione + Replicazione:

  • Frag Orizzontale: Divido, subset di righe, collocate ad esempio per area geografica
  • Frag Verticale: Divisione colonne, se solo l'accesso ad alcuni attributi è più frequente di altri
  • Frag Mista: Applicata Orizzontale & Verticale per ottenere vantaggi di entrambe
  • Replicazione: Copia intera o parziale dei dati sui nodi. + Disponibilità, ma consistenza complessa da gestire
    • parziale: Solo alcuni frammenti replicati (quelli con accessi più frequenti) -Disponibilità
    • Totale: Replicazione totale di tutti i dati +Disponibilità (Molto costoso gestire consistenza)

Esecuzione delle Interrogazioni distribuite:

  • Analisi: Quali nodi coinvolti
  • Scomposizione: sottoquery da inviare ai nodi
  • Raccolta risultati finali

Strategie di esecuzione delle query distribuite:

  • Shipping dati: Mando tutti i dati e delego tutte le operazioni al nodo centrale (+ trasferimento via rete)
  • Semijoin: Mando solo i dati identificativi necessari per filtrare la tabella nel nodo centrale (- trasferimento via rete)
  • Pushdown operazioni: maggior parte operazioni query svolte all'interno dei nodi locali, solo i risultati sono mandati al centrale eventualmente. (--trasferimento in rete)

Consistenza transazioni:

+Difficile gestione dell'ACID (Atomicity, Consistency, Isolation, Durability)

  • Atomicity: o tutto o niente
  • Consistency: database resta in uno stato valido
  • Isolation: transazioni concorrenti non interferiscono
  • Durability: una volta committata una transazione non può essere persa (anche dopo crash) Necessario un protocollo di coordinamento (2PC [2-Phase Commit])

Gestione della sincronizzazione delle replice:

  • Replica Sincrona: Scrittura sui nodi in realtime dopo la query, +consistenza ma -disponibilità nel caso di problemi di rete
  • Replica Asincrona: Nodi copie aggiornati in tempi diversi: -consistenza, rischio di inconsistenze temporanee

Macro 2

DBMS Centralizzato:

Singolo nodo fisico + Motore relazionale. Unica possibilità : scalabilità verticale (+CPU +RAM, ...) Garantisce:

  • Coerenza e integrità forte nei dati
  • Controllo centralizzato degli accessi
  • Prestazioni affidabili su carichi moderati

Transaction Manager:

  • Gestisce inizio e fine transazioni
  • Coordina accesso concorrente ai dati
  • Decide come risolvere i conflitti tra transazioni In ambiente centralizzato semplice -> Distribuito più difficile

Caduta transaction manager sistema centralizzato:

  • TM scrive le operazioni svolte su un log (Write-Ahead Logging)
  • Al riavvio rilegge il log
  • Transazioni committate vengono rieseguite / confermate
  • Transazioni non committate vengono annullate (rollback) Sistema distribuito il TM caduto dopo aver preso la decisione globale deve aver mandato a tutti l'info, altrimenti recovery + complicata

Extras

  • data catalogue: meta-informazioni relative al database (tabella di tabelle, tabella di attributi, ...)
  • Query tree: Albero di una query, nodi = operatori relazionali, foglie = tabelle

Macro 3

Trasparenza

Unione della gestione dei dati distribuiti con trasparenza di location fisica.

  • di Frammentazione: Sistema ignora del tutto la presenza di frammenti
  • di Allocazione: Sistema decide da solo quale replica utilizzare
  • di Linguaggio: L'applicazione deve specificare sia i frammenti sia il nodo su cui si trovano

Transazioni distribuite:

  • Atomicità Globale: o la transazione è completa su tutti i nodi o non lo è su nessuno.
  • Coordinamento: protocollo che decida se fare commit o rollback
  • Gestione deadlock distribuiti: Nodi che si aspettano a vicenda

2PC (2-Phase Commit)

Garantisce consistenza dellle transazioni distribuite, dove partecipano più resource manager, coordinato dal Transaction Manager.

  • Fase 1 (prepare): I nodi si preparano a decidere
    • I nodi svolgono le operazioni ma senza renderle permanenti
    • Se riesce ad eseguirle senza problemi vota commit (Deve anche scriverlo nel log perché nel caso venga chiesto di fare commit in seguito a un crash devono saperlo fare)
    • altrimenti se ci sono problemi vota abort
  • Fase 2 (commit/abort): Se tutti commit -> commit | altrimenti -> Abort
    • transaction manger raccoglie tutti i voti, se tutti commit -> global commit
    • se almeno un abort: global abort
    • Questa decisione è scritta su log per poter essere recuperata in caso di crash

Fallimenti più importanti "2PC":

TM cade dopo aver preso global decision ma prima di aver notificato tutti -> Alcuni nodi rimarranno per sempre in attesa della risposta del TM; questo rende 2PC non fault-tolerant 100%

RM cade dopo aver votato ma prima di aver ricevuto la global choice del TM -> non può fare altro che leggere dal log che cosa aveva votato e rimanere in attesa della risposta.

Se TM cade prima di aver preso una decisione globale, i RM vivi possono abortire localmente però quelli che avevano già votato rimangono comunque bloccati.

3PC Risolve i problemi di 2PC introducendo una fase intermedia -rischio di blocco.

2PC garantisce consistenza forte in transazioni distribuite, ma al costo di disponibilità in caso di fault

  • Blocco: single point of failure (Transaction manager), nodi in attesa bloccati
  • Rallentamento: intero sistema può rallentare per colpa di un nodo più lento/che non risponde

Algoritmi di rilevazione deadlock distribuito

Base: Costruzione del WFG (Wait-For Graph), nodi = transazioni, archi = relazioni di attesa risorse. Ogni nodo può costruire il WFG locale ma non è abbastanza.

Algoritmo di rilevazione centralizzato: Riceve periodicamente i WFG locali e li unisce per costruire il grafo globale, e controlla la presenza di cicli (deadlock); Svantaggi: Singolo punto di fallimento + collo di bottiglia per crescita del sistema.

Algoritmo di rilevazione completamente distribuito: Basato sullo scambio di messaggi tra i nodi. Ad esempio quando una transazione su un nodo si blocca viene mandato un messaggio di probe, contenente mittente, transazione bloccata e quella su cui è bloccata. Il messaggio viene propagato tra le dipendenze se riesce a tornare al nodo iniziale -> esiste ciclo -> deadlock, non richiede coordinatore centrale ma genera molto traffico di messaggi.

Algoritmi gerarchici: Ogni sottosistema locale rileva deadlock interni, e per quelli globali mandano info al livello superiore.

Per risolvere il deadlock si abortisce una delle transazioni (quella che ha fatto meno lavoro = meno risorse locckate => Minore impatto se abortita): Victim Selection

Protocollo ROWA

Per mantenere repliche sincrone, con una forte consistenza:

  • Letture su un singolo nodo (veloci)
  • Scritture propagate su tutti i nodi (lente)

Scalabilità e tolleranza ai guasti:

  • Failover automatico (replica sets)
  • Rilevazione dei nodi caduti (heartbeat, timeout)
  • Ribilanciamento dei dati (sharding dinamico)

Macro 4: NoSQL

  • Gestione dati non strutturati o semi-strutturati
  • Scalabilità orizzontale più semplice
  • Supporto per diverse tipologie di dati anche complesse
  • Elevate prestazioni con modelli + flessibili

Tipologie:

  1. Documentali: Memorizzano dati JSON-like: possibile struttura variabile
  2. Chiave-Valore (redis): Molto semplici, associano una chiave ad un valore arbitrario (e.g. caching/sessioni)
  3. Wide column (cassandra): dati in colonne invece che in righe, ottimizzati per grandi volumi e scritutre rapide
  4. Graphi (Neo4j): specializzati nella rappresentazione di relazioni tra entità, reti sociali, ecc...

Compromessi & Svantaggi

  • Eventually consistent: Spesso non viene garantità la consistenza forte [CAP]
  • Meno standardizzati
  • Gestione transazioni complessa: e.g. multi-record, multi-collection (limitate/costose)
  • Curva di apprendimento
Modello NoSQL Modello dei Dati Utilizzi Tipici Vantaggi Svantaggi Esempi di Sistemi Caratteristiche Tecniche
Documentale Documenti JSON, BSON, XML CMS, e-commerce, gestione utenti, cataloghi, app mobile/web Flessibilità dello schema, supporta dati annidati, buona leggibilità, query avanzate sui documenti Mancanza di join veri, query meno ottimizzabili rispetto ai modelli relazionali MongoDB, CouchDB, RavenDB Indicizzazione sui campi dei documenti, supporto per sharding e replica, buon supporto ACID nelle transazioni recenti (es. MongoDB 4.x in poi)
Key-Value Coppie chiave-valore Cache, sessioni utente, configurazioni, contatori, leaderboard Estrema semplicità e velocità, scalabilità orizzontale elevata Nessun supporto nativo per query complesse, no relazioni né struttura nei dati Redis, Riak, Amazon DynamoDB Accesso O(1), memoria in-RAM (Redis), supporto a TTL, persistenza opzionale, supporto a clustering e alta disponibilità
Colonnare (wide-column) Tabelle con righe sparse e colonne dinamiche Analisi su grandi volumi, logging, business intelligence, IoT Eccellente compressione e prestazioni in lettura su grandi volumi, schema flessibile Non adatto a dati transazionali o relazioni complesse Apache Cassandra, HBase, ScyllaDB Partizionamento automatico, consistenza configurabile (es. quorum), ottimale per letture per colonna o scansioni a range
A Grafo Nodi e archi con proprietà Social network, raccomandazioni, knowledge graph, network topology Query complesse sulle relazioni sono efficienti, navigazione immediata tramite pattern Non ideale per operazioni massicce o aggregazioni su grandi dataset lineari Neo4j, ArangoDB, JanusGraph, OrientDB Supporto per traversing profondo, linguaggi come Cypher o Gremlin, indexing su nodi e archi, supporto a ACID (Neo4j), difficile da scalare orizzontalmente
Multimodello Supporta più modelli (documenti, grafo, key-value) Applicazioni ibride che necessitano modelli diversi contemporaneamente Versatilità, unifica le query e riduce la complessità architetturale Maggiore complessità interna e talvolta minori ottimizzazioni per casi specifici ArangoDB, OrientDB, MarkLogic, Cosmos DB Query unificata (es. AQL), API per più modelli, transazioni ACID su documenti o grafi, supporto nativo a più modelli

Architettura Lambda:

Gestione di grandi volumi di dati in real-time e batch Per analisi rapide su stream di dati continui, 2 Pecorsi paralleli:

  1. batch layer: gestione intero dataset, rielaborato periodicamente in modo completo -> risultati accurati ma non immediati (key-value/wide-columns)
  2. speed layer: gestisce solo dati recenti -> risultati veloci ma approssimativi.
  3. serving layer: unifica risultati e li mostra per possibili interrogazioni (documentale)

Macro 5: MongoDB

  • Salvataggio formato BSON: Binary JSON.
  • Documenti memorizzati in collezioni
  • Struttura dati variabile
  • scalabilità orizzontale
  • alta disponibilità e performance

Vantaggi:

  • flessibilità schema: no tabelle con colonne rigide
  • query potenti e intuitive: query complesse di diverso tipo senza dover eseguire join
  • scalabilità orizzontale: Sharding, diviso in più nodi, garantendo alta disponibilità e performance
  • replica e tolleranza a guasti: replica set per ridondanza
    • Se un nodo cade un secondario prende il suo posto (no interruzione)

Architettura:

  • Nodo primario: gestisce tutte le scritture
  • Nodi secondari: mantengono copie sincronizzate, possono servire letture eventually consistent
  • Arbitri, nodi senza dati che aiutano a mantenere il quorum per le elezioni del nodo primario

Replica:

Replica asincrona:

  • PRimario scrive localmente e propaga le modifiche agli altri.
  • I secondari replicano con un possibile ritardo
  • Migliore disponibilità ma consistenza eventuale.

Pro e contro:

+ no join complessi
+ gestisce dati annidati e variabili
+ adatto a modelli denormalizzati
- no ACID piena su transazioni multi-document (oggi si con limiti)
- Ridondanza dati: serve duplicare per evitare join
- Eventually consistent

Meccanismi replica set

Meccanismi che permettono a mongo di essere fault-tolerant, anche in caso di caduta, e di reagire in modo automatico.

Heartbeat

Periodico messaggio mandato agli altri nodi per controllare lo stato; no risposta per 10 secondi: nodo considerato irraggiungibile o guasto.

Molte comunicazioni per sapere sempre quali nodi sono vivi e se necessario un elezione

Elezione

Avviene quando il primario non è più disponibile. Serve per eleggere un nuovo nodo primario.

  • Avviabile da qualsiasi nodo
  • Nodi si scambiano i voti: Ogni nodo a diritto ad 1 e un nodo è eletto se e solo se c'è maggioranza assoluta (> 50%)
  • Nuovo nodo primario inizierà a gestire le scritture, gli altri replicano i dati sul nuovo primario

Stats utili per elezione:

  • Priorità del nodo
  • lag di replicazione (quanto è indietro con il lavoro di replica)

Macro 6: GraphDB

Modellare e interrogare in modo naturale dati che presentano molte relazioni tra entità, in relazionale relazioni complesse tipo amici di amici sono difficili da gestire (molte join).

Struttura

  • Nodi (entità)
  • Archi (relazioni): legano i nodi e hanno un etichetta

Nodi e archi possono avere proprietà.

use cases

  • Reti sociali
  • Raccomandazione
  • Gestione di gerarchie
  • Knowledge Graph: sistemi AI che ragionano su reti di conoscenza
  • Tracciabilità: e.g. supply chain

Pro e contro:

+ Relazioni complesse navigabili in pochi passaggi
+ niente join: relazioni parte del dato
+ Aggiunta di nodi e relazioni dinamicamente
+ Vicino al prensiero umano
- Meno efficiente di relazionale per dati "flat" (struttura semplice)
- inadatto a bulk updates
- Meno supporto <- strumento più recente
- Meno standard (no SQL)

Macro 7: Distributed NoSQL

  • Dati distribuiti orizzontalmente: spezzati in partizioni (shard), e collocati su più nodi
  • Replica per tolleranza a guasti: ogni dato può essitere su più copie in nodi diversi
  • Assenza di schema rigido: ogni documento o riga può avere attributi diversi.

Sharding

Dataset suddiviso in fette indipendenti (shard) ognuna gestita da un sottoinsieme di nodi

  • -carico per un nodo.
  • inserimento di nuovi nodi in modo fluido (scalabilità orizzontale)
  • Necessita un buon sistema di bilanciamento

Replica

Ogni shard può essere replicato su più nodi (+affidabilità)

  • Replica sincrona -> massima coerenza
  • Replica asincrona -> massima disponibilità (Cassandra replica peer2peer asincrona)

Comunicazione tra nodi (protocollo Gossip)

Utilizzato nei sistemi senza master (e.g. Cassandra)

  • Conoscere nodi attivi
  • Sapere dove si trovano i dati
  • Sapere chi è in ritardo / ha problemi

Come?

  • Ogni nodo comunica periodicamente con i suoi vicini
  • scambia messaggi di gossip (stato di salute, carico, modifiche)
  • informazione propagata nel cluster ^ scalabile e resiliente perfetta per cluster grandi

CAP Theorem

Compromesso fondamentale tra:

  1. Consistency: tutti i nodi vedono lo stesso dato sempre
  2. Availability: sistema risponde sempre
  3. Partition Tolerance: sistema funziona anche se la rete è parzialmente rotta
  • Cassandra sacrifica C per garantire A+P
  • MongoDB di permette di scegliere se sacrificare C o A, a seconda del tipo di replica scelta.

Lettura scrittura:

  • Consultazione di più nodi in parallelo
  • Quanti nodi devono corrispondere al quorum
  • Scrivere su nodi diversi e lasciare che si sistemino tra di loro (hinted handoff)

Vantaggi/Svantaggi

+ Elasticità e scalabilità orizzontale: + nodi = + capacità
+ Fault-tolerance nativa
+ Performance su larga scala: grandi volumi, bassa latenza
+ Flessibilità di modellazione
- Gestione della consistenza complessa
- Modellazione non relazionale
- Rischi di dati obsoleti o parziali
- Debug distribuito: errori difficili da tracciare

Macro 8: Machine Learning

Organizzazione e qualità dei dati molto importante per sistemi ML

Ciclo di vita

  1. Raccolta e ingestione dato (necessaria architettura che permetta integrazione di dati da sorgenti diverse)
    • DB relazionali
    • File CSV/JSON
    • Server log
    • API
    • Flussi
  2. Data exploration e processing
    1. Tipi e distribuzioni variabili
    2. Outlier, dati mancanti, anomalie
    3. Correlazioni, pattern nascosti
  3. Data cleaning e Feature Engineering
    1. Pulizia (aggiustati errori trovati in exploration)
    2. Arricchimento (nuove variabili, aggregazioni, ...)
    3. Codifica (test -> numeri, normalizzazione, ...)
  4. Addestramento del modello
    1. Scelta algoritmo
    2. Addestramento sui dati
    3. Validazione del modello
  5. Valutazione e tuning
  6. Deployment e monitoraggio
    1. Rendere il modello usabile:
      1. servito tramite API
      2. Input in tempo reale o batch
      3. Monitorare la qualità del dato in input e il drift (cambiamento)
    2. Struttura tramite
      1. Database di produzione
      2. Monitoraggio dati
      3. Logging e Testing
  7. Retraining periodico
    1. MLOps
      1. Pipelines automatiche per il retraining
      2. Controlli di qualità avanzati
      3. Versionamento dei dati, dei modelli, dei codici

Concetti importanti

  • Data Quality: Fondamentali accuratezza, consistenza, completezza, tempestività
  • Data Governance: Chi può accedere a cosa, versionamento e auditing
  • Bias e Fairness: Errori nei dati creano modelli sbilanciati

Macro 9: Data Quality

La qualità dei dati è relativa all'uso che se ne fa. Data quality: Capacità del dato di essere utile, affidabile, aggiornato e corretto rispetto al contesto applicativo.

Dimensioni di Data Quality:

1. Accuratezza

Quanto il dato riflette la realtà. Potrebbe essere sintatticamente valido e consistente ma non rispecchiare comunque un valore vero.

2. Consistenza

Assenza di contraddizioni. All'interno di un dataset o in sorgenti diverse il dato che si riferisce ad una stessa cosa dovrebbe avere lo stesso valore.

3. Completezza

Un dato è completo quando non manca nulla di essenziale. Un dato non è completo quando:

  • Campo obbligatorio nullo
  • Record troncato
  • Valore derivato non calcolabile per mancanza di input

4. Validità sintattica

Il dato rispetta i vincoli del formato relativo al suo tipo. e.g. Email: [email protected]

5. Univocità

Assenza di duplicati Record che rappresentano la stessa entità, ma hanno dati leggermente diversi minano l'integrità (necessario record linkage)

6. Tempestività

Dato accurato e valido può essere inutile se obsoleto. I dati devono essere freschi aggiornati e devono rispecchiare il contesto da cui sono stati catturati.

Misurazioni/metriche possibili

  • Percentuale di null
  • Tasso di errore (rispetto a fonti di riferimento, gold standards)
  • Frequenza di aggiornamento
  • Numero di record duplicati

Strumenti e tecniche:

  • Data Profiling
  • Data cleansing tools
  • Vincoli di integrità (DB)
  • Pipeline di monitoraggio (sistemi distribuiti)
  • Standardizzazione e normalizzazione dei dati
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment