-
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 !