Article de reference

Équilibrage de charge (informatique)

Diagramme illustrant les requêtes des utilisateurs adressées à un cluster Elasticsearch et distribuées par un équilibreur de charge. (Exemple pour Wikipédia .) En informatique ,...

Diagramme illustrant les requêtes des utilisateurs adressées à un cluster Elasticsearch et distribuées par un équilibreur de charge. (Exemple pour Wikipédia .)

En informatique , l'équilibrage de charge est le processus de répartition d'un ensemble de tâches sur un ensemble de ressources (unités de calcul), dans le but de rendre leur traitement global plus efficace. L'équilibrage de charge peut optimiser le temps de réponse et éviter de surcharger de manière inégale certains nœuds de calcul tandis que d'autres nœuds de calcul restent inactifs.

L'équilibrage de charge fait l'objet de recherches dans le domaine des ordinateurs parallèles . Deux grandes approches existent : les algorithmes statiques, qui ne prennent pas en compte l'état des différentes machines, et les algorithmes dynamiques, généralement plus généraux et plus efficaces mais qui nécessitent des échanges d'informations entre les différentes unités de calcul, au risque d'une perte d'efficacité.

Aperçu du problème

Un algorithme d'équilibrage de charge tente toujours de répondre à un problème spécifique. Il faut notamment tenir compte de la nature des tâches, de la complexité algorithmique , de l'architecture matérielle sur laquelle les algorithmes s'exécuteront ainsi que de la tolérance aux erreurs requise . Il faut donc trouver un compromis pour répondre au mieux aux exigences spécifiques de l'application.

Nature des tâches

L'efficacité des algorithmes d'équilibrage de charge dépend essentiellement de la nature des tâches. Par conséquent, plus les informations sur les tâches sont disponibles au moment de la prise de décision, plus le potentiel d'optimisation est grand.

Taille des tâches

La connaissance parfaite du temps d'exécution de chacune des tâches permet d'atteindre une répartition de charge optimale (voir algorithme de somme de préfixes ). Malheureusement, il s'agit en fait d'un cas idéalisé. Connaître le temps d'exécution exact de chaque tâche est une situation extrêmement rare.

Pour cette raison, il existe plusieurs techniques pour se faire une idée des différents temps d'exécution. Tout d'abord, dans le cas où les tâches sont de taille relativement homogène, il est possible de considérer que chacune d'elles nécessitera approximativement le temps d'exécution moyen. Si, au contraire, le temps d'exécution est très irrégulier, il faut utiliser des techniques plus sophistiquées. Une technique consiste à ajouter des métadonnées à chaque tâche. En fonction du temps d'exécution précédent pour des métadonnées similaires, il est possible de faire des inférences pour une tâche future en se basant sur des statistiques.

Dépendances

Dans certains cas, les tâches dépendent les unes des autres. Ces interdépendances peuvent être illustrées par un graphe acyclique orienté . Intuitivement, certaines tâches ne peuvent pas commencer tant que d'autres ne sont pas terminées.

En supposant que le temps requis pour chacune des tâches soit connu à l'avance, un ordre d'exécution optimal doit conduire à la minimisation du temps d'exécution total. Bien qu'il s'agisse d'un problème NP-difficile et qu'il puisse donc être difficile à résoudre avec précision, il existe des algorithmes, comme le planificateur de tâches , qui calculent les distributions de tâches optimales à l'aide de méthodes métaheuristiques .

Séparation des tâches

Une autre caractéristique des tâches critiques pour la conception d'un algorithme d'équilibrage de charge est leur capacité à être décomposées en sous-tâches lors de leur exécution. L'algorithme « Tree-Shaped Computation » présenté plus loin tire largement parti de cette spécificité.

Algorithmes statiques et dynamiques

Statique

Un algorithme d'équilibrage de charge est dit « statique » lorsqu'il ne prend pas en compte l'état du système pour la répartition des tâches. L'état du système inclut ainsi des mesures telles que le niveau de charge (et parfois même la surcharge) de certains processeurs. Au lieu de cela, des hypothèses sur l'ensemble du système sont faites au préalable, telles que les heures d'arrivée et les besoins en ressources des tâches entrantes. De plus, le nombre de processeurs, leur puissance respective et leurs vitesses de communication sont connus. Par conséquent, l'équilibrage de charge statique vise à associer un ensemble connu de tâches aux processeurs disponibles afin de minimiser une certaine fonction de performance. L'astuce réside dans le concept de cette fonction de performance.

Les techniques d'équilibrage de charge statique sont généralement centralisées autour d'un routeur, ou Master , qui répartit les charges et optimise la fonction de performance. Cette minimisation permet de prendre en compte des informations liées aux tâches à répartir, et d'en déduire un temps d'exécution attendu.

