-
load balancing en C++
Bonjour � tous.
Je m'interresse au load balancing pour du http. J'ai trouv� des solutions telles que mod_proxy_balancer qui semble pratique et simple, mais par curiosit� et plaisir j'ai envie de me casser la t�te et gerer �a moi m�me si possible.
Je me suis pos� la question de la faisabilit� d'un mini serveur qui ecouterait sur le port 80 et qui transmettrait la requette � un serveur (parmis plusieurs) back-end.
J'ai pens� � betement dupliquer les actions :
Quand je recois une connection d'un client j'en ouvre une vers l'un des back-end
quand je recois des paquets je les envoie au backend
quand le backend transmet, je transmet au client
si le back end ou le client ferme la connection, je ferme aussi l'autre.
Par contre avec cette methode le serveur back-end qui recoit la requette aura comme IP celle du serveur qui faira le loadbalancing et �a c'est problematique.
Ma question est donc est-ce qu'il est possible avec des socket � partir d'un prog C++ de transmettre une requette de facon transparnte comme si c'etait le client lui m�me qui le faisait !?
Merci � vous !
-
Il y a de multiples techniques pour r�partir la charge entre plusieurs servers. Elles diff�rent selon le niveau de la couche protocolaire � partir de laquelle la r�partition de charge s'effectue (applicatif, IP,...).
Si on souhaite faire un r�partiteur de charge qui permettent au serveur �lu de r�pondre directement au client...
C'est possible.... Ca s'appelle m�me "load balancing with direct return" et une impl�mentation � regarder peut �tre "Linux Virtual Server".
Ceci dit, les sockets sont abstraction "end-to-end": lorsque le serveur "accept"e la connexion, la couche TCP/IP aura effectu� des associations (adresses, ports entre la source et la destination) qu'il sera difficile de d�faire, modifier de fa�on transparente.
Comme pour faire un "direct return", il faut au moins modifier l'addresse de la source (remplacer celle du r�partiteur de charge par celle du client), les sockets sont trop "hautes" dans la pile protocolaire. A ce niveau, on pourra impl�menter un r�partiteur des connexions IP entre les diff�rents serveurs (un proxy).
- W
-
Et q'en est-il des raw socket ?
Pour moi ce qui serait g�nial c'est de pouvoir instentanement controler la charge d'un serveur par rapport � un autre sans avoir � relancer un quelconque service. Je pourai du coup faire mon propre algo pour gerer la charge en fonction de ce que j'ai envie. Alors que si je passe par un proxy je vois pas trop� comment le gerer moi m�me :/
-
Les raw sockets permettent d'attaquer le probl�me au niveau IP. C'est "mieux" puisqu'on pourra dans ce cas re-�crire l'adresse de la source.
Ceci dit, il y a un gros travail de conception � faire: comment se fait la r�partition de charge, l'election du serveur le moins charg�, le retour direct.
Difficile (� priori) de faire cela sans acc�der aux adresses MAC, et je ne suis pas s�r que les raw sockets suffisent pour aller si bas.
C�t� libraries, il faut sans doute regarder libpcap (qui permet aussi d'exp�dier ses propres paquets).
- W
-
En fait, je pense que tu as besoin de te comporter au mieux comme un routeur. Il te faut descendre assez bas pour r�partir la charge, probablement jusqu'au niveau ethernet pour maintenir les diff�rentes @IP.
-
C'est bien ce que je pensais, mais VLS et le mod_proxy_balancing le font ! Du coup je me suis dit qu'il devait etre possible de le faire simplement !