Consistent hashing server ring

Il cerchio che decide chi serve chi

Quando un sito ha tanti server, deve decidere quale computer risponde a ogni utente. Il trucco: mettere server e utenti su un cerchio. Ogni utente va al primo server che trova girando come le lancette. Se un server si spegne, cambiano casa solo i suoi utenti.

Prova tu: qui sotto si tocca tutto.

— Il problema

Aggiungi un server: quanti utenti cambiano casa?

Gli stessi 48 utenti, divisi in due modi. A sinistra il modo più semplice: si fa una divisione e il resto dice a quale server deve essere assegnato. A destra il cerchio.

Premi i bottoni: aggiungi e togli server!

Divisione hash % N

0%utenti spostati all'ultimo cambio

Cerchio il primo server in senso orario

0%utenti spostati all'ultimo cambio
4server Con la divisione cambiano casa circa 3 utenti su 4. Con il cerchio solo quelli vicini al server aggiunto o tolto.
— Il cerchio

Toccalo e guarda cosa succede

Ogni pallina piccola (un utente, un dato) va al primo server che incontra girando in senso orario.

Tocca un punto vuoto per aggiungere una pallina. Tocca un server per spegnerlo.

Poi sposta il cursore “punti per server”: ogni server compare in più punti del cerchio e il lavoro si divide in modo più giusto.

Quanto lavoro ha ogni server

Ogni barra è il pezzo di cerchio di quel server: più è lunga, più utenti riceve. L'ideale è che siano tutte uguali.

Tocca un server per spegnerlo, o un punto vuoto del cerchio per aggiungere un utente.
— Il bilanciatore

Chi smista le richieste

Ogni pallina è una richiesta, del colore dell'utente che la manda. Il bilanciatore al centro (in inglese load balancer) sceglie il server.

“A turno” e “Casuale” mandano lo stesso utente ogni volta in un posto diverso, e il server non lo riconosce.

Con il cerchio ogni utente torna sempre dallo stesso server. Tocca un server per spegnerlo.

–richieste arrivate al server giusto
0utenti che hanno perso i loro dati
0richieste servite
0richieste perse perché il server era spento

Perché tornare dallo stesso server

Il server si ricorda le cose dell'utente: il carrello, la chat. Se la volta dopo l'utente finisce su un altro server, quelle cose non ci sono.

Se un server si spegne

Con il cerchio si spostano solo i suoi utenti, sul server successivo. Gli altri non se ne accorgono.

Pro e contro

“A turno” divide il lavoro in parti perfette ma non riconosce nessuno. Il cerchio riconosce tutti e, con tanti punti per server, divide bene anche il lavoro.

— Procedure avanzate

Prepararsi ai guai

Finora ogni chat aveva un solo server. Nei livelli avanzati il sistema diventa prudente: tiene dei server di riserva, si ricorda le risposte già calcolate e sta alla larga dai server in affanno. Tre prove, una per idea.

Repliche

Un server principale e due riserve

La chat va sempre al primo server in senso orario: è il principale. Poi si continua a girare per trovare le riserve, da usare se il principale si rompe.

  • Ogni server compare due volte sul cerchio: se lo incontri di nuovo, lo salti. Niente doppioni.
  • Per le riserve si preferiscono i server con abbastanza RAM libera (la memoria del computer). Quelli con poca RAM si saltano, se si può.
  • Se non bastano, si prendono anche quelli con poca RAM: meglio una riserva lenta che nessuna.

Nel codice: assign_servers(chat_id, k=3, min_free_ram_mb) e update_server_ram.

    Tocca un server per cambiare la sua RAM libera.

    Cache

    Ricordarsi le ultime risposte

    Calcolare principale e riserve costa un giro del cerchio. Per le chat che tornano spesso, la risposta si tiene da parte in una cache: un cassetto con pochi posti.

    • Chat già nel cassetto: risposta immediata, e la chat torna davanti.
    • Chat nuova: si calcola e si mette davanti. Se il cassetto è pieno, esce quella usata meno di recente (in inglese LRU).
    • Se i server cambiano, le risposte salvate possono essere sbagliate: si cambia “edizione” (_epoch) e si butta tutto.

    Nel codice: OrderedDict, con move_to_end e popitem(last=False).

    più recentemeno recente
    Scegli una chat qui sotto.
    0trovate nel cassetto 0calcolate da capo
    Pressione

    Non cambiare idea ogni secondo

    La RAM libera di un server sale e scende di continuo. Se la regola fosse solo “sotto la soglia: evitalo”, il server entrerebbe e uscirebbe dalla lista decine di volte.

    • Isteresi: si esce sotto la soglia, ma si rientra solo quando la RAM supera la soglia più un margine. In mezzo, si resta come si era.
    • Errori recenti: si tengono gli ultimi errori del server in una coda corta. Se sono troppi, il server è “sotto pressione” e non riceve nuove chat come riserva.

    Nel codice: set_ram_thresholds(min, hysteresis_mb), record_server_failure e una deque.

    0cambi di idea nell'ultimo minuto
    tranquillo Ogni errore conta per 10 secondi. Da 3 in su, il server è sotto pressione.
    — Nella vita vera

    Dove si usa davvero

    Database distribuiti

    Dynamic Databases

    Tengono i dati su tante macchine. Il cerchio decide dove va ogni dato; se si aggiunge una macchina, si sposta solo una piccola parte dei dati.

    Siti veloci (CDN)

    Pagine già pronte

    Ogni pagina web viene tenuta pronta sempre sullo stesso server, così arriva subito. Se quel server si spegne, si perdono solo le sue pagine.

    Bilanciatori

    Utenti riconosciuti

    Chi è collegato a lungo (una chat, un gioco online) resta sullo stesso server: è la simulazione qui sopra.

    Esempio

    Le chat di un chatbot

    Ogni conversazione resta sul server che se la ricorda. Altro esempio: gli ordini di un servizio di delivery con i rider distribuiti sul cerchio.

    — Fine del giro

    Adesso tocca a te