Cherche solution de load balancing

kortex
2015-08-29T18:37:16+02:00
Linux.général, répartition, charge, mongodb, balancing

Bonjour,

Je travaille actuellement sur un site Internet qui devra, entre autre, héberger beaucoup de vidéos.
Je vais commencer avec 4 serveurs :
- 2 machines qui hébergent le site Internet + la base de données SQL
- 2 machines qui hébergent les fichiers (MongoDB) et qui ont chacune l'ensemble des données

Mon problème est de faire un load balancing fiable, avec notion de poids (à terme toutes les machines n'auront pas forcément la même puissance) et bascule rapide.
Je bloque un peu sur la solution à mettre en œuvre.

J'ai d'abord réfléchi à un proxy WEB qui dirige le flux vers N machines mais le problème est la réponse vers le client. En effet, si la machine PROXY dirige le flux vers DOWNLOAD1 et DOWNLOAD2 mais que le retour de DOWNLOAD1 et DOWNLOAD2 traverse PROXY alors le goulot d'étranglement est au niveau de PROXY. Admettons que l'hébergeur fournisse 100 Mbps par machine j'ai bien 200 Mbps de flux possible mais réduit à 100 Mbps en traversant PROXY.
Du coup, première question : est-il possible de dire à Apache de retourner la réponse directement à l'utilisateur et non au proxy ? L'idéal serait même d'avoir un proxy sur DOWNLOAD1 qui envoie sur l'Apache de DOWNLOAD1 et un proxy sur DOWNLOAD2 qui envoie sur l'Apache de DOWNLOAD2 pour éviter d'exposer Apache. Le schéma serait donc :
=> PROXY GENERAL => PROXY DOWNLOAD1 => APACHE1 => client
=> PROXY GENERAL => PROXY DOWNLOAD2 => APACHE2 => client

L'avantage de cette solution est de répartir la charge vers N serveurs. Au début j'en aurais que 2 mais à terme si j'ai 10 serveurs et qu'un est HS, alors les 9 autres se répartissent sa charge.

J'ai ensuite réfléchi à une solution via le DNS et les entrées de type SRV. Dans ce cas de figure je pense allouer des adresses IP supplémentaires au serveur et en cas de défaillance d'un nœud je bascule son adresse IP sur une autre machine le temps de rétablir le service.
Cette solution a un inconvénient : dans l'exemple juste avant (10 machines ; 1 HS) c'est pas 9 machines qui se répartissent le boulot mais UNE machine qui va devoir bosser double.

Si la solution Apache n'est pas possible, vous auriez une autre solution à me suggérer ?
Je vous remercie d'avance.