Pour ceux qui arriveraient ici sans savoir ce qu'est un ServerIron, il s'agit d'un load-balancer (répartiteur de charge) de marque Foundry. Cet équipement est généralement utilisé comme serveur Web "virtuel" placé en frontal, redistribuant les requêtes à un ou plusieurs serveurs Web "réels". Cela permet non seulement de répartir la charge entre plusieurs machines, mais également d'assurer une certain forme de haute disponibilité (High Availability ou HA) puisque cet équipement sait détecter la bonne santé des serveurs "réels", et répartir les requêtes sur les serveurs fonctionnels.
Comme indiqué précédemment, la configuration par défaut n'implique qu'un seul virtuel, qui aura ici comme adresse externe 10.0.0.1 et 192.168.0.1 comme adresse interne, et par exemple deux serveurs réels, 192.168.0.51 et 192.168.0.52. En imaginant que nous ne répartissons que le protocole HTTP sur le port 80, la configuration se rapportant à ce serveur virtuel se présenterait ainsi :
server real cluster1-1 192.168.0.51
weight 1 0
port http
server real cluster1-2 192.168.0.52
weight 1 0
port http
server virtual cluster1 10.0.0.1
predictor weighted
port http
bind http cluster1-1 http cluster1-2 http
Imaginons maintenant que nous avons besoin de créer un second serveur virtuel, 10.0.0.2, qui utilisera les mêmes serveurs réels que le premier, également sur le port http. La configuration qui vient naturellement à l'esprit est la suivante :
server real cluster1-1 192.168.0.51
weight 1 0
port http
server real cluster1-2 192.168.0.52
weight 1 0
port http
server virtual cluster1 10.0.0.1
predictor weighted
port http
bind http cluster1-1 http cluster1-2 http
server virtual cluster2 10.0.0.2
predictor weighted
port http
bind http cluster1-1 http cluster1-2 http
Sauf que cela ne fonctionne pas. Le ServerIron vous indique poliment que le port http de ces deux serveurs est déjà lié à un autre serveur virtuel. Cette limitation est dûe à la façon dont les ports sont liés entre eux au niveau de la table de translation du ServerIron. Il est donc nécessaire de ruser, en indiquant un autre port de destination (180 dans notre exemple) sur les serveurs réels, de la manière suivante :
server real cluster1-1 192.168.0.51
weight 1 0
port http
port 180
server real cluster1-2 192.168.0.52
weight 1 0
port http
port 180
server virtual cluster1 10.0.0.1
predictor weighted
port http
bind http cluster1-1 http cluster1-2 http
server virtual cluster2 10.0.0.2
predictor weighted
port http
bind http cluster1-1 180 cluster1-2 180
Là, pas d'erreurs, ces ports ne sont pas déjà utilisés donc tout se passe bien. Mais bien sûr, il n'est pas question de faire tourner votre serveur Web sur des ports différents sur les serveurs réels. Vous devez donc utiliser la directive
no port <port> translate. Cette directive permet d'indiquer au ServerIron qu'il ne doit pas tenir de compte du port de destination que vous avez indiqué, mais bien utiliser le même port que celui sur lequel les requêtes arrivent au serveur virtuel. La configuration devient donc :
server real cluster1-1 192.168.0.51
weight 1 0
port http
port 180
server real cluster1-2 192.168.0.52
weight 1 0
port http
port 180
server virtual cluster1 10.0.0.1
predictor weighted
port http
bind http cluster1-1 http cluster1-2 http
server virtual cluster2 10.0.0.2
predictor weighted
port http
no port http translate
bind http cluster1-1 180 cluster1-2 180
De cette façon, les requêtes arrivant sur le port http du ServerIron à l'adresse 10.0.0.2 seront donc bien renvoyées vers les ports http des serveurs réels.
J'ai essayé de rendre cette explication la plus claire possible, mais n'hésitez pas à vous réferrer à
la documentation[1] si ce n'était pas le cas, voir la rubrique
Many-To-One TCP/UDP Port Binding.
[1] http://www.foundrynetworks.co.jp/services/documentation/siug/ServerIron_Server_Load_Balancing.html