Load balancing-ul este o tehnică esențială în arhitecturile moderne de distribuție a traficului și a stocării într-un sistem dinamic. Scopul său este să dirijeze uniform solicitările și să „țină” în echilibru încărcarea între mai multe servere, asigurând performanțe consistente, scalabilitate și toleranță la eșec. În contextul unui sistem distribuit pentru comerț electronic, unde un număr mare de produse trebuie să fie disponibile rapid, un load balancer bine proiectat minimizează perturbările atunci când serverele pot fi adăugate sau oprite.
Ideea de bază: distribuția obiectelor prin hashing distribuiv
În cazul nostru, obiectele din sistem sunt perechi
Consistent Hashing: cum funcționează în practică
Consistent Hashing creează un cerc imaginar numit hash ring pe care sunt mapate atât cheile obiectelor, cât și id-urile serverelor. Fiecare obiect trebuie să aparțină unui singur server. Pentru a realiza o distribuție cât mai uniformă, serverele pot fi adăugate de mai multe ori pe hash ring sub forma de replici. În practică, hash ring-ul este reținut în memorie ca un tablou ordonat crescător de etichete de servere, iar pozițiile pe ring sunt determinate prin funcțiile de hash: hash_function_servers pentru id-urile serverelor și hash_function_key pentru cheile obiectelor. Cheile obiectelor nu sunt plasate pe hash ring; ele sunt mapate către servere prin pozițiile pe ring. Astfel, dacă un server este eliminat, doar obiectele de pe vecinii săi se vor reateza către serverele adiacente, minimizând redistribution-ul necesar.
Rolul load balancer-ului în arhitectura sistemului
Load balancer-ul are misiunea de a dirija traficul către un set de servere cu o putere de procesare limitată, astfel încât toate serverele să stocheze și să proceseze un volum similar de date. În cazul fluxului de distribuție a obiectelor, el decide pe ce server va fi stocată cheia fiecărui obiect. Aceasta asigură o încărcare echilibrată și o utilizare optimă a resurselor, în timp ce sistemul poate suporta adăugări sau opriri de servere fără a afecta semnificativ serviciile. Principalele avantaje ale folosirii Consistent Hashing includ minimal disruption during scaling, adică întreruperi minime ale sistemului pe măsură ce se adaugă sau se elimină servere.
Provocări și compromisuri
- Numărul de replici ale fiecărui server pe hash ring poate afecta distribuția și urma de redistribuire la schimbări în infrastructură.
- Obiectele nu sunt plasate direct pe hash ring; ele rămân stocate pe servere, iar maparea se face prin pozițiile pe ring.
- Într-un sistem real, distorsiile în timp pot apărea dacă hash function-urile nu sunt bine alese sau dacă distribuția obiectelor nu este suficient de uniformă.
Elemente tehnice ale implementării în contextul unui sistem de e-Commerce
Un exemplu relevant este proiectul în care se dorește stocarea perechilor
Funcțiile de hashing și rolul lor
Funcțiile hash sunt utilizate pentru a genera pozițiile pe hash ring. Pe de o parte, hash_function_servers(a) calculează hash-ul etichetei unui server, iar pe de altă parte hash_function_key(a) calculează hash-ul unei chei de obiect. Aceste funcții trebuie utilizate pentru a calcula pozițiile pe hash ring, dar nu se modifică deoarece schimbările ar produce rezultate diferite față de cele așteptate de checker. În implementare, obiectele nu sunt puse direct pe hash ring; ele sunt stocate pe servere.
Structură de implementare și funcționalități în schelet
Se oferă un schelet în care anumite funcții din load_balancer.c și server.c trebuie implementate. Deoarece cerința impune utilizarea unei arhitecturi cu Consistent Hashing, este crucial să se respecte semnăturile funcțiilor, să se lucreze cu hash ring-ul în memorie și să se gestioneze adăugarea/eliminarea serverelor cu minim impact asupra obiectelor stocate. Tehnic, în teste se verifică cu valgrind că obiectele adăugate respectă proprietățile cerinței, iar în checker se validează distribuția obiectelor pe servere conform regulilor.
Avantaje reale pentru Roby și modelul său de E-Commerce
- Scalabilitate sporită: adăugarea de noi servere nu nevoie de o rearanjare completă a tuturor datelor, ceea ce reduce downtime-ul și traficul de redistribuire.
- Rezistență la eșec: dacă un server e oprit, doar o parte din obiecte sunt remapate către vecini, nu toate datele sistemului.
- Distribuția uniformă a obiectelor: o utilizare echilibrată a resurselor, maximizând eficiența întregului cluster.

Consistent Hashing: Easy Explanation for System Design Interviews
Se poate include și o tabelă pentru a ilustra relația între servere, replici, chei și grupuri de obiecte. Aceasta poate evidenția cum obiectele sunt redistribute la adăugarea unui nou server sau la dispariția unuia.
| Server | Replici pe hash ring | Obiecte redistribuite la schimbare | Acțiune în caz de adăugare/ștergere |
|---|---|---|---|
| 0 | 2 | Ruby, Sapphire | Remapare obiecte către proximități |
| 1 | 2 | Top produse | Actualizare poziții pe ring |
| 2 | 2 | Detalii produse | Recalibrare distribuție |
În implementare, fișierul main.c deja include partea de client și modul în care acesta apelează sistemul distribuit, precum și gestiunea pornirii și opritului serverelor. Prin urmare, sarcina este în principal completarea funcțiilor din load_balancer.c și server.c, folosind semnăturile date, fără a modifica hash-urile existente, pentru a respecta așteptările checker-ului.
tags: #ce #inseamna #echilibrul #sarcinii