eduard0167/Load-Balancer
Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Repository files navigation
// Copyright 2021 Mitroi Eduard Ionut
----------------------------- Load balancer -----------------------------------
Continut:
-main.c : main-ul programului, simuleaza partea ce tine de client (apeleaza)
sistemul distribuit).
-load_balancer.c - load_balancer.h : functiile care se ocupa de logica
sistemului
-server.c - server.h : functiile care se ocupa de operatiile pe servere
-Array.c - Array.h : contine functii care ajuta la implementarea unui vector
ordonat crescator.
-Hashtable.c Hashtable.h : implementarea dictionarului.
-LinkedList.c - LinkedList.h : implementarea listei simplu inlatuite
utilizate in implementarea dictionarului.
-Utils.h : functia DIE pentru verificarea posibilelor erori din program.
-Makefile
-README
Implementare:
Pentru reprezentarea sistemul distribuit am folososit doua structuri
principale: load_balancer si server_memory.
- Structura load balancer contine un array de servere, un hashring care
contine etichetele replicilor ordonate crescator si numarul de elemente
din hashring.
- Structura server_memory contine un hashtable, structura dictionarului
continand toti parametrii necesari serverului. Din acest motiv, in server.c
functiile legate de server doar apeleaza functiile implementate pentru
dictionar.
Pentru implementarea hashring-ului am utilizat functiile din Array. a insera
si a elimina elemente din array, pastrand vectorul ordanat crescator, si o
functie de cautare binara care imi returneaza pozitia primului element mai
mare sau egal decat un element dat.
Functiile de retrieve si store din load_balancer.c sunt destul de simple:
prin cautare binara gasesc prima eticheta care are hash-ul mai mare decat
cel al cheii, dupa care sunt apelate functiile din server.c pentru a stoca /
returna elementul dorit in functie de cheia sa (adica, sunt apelate
functiile ht_put si ht_get pe serverul respectiv).
Pentru a mentine sistemul distribuit uniform dupa adaugarea / eliminarea unui
server, este realizata realocarea elementelor pentru fiecare dintre replicile
unui server. Se utilizeaza aceeasi functie de realocarea in ambele cazuri,
diferenta fiind la apelarea functie, pentru care se tine cont de un paramatru
command care indica tipul operatie si alege serverul sursa si cel destinatie
(sunt inversate la adaugare fata de eliminare).
Ideea este urmatoarea: sunt gasite etichetele vecine unei etichete primite ca
parametru, iar conditia generala este ca hash-ul cheii elementului din sursa
sa se afle intre hash-ul etichetei anteriore si hash-ul destinatie pentru a
realiza realocarea. Din cauza folosirii unui array care are element de la 0
n - 1, in situatia in care sursa este cel mai mare element sau cel mai mic,
conditia este modificata.