L'avantage des algorithmes statiques est qu'ils sont simples à mettre en place et extrêmement efficaces dans le cas de tâches assez courantes (comme le traitement de requêtes HTTP d'un site Web). Cependant, il existe toujours une certaine variance statistique dans l'attribution des tâches qui peut conduire à la surcharge de certaines unités de calcul.

Dynamique

Contrairement aux algorithmes de distribution de charge statique, les algorithmes dynamiques prennent en compte la charge actuelle de chacune des unités de calcul (également appelées nœuds) du système. Dans cette approche, les tâches peuvent être déplacées dynamiquement d'un nœud surchargé vers un nœud sous-chargé afin de bénéficier d'un traitement plus rapide. Bien que ces algorithmes soient beaucoup plus compliqués à concevoir, ils peuvent produire d'excellents résultats, en particulier lorsque le temps d'exécution varie fortement d'une tâche à l'autre.

L'architecture d'équilibrage de charge dynamique peut être plus modulaire puisqu'il n'est pas obligatoire d'avoir un nœud spécifique dédié à la répartition du travail. Lorsque les tâches sont assignées de manière unique à un processeur en fonction de leur état à un instant donné, il s'agit d'une assignation unique. Si, au contraire, les tâches peuvent être redistribuées en permanence en fonction de l'état du système et de son évolution, on parle alors d'assignation dynamique. Évidemment, un algorithme d'équilibrage de charge qui nécessite trop de communication pour parvenir à ses décisions risque de ralentir la résolution du problème global.

Architecture matérielle

Machines hétérogènes

Les infrastructures de calcul parallèles sont souvent composées d'unités de puissance de calcul différentes , ce qui doit être pris en compte pour la répartition de la charge.

Par exemple, les unités de faible puissance peuvent recevoir des demandes nécessitant une plus petite quantité de calcul ou, dans le cas de tailles de demande homogènes ou inconnues, recevoir moins de demandes que les unités plus grandes.

Mémoire partagée et distribuée

Les ordinateurs parallèles sont souvent divisés en deux grandes catégories : ceux où tous les processeurs partagent une seule mémoire commune sur laquelle ils lisent et écrivent en parallèle ( modèle PRAM ), et ceux où chaque unité de calcul possède sa propre mémoire ( modèle de mémoire distribuée ), et où les informations sont échangées par messages.

Pour les ordinateurs à mémoire partagée , la gestion des conflits d'écriture ralentit considérablement la vitesse d'exécution individuelle de chaque unité de calcul. Cependant, ils peuvent parfaitement fonctionner en parallèle. A l'inverse, dans le cas d'un échange de messages, chacun des processeurs peut travailler à pleine vitesse. En revanche, lorsqu'il s'agit d'échange de messages collectifs, tous les processeurs sont obligés d'attendre que les processeurs les plus lents démarrent la phase de communication.

En réalité, peu de systèmes entrent exactement dans l'une de ces catégories. En général, les processeurs disposent chacun d'une mémoire interne pour stocker les données nécessaires aux calculs suivants et sont organisés en clusters successifs . Souvent, ces éléments de traitement sont ensuite coordonnés via la mémoire distribuée et le passage de messages . Par conséquent, l'algorithme d'équilibrage de charge doit être adapté de manière unique à une architecture parallèle. Dans le cas contraire, l'efficacité de la résolution parallèle des problèmes risque d'être fortement réduite.

Hiérarchie

En s'adaptant aux structures matérielles vues ci-dessus, il existe deux grandes catégories d'algorithmes d'équilibrage de charge. D'une part, celui où les tâches sont assignées par le « maître » et exécutées par les « travailleurs » qui tiennent le maître informé de l'avancement de leur travail, et le maître peut alors se charger d'assigner ou de réassigner la charge de travail dans le cas de l'algorithme dynamique. La littérature fait référence à cette architecture sous le nom de « Master-Worker » . D'autre part, le contrôle peut être réparti entre les différents nœuds. L'algorithme d'équilibrage de charge est alors exécuté sur chacun d'eux et la responsabilité de l'assignation des tâches (ainsi que de la réassignation et du fractionnement le cas échéant) est partagée. La dernière catégorie suppose un algorithme d'équilibrage de charge dynamique.

La conception de chaque algorithme d'équilibrage de charge étant unique, la distinction précédente doit être nuancée. Ainsi, il est également possible d'avoir une stratégie intermédiaire, avec par exemple des nœuds « maîtres » pour chaque sous-cluster, eux-mêmes soumis à un « maître » global. Il existe également des organisations multi-niveaux, avec une alternance entre des stratégies maître-esclave et de contrôle distribué. Ces dernières stratégies deviennent vite complexes et sont rarement rencontrées. Les concepteurs privilégient des algorithmes plus faciles à contrôler.

Adaptation à des architectures plus grandes (évolutivité)

Dans le cadre d'algorithmes s'exécutant sur le très long terme (serveurs, cloud...), l'architecture informatique évolue au cours du temps. Il est toutefois préférable de ne pas avoir à concevoir un nouvel algorithme à chaque fois.

Un paramètre extrêmement important d'un algorithme d'équilibrage de charge est donc sa capacité à s'adapter à une architecture matérielle évolutive. C'est ce qu'on appelle la scalabilité de l'algorithme. Un algorithme est dit scalable pour un paramètre d'entrée lorsque ses performances restent relativement indépendantes de la taille de ce paramètre.

Lorsque l'algorithme est capable de s'adapter à un nombre variable d'unités de calcul, mais que le nombre d'unités de calcul doit être fixé avant l'exécution, il est dit malléable. Si, en revanche, l'algorithme est capable de gérer un nombre fluctuant de processeurs pendant son exécution, l'algorithme est dit malléable. La plupart des algorithmes d'équilibrage de charge sont au moins malléables.

Tolérance aux pannes

En particulier dans les clusters informatiques à grande échelle , il n'est pas tolérable d'exécuter un algorithme parallèle qui ne peut pas résister à la défaillance d'un seul composant. Par conséquent, des algorithmes tolérants aux pannes sont en cours de développement, capables de détecter les pannes de processeurs et de récupérer le calcul.

Approches

Distribution statique avec une connaissance complète des tâches :somme de préfixe

Si les tâches sont indépendantes les unes des autres, et si leur temps d'exécution respectif et les tâches peuvent être subdivisés, il existe un algorithme simple et optimal.

Algorithme d'équilibrage de charge en fonction de la divisibilité des tâches

En divisant les tâches de manière à donner la même quantité de calcul à chaque processeur, il ne reste plus qu'à regrouper les résultats. En utilisant un algorithme de somme de préfixes , cette division peut être calculée en temps logarithmique par rapport au nombre de processeurs.

Si, toutefois, les tâches ne peuvent pas être subdivisées (c'est-à-dire qu'elles sont atomiques ), bien que l'optimisation de l'affectation des tâches soit un problème difficile, il est toujours possible d'approximer une distribution relativement équitable des tâches, à condition que la taille de chacune d'elles soit bien inférieure au calcul total effectué par chacun des nœuds.

La plupart du temps, le temps d'exécution d'une tâche est inconnu et seules des approximations grossières sont disponibles. Cet algorithme, bien que particulièrement efficace, n'est pas viable pour ces scénarios.

Répartition de charge statique sans connaissances préalables

Même si le temps d'exécution n'est pas du tout connu à l'avance, la répartition statique de la charge est toujours possible.

Programmation à tour de rôle

Dans un algorithme round-robin, la première requête est envoyée au premier serveur, puis la suivante au deuxième, et ainsi de suite jusqu'à la dernière. Ensuite, l'algorithme est relancé, la requête suivante étant attribuée au premier serveur, et ainsi de suite.

Cet algorithme peut être pondéré de telle sorte que les unités les plus puissantes reçoivent le plus grand nombre de requêtes et les reçoivent en premier.

Statique randomisée

L'équilibrage de charge statique aléatoire consiste simplement à attribuer aléatoirement des tâches aux différents serveurs. Cette méthode fonctionne plutôt bien. Si, par contre, le nombre de tâches est connu à l'avance, il est encore plus efficace de calculer à l'avance une permutation aléatoire. Cela évite les coûts de communication pour chaque affectation. Il n'est plus nécessaire d'avoir un maître de distribution car chaque processeur sait quelle tâche lui est attribuée. Même si le nombre de tâches est inconnu, il est toujours possible d'éviter la communication avec une génération d'affectation pseudo-aléatoire connue de tous les processeurs.

La performance de cette stratégie (mesurée en temps total d'exécution pour un ensemble fixe de tâches donné) diminue avec la taille maximale des tâches.

Autres

Bien entendu, il existe également d’autres méthodes d’affectation :

  • Moins de travail : Attribuer plus de tâches aux serveurs en effectuant moins (la méthode peut également être pondérée).
  • Hash : alloue les requêtes selon une table de hachage .
  • Le pouvoir des deux choix : choisissez deux serveurs au hasard et choisissez la meilleure des deux options.

Régime de maître-ouvrier

Les schémas maître-travailleur font partie des algorithmes d'équilibrage de charge dynamique les plus simples. Un maître distribue la charge de travail à tous les travailleurs (parfois aussi appelés « esclaves »). Au départ, tous les travailleurs sont inactifs et le signalent au maître. Le maître répond aux demandes des travailleurs et leur distribue les tâches. Lorsqu'il n'a plus de tâches à donner, il en informe les travailleurs afin qu'ils arrêtent de demander des tâches.

L'avantage de ce système est qu'il répartit la charge de manière très équitable. En effet, si l'on ne prend pas en compte le temps nécessaire à la réalisation de la tâche, le temps d'exécution serait comparable à la somme des préfixes vue ci-dessus.

Le problème de cet algorithme est qu'il a du mal à s'adapter à un grand nombre de processeurs en raison de la quantité importante de communications nécessaires. Ce manque d' évolutivité le rend rapidement inopérant dans de très gros serveurs ou de très gros ordinateurs parallèles. Le maître agit comme un goulot d'étranglement .

Maître-Ouvrier et goulot d'étranglement

Cependant, la qualité de l'algorithme peut être grandement améliorée en remplaçant le maître par une liste de tâches utilisable par différents processeurs. Bien que cet algorithme soit un peu plus difficile à mettre en œuvre, il promet une bien meilleure évolutivité, bien qu'encore insuffisante pour les très grands centres de calcul.

Architecture non hiérarchique, sans connaissance du système :vol de travail

Une autre technique permettant de surmonter les problèmes d’évolutivité lorsque le temps nécessaire à l’achèvement d’une tâche est inconnu est le vol de travail .

L'approche consiste à attribuer à chaque processeur un certain nombre de tâches de manière aléatoire ou prédéfinie, puis à permettre aux processeurs inactifs de « voler » du travail aux processeurs actifs ou surchargés. Plusieurs implémentations de ce concept existent, définies par un modèle de division des tâches et par les règles déterminant les échanges entre processeurs. Si cette technique peut être particulièrement efficace, elle est difficile à mettre en œuvre car il faut veiller à ce que la communication ne devienne pas l'occupation principale des processeurs au lieu de résoudre le problème.

Dans le cas de tâches atomiques, on distingue deux stratégies principales, celles où les processeurs à faible charge offrent leur capacité de calcul à ceux à plus forte charge, et celles où les unités les plus chargées souhaitent alléger la charge de travail qui leur est assignée. Il a été montré que lorsque le réseau est fortement chargé, il est plus efficace que les unités les moins chargées offrent leur disponibilité et lorsque le réseau est peu chargé, ce sont les processeurs surchargés qui demandent le soutien des plus inactifs. Cette règle empirique permet de limiter le nombre de messages échangés.

Dans le cas où l'on part d'une seule grande tâche qui ne peut être divisée au-delà d'un niveau atomique, il existe un algorithme très efficace "Tree-Shaped computation", où la tâche parent est distribuée dans un arbre de travail.

Principe

Au départ, de nombreux processeurs ont une tâche vide, sauf un qui travaille séquentiellement dessus. Les processeurs inactifs émettent des requêtes de manière aléatoire vers d'autres processeurs (pas forcément actifs). Si ce dernier est capable de subdiviser la tâche sur laquelle il travaille, il le fait en envoyant une partie de son travail au nœud qui fait la requête. Sinon, il renvoie une tâche vide. Cela induit une structure arborescente . Il faut alors envoyer un signal de terminaison au processeur parent lorsque la sous-tâche est terminée pour qu'il envoie à son tour le message à son parent jusqu'à atteindre la racine de l'arbre. Lorsque le premier processeur, c'est-à-dire la racine, a terminé, un message de terminaison global peut être diffusé. Au final, il faut assembler les résultats en remontant l'arbre.

Efficacité

L'efficacité d'un tel algorithme est proche de la somme des préfixes lorsque le temps de découpage et de communication des jobs n'est pas trop élevé par rapport au travail à effectuer. Pour éviter des coûts de communication trop élevés, il est possible d'imaginer une liste de jobs sur mémoire partagée . Une requête consiste donc simplement à lire à partir d'une certaine position sur cette mémoire partagée à la demande du processeur maître.

Cas d'utilisation

En plus de la résolution efficace des problèmes grâce à des calculs parallèles, les algorithmes d'équilibrage de charge sont largement utilisés dans la gestion des requêtes HTTP où un site avec une large audience doit être capable de gérer un grand nombre de requêtes par seconde.

Services basés sur Internet

L'une des applications les plus couramment utilisées de l'équilibrage de charge consiste à fournir un service Internet unique à partir de plusieurs serveurs , parfois appelés fermes de serveurs . Les systèmes couramment équilibrés en charge incluent les sites Web populaires , les grands réseaux de messagerie instantanée par relais Internet , les sites FTP ( File Transfer Protocol ) à large bande passante , les serveurs NNTP ( Network News Transfer Protocol ), les serveurs DNS ( Domain Name System ) et les bases de données.

DNS à tour de rôle

Le DNS à tour de rôle est une méthode alternative d'équilibrage de charge qui ne nécessite pas de nœud logiciel ou matériel dédié. Dans cette technique, plusieurs adresses IP sont associées à un seul nom de domaine ; les clients reçoivent une adresse IP de manière circulaire. L'adresse IP est attribuée aux clients avec une expiration courte, de sorte que le client est plus susceptible d'utiliser une adresse IP différente la prochaine fois qu'il accède au service Internet demandé.

Délégation DNS

Une autre technique plus efficace pour équilibrer la charge à l'aide du DNS consiste à déléguer www.exemple.org en tant que sous-domaine dont la zone est desservie par chacun des mêmes serveurs qui servent le site Web. Cette technique fonctionne particulièrement bien lorsque des serveurs individuels sont répartis géographiquement sur Internet. Par exemple :

one.example.org A 192.0.2.1
deux.exemple.org A 203.0.113.2
www.exemple.org NS one.exemple.org
www.exemple.org NS deux.exemple.org

Cependant, le fichier de zone pour www.example.org sur chaque serveur est différent de sorte que chaque serveur résout sa propre adresse IP comme enregistrement A. Sur le serveur un, le fichier de zone pour www.example.org indique :

@ dans un 192.0.2.1

Sur le serveur deux, le même fichier de zone contient :

@ dans un 203.0.113.2

De cette façon, lorsqu'un serveur est en panne, son DNS ne répond pas et le service Web ne reçoit aucun trafic. Si la ligne vers un serveur est encombrée, le manque de fiabilité du DNS garantit que moins de trafic HTTP atteint ce serveur. De plus, la réponse DNS la plus rapide au résolveur est presque toujours celle du serveur le plus proche du réseau, ce qui garantit un équilibrage de charge géo-sensible . Un TTL court sur l'enregistrement A permet de garantir que le trafic est rapidement détourné lorsqu'un serveur tombe en panne. Il faut tenir compte de la possibilité que cette technique puisse amener des clients individuels à basculer entre des serveurs individuels en cours de session.

Équilibrage de charge aléatoire côté client

Une autre approche de l'équilibrage de charge consiste à fournir une liste d'adresses IP de serveur au client, puis à ce que le client sélectionne aléatoirement l'adresse IP dans la liste à chaque connexion. Cela repose essentiellement sur le fait que tous les clients génèrent des charges similaires et sur la loi des grands nombres pour obtenir une distribution de charge raisonnablement uniforme sur les serveurs. Il a été affirmé que l'équilibrage de charge aléatoire côté client tend à fournir une meilleure distribution de charge que le DNS round-robin ; cela a été attribué aux problèmes de mise en cache avec le DNS round-robin, qui dans le cas de gros serveurs de mise en cache DNS, ont tendance à fausser la distribution pour le DNS round-robin, tandis que la sélection aléatoire côté client reste inchangée quelle que soit la mise en cache DNS.

Avec cette approche, la méthode de livraison d'une liste d'adresses IP au client peut varier et peut être implémentée sous forme de liste DNS (livrée à tous les clients sans aucun round-robin), ou via un codage en dur dans la liste. Si un « client intelligent » est utilisé, détectant qu'un serveur sélectionné au hasard est en panne et se connectant à nouveau de manière aléatoire, il offre également une tolérance aux pannes .

Équilibreurs de charge côté serveur

Pour les services Internet, un équilibreur de charge côté serveur est généralement un logiciel qui écoute le port sur lequel les clients externes se connectent pour accéder aux services. L'équilibreur de charge transmet les requêtes à l'un des serveurs « back-end », qui répond généralement à l'équilibreur de charge. Cela permet à l'équilibreur de charge de répondre au client sans que celui-ci ne soit jamais au courant de la séparation interne des fonctions. Cela empêche également les clients de contacter directement les serveurs back-end, ce qui peut présenter des avantages en termes de sécurité en masquant la structure du réseau interne et en empêchant les attaques sur la pile réseau du noyau ou sur des services non liés exécutés sur d'autres ports.

Certains équilibreurs de charge fournissent un mécanisme permettant d'effectuer une action spéciale dans le cas où tous les serveurs principaux ne sont pas disponibles. Cela peut inclure la transmission à un équilibreur de charge de secours ou l'affichage d'un message concernant la panne.

Il est également important que l'équilibreur de charge lui-même ne devienne pas un point de défaillance unique . En général, les équilibreurs de charge sont implémentés dans des paires à haute disponibilité qui peuvent également répliquer les données de persistance de session si l'application spécifique l'exige. Certaines applications sont programmées avec une immunité à ce problème, en décalant le point d'équilibrage de charge sur des plates-formes de partage différentielles au-delà du réseau défini. Les algorithmes séquentiels associés à ces fonctions sont définis par des paramètres flexibles propres à la base de données spécifique.

Algorithmes de planification

De nombreux algorithmes de planification , également appelés méthodes d'équilibrage de charge, sont utilisés par les équilibreurs de charge pour déterminer à quel serveur principal envoyer une requête. Les algorithmes simples incluent le choix aléatoire, le round robin ou le nombre minimal de connexions. Les équilibreurs de charge plus sophistiqués peuvent prendre en compte des facteurs supplémentaires, tels que la charge signalée par un serveur, les temps de réponse les plus courts, l'état de fonctionnement/d'arrêt (déterminé par un sondage de surveillance quelconque), le nombre de connexions actives, l'emplacement géographique, les capacités ou le volume de trafic qui lui a été récemment attribué.

Persistance

Un problème important lors de l'exploitation d'un service à charge équilibrée est la manière de gérer les informations qui doivent être conservées entre les multiples requêtes de la session d'un utilisateur. Si ces informations sont stockées localement sur un serveur principal, les requêtes ultérieures envoyées vers différents serveurs principaux ne pourront pas les trouver. Il peut s'agir d'informations mises en cache qui peuvent être recalculées, auquel cas l'équilibrage de charge d'une requête vers un autre serveur principal introduit simplement un problème de performances.

Idéalement, le cluster de serveurs derrière l'équilibreur de charge ne doit pas être sensible aux sessions, de sorte que si un client se connecte à un serveur principal à tout moment, l'expérience utilisateur n'est pas affectée. Cela est généralement réalisé avec une base de données partagée ou une base de données de session en mémoire comme Memcached .

Une solution de base au problème des données de session consiste à envoyer toutes les requêtes d'une session utilisateur de manière cohérente au même serveur principal. C'est ce qu'on appelle la « persistance » ou la « persistance ». Un inconvénient majeur de cette technique est l'absence de basculement automatique : si un serveur principal tombe en panne, ses informations par session deviennent inaccessibles et toutes les sessions qui en dépendent sont perdues. Le même problème se pose généralement pour les serveurs de bases de données centrales ; même si les serveurs Web sont « sans état » et non « persistants », la base de données centrale l'est (voir ci-dessous).

L'affectation à un serveur particulier peut être basée sur un nom d'utilisateur, une adresse IP client ou aléatoire. En raison des changements dans l'adresse perçue du client résultant du DHCP , de la traduction d'adresses réseau et des proxys Web , cette méthode peut ne pas être fiable. Les affectations aléatoires doivent être mémorisées par l'équilibreur de charge, ce qui crée une charge sur le stockage. Si l'équilibreur de charge est remplacé ou tombe en panne, ces informations peuvent être perdues et les affectations peuvent devoir être supprimées après un délai d'expiration ou pendant les périodes de charge élevée pour éviter de dépasser l'espace disponible pour la table d'affectation. La méthode d'affectation aléatoire nécessite également que les clients conservent un certain état, ce qui peut être un problème, par exemple lorsqu'un navigateur Web a désactivé le stockage des cookies. Les équilibreurs de charge sophistiqués utilisent plusieurs techniques de persistance pour éviter certains des défauts de n'importe quelle méthode.

Une autre solution consiste à conserver les données par session dans une base de données . Cela nuit généralement aux performances car cela augmente la charge sur la base de données : la base de données est mieux utilisée pour stocker des informations moins transitoires que les données par session. Pour éviter qu'une base de données ne devienne un point de défaillance unique et pour améliorer l'évolutivité , la base de données est souvent répliquée sur plusieurs machines et l'équilibrage de charge est utilisé pour répartir la charge de requête sur ces répliques. La technologie ASP.net State Server de Microsoft est un exemple de base de données de session. Tous les serveurs d'une batterie de serveurs Web stockent leurs données de session sur State Server et n'importe quel serveur de la batterie de serveurs peut récupérer les données.

Dans le cas très courant où le client est un navigateur Web, une approche simple mais efficace consiste à stocker les données par session dans le navigateur lui-même. Une façon d'y parvenir est d'utiliser un cookie de navigateur , horodaté et chiffré de manière appropriée. Une autre solution consiste à réécrire l'URL . Le stockage des données de session sur le client est généralement la solution préférée : l'équilibreur de charge est alors libre de choisir n'importe quel serveur principal pour gérer une requête. Cependant, cette méthode de gestion des données d'état est mal adaptée à certains scénarios de logique métier complexes, où la charge utile de l'état de session est importante et où il n'est pas possible de la recalculer à chaque requête sur un serveur. La réécriture d'URL présente des problèmes de sécurité majeurs, car l'utilisateur final peut facilement modifier l'URL soumise et ainsi modifier les flux de session.

Une autre solution pour stocker des données persistantes consiste à associer un nom à chaque bloc de données et à utiliser une table de hachage distribuée pour attribuer de manière pseudo-aléatoire ce nom à l'un des serveurs disponibles, puis à stocker ce bloc de données sur le serveur attribué.

Fonctionnalités de l'équilibreur de charge

Les équilibreurs de charge matériels et logiciels peuvent avoir diverses fonctionnalités spéciales. La caractéristique fondamentale d'un équilibreur de charge est de pouvoir distribuer les requêtes entrantes sur un certain nombre de serveurs principaux du cluster selon un algorithme de planification. La plupart des fonctionnalités suivantes sont spécifiques au fournisseur :

Charge asymétrique
Un ratio peut être attribué manuellement pour que certains serveurs principaux obtiennent une plus grande part de la charge de travail que d'autres. Cette méthode est parfois utilisée de manière approximative pour tenir compte du fait que certains serveurs ont plus de capacité que d'autres et peut ne pas toujours fonctionner comme souhaité.
Activation prioritaire
Lorsque le nombre de serveurs disponibles descend en dessous d'un certain nombre ou que la charge devient trop élevée, des serveurs de secours peuvent être mis en ligne.
Déchargement et accélération TLS
L'accélération TLS (ou son prédécesseur SSL) est une technique de déchargement des calculs de protocole cryptographique sur du matériel spécialisé. Selon la charge de travail, le traitement des exigences de chiffrement et d'authentification d'une requête TLS peut devenir une partie importante de la demande sur le processeur du serveur Web. À mesure que la demande augmente, les utilisateurs verront des temps de réponse plus lents, car la surcharge TLS est répartie entre les serveurs Web. Pour supprimer cette demande sur les serveurs Web, un équilibreur peut mettre fin aux connexions TLS, en transmettant les requêtes HTTPS sous forme de requêtes HTTP aux serveurs Web. Si l'équilibreur lui-même n'est pas surchargé, cela ne dégrade pas sensiblement les performances perçues par les utilisateurs finaux. L'inconvénient de cette approche est que tout le traitement TLS est concentré sur un seul périphérique (l'équilibreur), ce qui peut devenir un nouveau goulot d'étranglement. Certains appareils d'équilibrage de charge incluent du matériel spécialisé pour traiter TLS. Au lieu de mettre à niveau l'équilibreur de charge, qui est un matériel dédié assez coûteux, il peut être moins coûteux de renoncer au déchargement TLS et d'ajouter quelques serveurs Web. De plus, certains fournisseurs de serveurs tels qu'Oracle/Sun intègrent désormais du matériel d'accélération cryptographique dans leurs processeurs tels que le T2000. F5 Networks intègre une carte matérielle d'accélération TLS dédiée dans son gestionnaire de trafic local (LTM) qui est utilisée pour crypter et décrypter le trafic TLS. L'un des avantages évidents du déchargement TLS dans l'équilibreur est qu'il lui permet d'effectuer un équilibrage ou une commutation de contenu en fonction des données de la requête HTTPS.
Protection contre les attaques par déni de service distribué (DDoS)
Les équilibreurs de charge peuvent fournir des fonctionnalités telles que les cookies SYN et la liaison différée (les serveurs principaux ne voient pas le client tant qu'il n'a pas terminé son échange TCP) pour atténuer les attaques par inondation SYN et généralement décharger le travail des serveurs vers une plate-forme plus efficace.
Compression HTTP
La compression HTTP réduit la quantité de données à transférer pour les objets HTTP en utilisant la compression gzip disponible dans tous les navigateurs Web modernes. Plus la réponse est importante et plus le client est éloigné, plus cette fonctionnalité peut améliorer les temps de réponse. Le compromis est que cette fonctionnalité impose une demande de CPU supplémentaire à l'équilibreur de charge et pourrait être effectuée par les serveurs Web à la place.
Déchargement TCP
Différents fournisseurs utilisent des termes différents pour cela, mais l'idée est que normalement chaque requête HTTP de chaque client correspond à une connexion TCP différente. Cette fonctionnalité utilise HTTP/1.1 pour consolider plusieurs requêtes HTTP de plusieurs clients dans un seul socket TCP vers les serveurs principaux.
Mise en mémoire tampon TCP
L'équilibreur de charge peut mettre en mémoire tampon les réponses du serveur et transmettre les données aux clients lents, permettant ainsi au serveur Web de libérer un thread pour d'autres tâches plus rapidement que s'il devait envoyer l'intégralité de la demande directement au client.
Retour direct du serveur
Une option pour la distribution de charge asymétrique, où la demande et la réponse ont des chemins réseau différents.
Bilan de santé
L'équilibreur interroge les serveurs pour vérifier l'état de la couche application et supprime les serveurs défaillants du pool.
Mise en cache HTTP
L'équilibreur stocke du contenu statique afin que certaines requêtes puissent être traitées sans contacter les serveurs.
Filtrage de contenu
Certains équilibreurs peuvent modifier arbitrairement le trafic en cours de route.
Sécurité HTTP
Certains équilibreurs peuvent masquer les pages d’erreur HTTP, supprimer les en-têtes d’identification du serveur des réponses HTTP et crypter les cookies afin que les utilisateurs finaux ne puissent pas les manipuler.
File d'attente prioritaire
Également connu sous le nom de « rate shaping » , c'est la capacité à donner des priorités différentes à différents trafics.
Commutation en fonction du contenu
La plupart des équilibreurs de charge peuvent envoyer des requêtes à différents serveurs en fonction de l'URL demandée, en supposant que la requête n'est pas chiffrée (HTTP) ou si elle est chiffrée (via HTTPS), que la requête HTTPS est terminée (déchiffrée) au niveau de l'équilibreur de charge.
Authentification du client
Authentifiez les utilisateurs à l’aide de diverses sources d’authentification avant de leur autoriser l’accès à un site Web.
Manipulation programmatique du trafic
Au moins un équilibreur permet l'utilisation d'un langage de script pour autoriser des méthodes d'équilibrage personnalisées, des manipulations de trafic arbitraires, etc.
Pare-feu
Les pare-feu peuvent empêcher les connexions directes aux serveurs principaux, pour des raisons de sécurité du réseau.
Système de prévention des intrusions
Les systèmes de prévention des intrusions offrent une sécurité au niveau de la couche applicative en plus de la sécurité au niveau de la couche réseau/transport offerte par le pare-feu.

Télécommunications

L'équilibrage de charge peut être utile dans les applications avec des liaisons de communication redondantes. Par exemple, une entreprise peut disposer de plusieurs connexions Internet garantissant l'accès au réseau en cas de défaillance de l'une des connexions. Un dispositif de basculement signifie qu'une liaison est désignée pour une utilisation normale, tandis que la seconde liaison n'est utilisée qu'en cas de défaillance de la liaison principale.

Grâce à l'équilibrage de charge, les deux liens peuvent être utilisés en permanence. Un périphérique ou un programme surveille la disponibilité de tous les liens et sélectionne le chemin d'envoi des paquets. L'utilisation simultanée de plusieurs liens augmente la bande passante disponible.

Pont du chemin le plus court

TRILL (Transparent Interconnection of Lots of Links) permet à un Ethernet d'avoir une topologie arbitraire et permet une répartition de charge par paire par flux au moyen de l'algorithme de Dijkstra , sans configuration ni intervention de l'utilisateur. Le catalyseur de TRILL a été un événement au Beth Israel Deaconess Medical Center qui a commencé le 13 novembre 2002. Le concept de Rbridges [sic] a été proposé pour la première fois à l' Institute of Electrical and Electronics Engineers en 2004, qui en 2005 a rejeté ce qui est devenu connu sous le nom de TRILL, et dans les années 2006 à 2012 a conçu une variante incompatible connue sous le nom de Shortest Path Bridging .

L'IEEE a approuvé la norme IEEE 802.1aq en mai 2012, également connue sous le nom de Shortest Path Bridging (SPB). SPB permet à tous les liens d'être actifs via plusieurs chemins à coût égal, offre des temps de convergence plus rapides pour réduire les temps d'arrêt et simplifie l'utilisation de l'équilibrage de charge dans les topologies de réseau maillé (partiellement connectées et/ou entièrement connectées) en permettant au trafic de partager la charge sur tous les chemins d'un réseau. SPB est conçu pour éliminer virtuellement l'erreur humaine lors de la configuration et préserve la nature plug-and-play qui a établi Ethernet comme protocole de facto au niveau de la couche 2.

Routage 1

De nombreuses entreprises de télécommunications disposent de plusieurs itinéraires à travers leurs réseaux ou vers des réseaux externes. Elles utilisent un équilibrage de charge sophistiqué pour déplacer le trafic d'un chemin à un autre afin d'éviter la congestion du réseau sur une liaison particulière et parfois pour minimiser le coût du transit sur les réseaux externes ou améliorer la fiabilité du réseau .

Une autre façon d'utiliser l'équilibrage de charge est dans les activités de surveillance du réseau . Les équilibreurs de charge peuvent être utilisés pour diviser d'énormes flux de données en plusieurs sous-flux et utiliser plusieurs analyseurs de réseau, chacun lisant une partie des données d'origine. Cela est très utile pour surveiller les réseaux rapides comme 10GbE ou STM64, où le traitement complexe des données peut ne pas être possible à la vitesse du câble .

Réseaux de centres de données

L'équilibrage de charge est largement utilisé dans les réseaux de centres de données pour répartir le trafic sur de nombreux chemins existants entre deux serveurs. Il permet une utilisation plus efficace de la bande passante du réseau et réduit les coûts de provisionnement. En général, l'équilibrage de charge dans les réseaux de centres de données peut être classé comme statique ou dynamique.

L'équilibrage de charge statique répartit le trafic en calculant un hachage des adresses source et de destination et des numéros de port des flux de trafic et en l'utilisant pour déterminer comment les flux sont attribués à l'un des chemins existants. L'équilibrage de charge dynamique attribue les flux de trafic aux chemins en surveillant l'utilisation de la bande passante sur différents chemins. Les attributions dynamiques peuvent également être proactives ou réactives. Dans le premier cas, l'attribution est fixe une fois effectuée, tandis que dans le second, la logique réseau continue de surveiller les chemins disponibles et déplace les flux entre eux en fonction des changements d'utilisation du réseau (avec l'arrivée de nouveaux flux ou l'achèvement de flux existants). Un aperçu complet de l'équilibrage de charge dans les réseaux de centres de données a été mis à disposition.

Basculements

L'équilibrage de charge est souvent utilisé pour implémenter le basculement , c'est-à-dire la poursuite du service après la défaillance d'un ou plusieurs de ses composants. Les composants sont surveillés en permanence (par exemple, les serveurs Web peuvent être surveillés en récupérant des pages connues), et lorsqu'un composant ne répond plus, l'équilibreur de charge en est informé et ne lui envoie plus de trafic. Lorsqu'un composant revient en ligne, l'équilibreur de charge commence à rediriger le trafic vers lui. Pour que cela fonctionne, il doit y avoir au moins un composant en excès de la capacité du service ( redondance N+1 ). Cela peut être beaucoup moins coûteux et plus flexible que les approches de basculement où chaque composant actif est associé à un composant de sauvegarde unique qui prend le relais en cas de défaillance ( redondance modulaire double ). Certains systèmes RAID peuvent également utiliser un disque de secours pour un effet similaire.

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index