Ciao, e benvenuto nella quarta puntata della cinquantaseiesima stagione. Oggi mettiamo la lente d'ingrandimento sulla decisione più importante che prenderai mai usando Scylla, quella che, sbagliata, può rovinare tutto, e giusta, fa volare l'intero sistema. Oggi parliamo della chiave che decide tutto: la chiave di partizione.
Ripartiamo dal suo compito, perché è enorme. La chiave di partizione è il campo, o l'insieme di campi, che Scylla usa per decidere su quale macchina finisce ogni pezzo di dati. Funziona così: Scylla prende quel valore, lo passa in una specie di tritatutto che lo trasforma in un numero, e quel numero indica la macchina di destinazione. Stesso valore, stessa macchina, sempre. È un meccanismo semplice, automatico, ma le sue conseguenze sono tutt'altro che semplici, perché da esso dipende come il carico si distribuisce su tutto il sistema.
Voglio mostrarti il pericolo, perché è il cuore della puntata. Immagina di scegliere male la chiave di partizione. Supponi di raggruppare tutti i tuoi dati in base a un campo che ha pochissimi valori diversi, o peggio, un valore che va per la maggiore. Cosa succede? Che quasi tutti i dati, e quasi tutte le richieste, finiscono sulla stessa poverissima macchina, mentre le altre restano a girarsi i pollici. Hai un sistema di venti macchine, ma una sola lavora fino a fondersi e diciannove oziano. Questo si chiama, con un'immagine efficace, punto caldo: un punto del sistema che si surriscalda mentre il resto è freddo. E annulla ogni vantaggio della distribuzione.
Voglio darti la regola, perché è pratica. Come si sceglie bene, allora? Serve una chiave di partizione con due qualità. Primo, tanti valori diversi, così i dati si spargono su tutte le macchine invece di ammucchiarsi. Secondo, un accesso equilibrato, cioè nessun valore che attira su di sé una quantità sproporzionata di richieste rispetto agli altri. In una parola: vuoi che i dati e il traffico si distribuiscano il più uniformemente possibile su tutto il sistema. Una buona chiave di partizione è quella che tiene tutte le macchine ugualmente occupate, nessuna in fiamme, nessuna a riposo.
Voglio darti l'immagine che rende chiara questa idea, perché è quotidiana. Pensa a come assegnare gli studenti alle aule di una scuola. Se li assegni in base alla lettera iniziale del cognome, ti ritrovi l'aula delle emme e delle esse strapiena, e quella delle zeta quasi vuota: le lettere non sono distribuite in modo uniforme. Se invece li assegni in base a un numero di matricola ben mescolato, ogni aula riceve più o meno lo stesso numero di studenti. La lettera del cognome è una cattiva chiave di partizione; la matricola mescolata è una buona chiave. Stessa scuola, stesse aule, ma un equilibrio completamente diverso. E nota una cosa sottile: la matricola non è più giusta della lettera in senso assoluto, è solo più adatta a questo scopo, spargere in modo uniforme. La chiave migliore dipende sempre da cosa vuoi ottenere, non è una qualità che un campo possiede da solo.
Voglio collegarlo alle stagioni scorse, perché è un vecchio tema al suo apice. Se questa lezione ti suona familiare, è perché lo è. Con MySQL abbiamo detto che la scelta della chiave primaria decide se tutto vola o arranca. Con Mongo abbiamo detto lo stesso del criterio con cui si spezzano i dati. Qui, con Scylla, quella stessa lezione raggiunge la sua forma più pura e più severa: la chiave di partizione è la fisica stessa dei tuoi dati, è ciò che decide dove ogni cosa vive e quanto uniformemente lavora il sistema. In nessun'altra base di dati questa scelta è tanto centrale, e tanto impietosa se sbagliata.
Voglio darti la lezione generale, perché è profonda. La lezione è che, nei sistemi distribuiti, la distribuzione uniforme del carico non è un dettaglio: è tutto. Puoi avere il motore più veloce del mondo, come quello di Scylla, ma se il lavoro si ammassa in un punto solo, quella potenza è sprecata. L'obiettivo non è avere macchine potenti, è tenerle tutte occupate allo stesso modo. E questo dipende quasi interamente da una decisione presa all'inizio, spesso da chi non immagina quanto peserà: come raggruppare i dati. Pensarci bene, prima, vale più di qualunque ottimizzazione fatta dopo. E qui c'è un'amarezza tipica di questi sistemi: cambiare la chiave di partizione a cose fatte, con i dati già dentro, è doloroso, a volte quasi impossibile senza rifare tutto. È una di quelle decisioni che è meglio prendere bene la prima volta, perché tornarci sopra costa carissimo.
Per oggi ci fermiamo qui. Abbiamo messo a fuoco la chiave di partizione, la decisione più importante in Scylla. È il campo che decide su quale macchina finisce ogni dato: lo si trasforma in un numero, e quel numero indica la macchina. Sbagliarla crea un punto caldo: una macchina si fonde di lavoro mentre le altre oziano, e il vantaggio della distribuzione svanisce. La regola: tanti valori diversi e accesso equilibrato, perché dati e traffico si spargano uniformemente. Come assegnare gli studenti per matricola mescolata, non per iniziale del cognome. È la forma più pura della lezione già vista con MySQL e Mongo. La lezione: nei sistemi distribuiti, distribuire il carico in modo uniforme è tutto. Nella prossima puntata: progettare a partire dalle domande. Nelle note trovi qualche spunto. Se ti è utile, condividila. Grazie per l'ascolto, e ci sentiamo alla prossima.