OVH Cloud OVH Cloud

2 serveurs, load balancing ou bi-processeur pour un site ?

14 réponses
Avatar
Fred
Bonjour à tous,

J'ai un site en ASP + MySQL hébergé sur un serveur win 2000 server (PIV
2,8GHz, 1Go RAM).

Le cpu du serveur est régulièrement à une charge moyenne de 50 à 65%
(répatri essentiellement entre IIS (45%), MySQL (45%) et Winroute
firewall (10%)).

On a optimisé au mieux nos requetes, et on se pose la question de migrer
d'ici quelques temps vers un autre serveur plus puissant, le trafic du
site ne cessant de croitre.

Quel est le meilleur choix en terme de performance, de fiabilité et de
coût entre les idées suivantes :
- avoir 2 serveurs, un pour la base de données (mySQL) et l'autre pour IIS
- avoir 2 serveurs en load balancing (il me semble qu'il faut avoir win
2000 advanced server ou windows 2003)
- avoir un seul serveur bi-processeur (genre bi-xeon).

Merci pour vos conseils,

@+

Fred

4 réponses

1 2
Avatar
Calimero
R12y wrote:
On Mon, 29 Aug 2005 23:30:41 +0200, Calimero wrote:


Sinon un simple round robin DNS à 0.00Euro suffirait.



Hum. On est certain que le round robin resolve les problèmes de sessions?



En PHP, où les sessions peuvent être basées sur des fichiers, tu peux
partager l'accès au dit répertoire entre tous les noeuds de ton cluster.
Tu peux alors faire du RR. Du coup, même si l'utilisateur bascule sur un
autre serveur, la session peut continuer.

(Serveur Fichier
Sources+Sessions)
/ |
/ |
(Srv Web1) (Srv Web2) (SrvWeb3)
|
|
(Client)


Sur de l'ASP, où les sessions sont purement gérées en mémoire, ce modèle
me parait compromis, par contre.

C'est là qu'un load balancer qui garde un état des connexions s'impose.

(Serveur Fichier:Sources)
/ |
/ |
(Srv Web1) (Srv Web2) (SrvWeb3)
| /
| /
(Load Balancer)
|
|
(Client)

Le client établit une première connexion sur le LB, celui-ci enregistre
l'info dans une mémoire cache et forwarde vers un des noeuds/serveurs.
Les connexions suivantes seront alors dirigées par le LB vers le même
serveur après vérification dans la table de correspondance. Il est aussi
possible de faire ces redirections pour tout un subnet au lieu d'une
seule IP, dans le cas où ce sont des proxies côté client qui se connectent.
Dans cette configuration, les serveurs web ne sont pas directement
visibles par l'utilisateur.
Le serveur de fichier n'est pas indispensable, aussi.

Enfin bon, à confirmer par "quelqu'un qui sait", n'ayant pas encore eu
l'occasion de vraiment jouer avec tout ca.

--
@+
Calimero


Avatar
Patrick Mevzek
En PHP, où les sessions peuvent être basées sur des fichiers, tu peux
partager l'accès au dit répertoire entre tous les noeuds de ton cluster.
Tu peux alors faire du RR. Du coup, même si l'utilisateur bascule sur un
autre serveur, la session peut continuer.


Et si on ne veut pas partager un répertoire, on met les sessions dans une
base de données, ou un cache comme memcached (mais sans garantie de
persistence).

C'est là qu'un load balancer qui garde un état des connexions s'impose.


Le problème c'est que les sessions ne sont pas nécessairement gérées
par des cookies, et que dans tous les cas de figure il faut que le
répartiteur de charge implémente HTTP pour décoder les bouts importants.
Donc SPOF potentiel, risque de problèmes (style débordement de buffer),
et bien sûr impact en performances.

Le problème du DNS RR c'est que ca ne prend pas en compte:
- des serveurs de puissance différentes (statistiquement chacun
récupère autant)
- un basculement vers un serveur qui marche quand l'actuel lâche
(vu que le client conserve l'IP pendant un certain temps)
- la prise en compte des défaillances des serveurs, avant de leur envoyer
des requêtes
- une répartition entre les serveurs basée sur l'URL par exemple,
pour spécialiser certains serveurs à certaines tâches.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>

Avatar
Calimero
Patrick Mevzek wrote:

Et si on ne veut pas partager un répertoire, on met les sessions dans une
base de données, ou un cache comme memcached (mais sans garantie de
persistence).


Disons que les sessions HTTP ayant de toute façon une nature assez peu
éternelle, c'est pas forcément dramatique.

Le problème c'est que les sessions ne sont pas nécessairement gérées
par des cookies, et que dans tous les cas de figure il faut que le
répartiteur de charge implémente HTTP pour décoder les bouts importants.
Donc SPOF potentiel, risque de problèmes (style débordement de buffer),
et bien sûr impact en performances.


Mhhhh si on travaille au niveau IP (ou subnet, pour gérer en partie le
problème des proxies), à mon sens le problème disparaît.

x.x.x.x initie une connexion vers le LB, celui-ci redirige vers le noeud
numéro 1.
x.x.x.x initie une nouvelle connexion vers le LB, celui-ci, grâce à sa
hash table de correspondance rebalance vers le même noeud numéro 1.

Du coup, t'es relativement indépendant du protocole utilisé.

Il me semble que linux-HA (heartbeat) travaille comme ca.

Je t'accorde qu'en cas de perte d'un noeud, les sessions associées
tombent et les clients doivent relancer leur session (après le
basculement automatique vers un autre noeud).

Effectivement, le load balancer devient un point critique alors, c'est
vrai. Je suppose qu'on peut clusteriser le load balancer, ou au moins
avoir un hotspare... (mon + fake ?)

Le problème du DNS RR c'est que ca ne prend pas en compte:
- des serveurs de puissance différentes (statistiquement chacun
récupère autant)


Augmenter la pondération des serveurs les plus puissants (multiples
enregistrements) ?

- un basculement vers un serveur qui marche quand l'actuel lâche
(vu que le client conserve l'IP pendant un certain temps)


Effectivement, faut bien régler le TTL... un compromis comme toujours...

- la prise en compte des défaillances des serveurs, avant de leur envoyer
des requêtes


On pourrait imaginer un DNS intelligent, mais on s'éloigne du simple RR
des familles...

- une répartition entre les serveurs basée sur l'URL par exemple,
pour spécialiser certains serveurs à certaines tâches.


Séparer le contenu statique du contenu dynamique par ex ? Un serveur
pour les images ?
Ca ne demande que peu de "technologie", effectivement

Disons que le RR a globalement l'avantage du coût et une relative
simplicité, par rapport aux solutions utilisant un LB intermédiaire.


--
@+
Calimero, qui aimerait vraiment tester la chose, au lieu de juste
pouvoir lire des docs ;-)

Avatar
Patrick Mevzek
Et si on ne veut pas partager un répertoire, on met les sessions dans une
base de données, ou un cache comme memcached (mais sans garantie de
persistence).


Disons que les sessions HTTP ayant de toute façon une nature assez peu
éternelle, c'est pas forcément dramatique.


Quand elles sont utilisées pour l'authentification... c'est dommage de
les perdre, non ?

Le problème c'est que les sessions ne sont pas nécessairement
gérées par des cookies, et que dans tous les cas de figure il faut
que le répartiteur de charge implémente HTTP pour décoder les bouts
importants. Donc SPOF potentiel, risque de problèmes (style
débordement de buffer), et bien sûr impact en performances.


Mhhhh si on travaille au niveau IP (ou subnet, pour gérer en partie le
problème des proxies), à mon sens le problème disparaît.


Parce que les données de session sont au niveau IP ?
(je parle du numéro de session, soit dans l'URL soit dans un cookie).

Se baser sur l'IP du client c'est tout sauf statistiquement satisfaisant
(les 256^4 adresses IP n'ont pas le même usage) d'une part. D'autre part
plusieurs client peuvent avoir la même IP (passage par un proxy), une IP
peut changer en cours de session (IP dynamique, proxy anonymisant ou non,
etc...), bref partir de l'idée 1 client = 1 ip, c'est une erreur
classique, et cela revient vous hanter plus tard... quand c'est trop tard
(pour corriger tous les programmes qui font cette hypothèse foireuse)

Je t'accorde qu'en cas de perte d'un noeud, les sessions associées
tombent et les clients doivent relancer leur session (après le
basculement automatique vers un autre noeud).


Ce qui fait beaucoup de travail pour gérer un événement somme toute
ordinaire.

Le problème du DNS RR c'est que ca ne prend pas en compte: - des
serveurs de puissance différentes (statistiquement chacun récupère
autant)


Augmenter la pondération des serveurs les plus puissants (multiples
enregistrements) ?


Je doute que cela fonctionne.

- un basculement vers un serveur qui marche quand l'actuel lâche (vu
que le client conserve l'IP pendant un certain temps)


Effectivement, faut bien régler le TTL... un compromis comme
toujours...


Sauf que compromis il ne peut y avoir là. Pour que ca marche il faut un
TTL de 0, ce qui est tout sauf très satisfaisant question trafic.

- la prise en compte des défaillances des serveurs, avant de leur
envoyer des requêtes


On pourrait imaginer un DNS intelligent, mais on s'éloigne du simple RR
des familles...


C'est mélanger les tâches. Le DNS c'est la traduction IP vers nom et
réciproquement, point final. Le reste se passe à d'autres couches.

- une répartition entre les serveurs basée sur l'URL par exemple,
pour spécialiser certains serveurs à certaines tâches.


Séparer le contenu statique du contenu dynamique par ex ? Un serveur
pour les images ?


Par exemple. Ou les clients payants des clients gratuits. Ou le forum du
site, et le reste. Etc... etc...

Disons que le RR a globalement l'avantage du coût et une relative
simplicité, par rapport aux solutions utilisant un LB intermédiaire.


Personnellement, je suis partisan des reverse proxy. Et si on va se
protéger de leur chute, plusieurs en DNS RR, par exemple.

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>


1 2