Lors de la configuration du proxy HA, comment décidez-vous des valeurs à affecter aux délais d'expiration? J'ai lu une demi-douzaine d'échantillons dans divers blogs, et tout le monde utilise des délais d'attente différents et personne ne discute pourquoi.
HAProxy semble particulièrement préoccupé par le client, la connexion et le serveur, sur lesquels HAPRoxy lance un avertissement si vous laissez complètement non défini:
While not properly invalid, you will certainly encounter various problems
with such a configuration. To fix this, please ensure that all following
timeouts are set to a non-zero value: 'client', 'connect', 'server'.
Le documentation est inutile à cet égard: il suggère "légèrement au-dessus des multiples de 3 secondes" mais pas pourquoi vous choisiriez un multiple de 1 contre 100 ou 42.
Le RPM que j'utilise (référentiel Amazon Linux) définit ces valeurs par défaut:
timeout connect 10s
timeout client 1m
timeout server 1m
Dont deux exacts multiples de 3 secondes, violant le seul conseil officiel que j'ai vu.
Si vous n'avez pas de conseils de réglage spécifiques, une question plus simple est peut-être la suivante: à quoi dois-je m'attendre pour me tromper avec des délais très courts ou très longs?
Le TCP RTO (délai de réception) commence à trois secondes. ( RFC 1122 ) Si un paquet transmis n'a pas reçu d'accusé de réception pendant ce temps, alors il est supposé être perdu et retransmis. C'est presque certainement ce à quoi l'auteur fait référence. (Notez que le RTO est optimisé ou diminué dynamiquement par divers algorithmes , en dehors de la portée de cette question.)
Gardez à l'esprit que cela ne s'applique vraiment qu'aux connexions entre votre serveur frontal et les clients (c'est-à-dire les utilisateurs Web). Dans des scénarios normaux, les connexions entre HAProxy et vos serveurs d'arrière-plan doivent être sur un réseau local et vous devez utiliser des délais d'expiration beaucoup plus courts, afin que les backends défectueux soient mis hors service plus tôt.
En ce qui concerne vos utilisateurs Web, certains d'entre eux peuvent être sur des connexions à latence très élevée, comme le satellite, et peuvent subir des retransmissions supérieures à la normale pour cette raison. Le RTT sur une connexion où un satellite est utilisé peut dépasser 2000 ms même si tout va bien.
Avec tout cela à l'esprit, vous aurez généralement besoin de délais très courts pour timeout connect
et très longs pour timeout client
.
Pour timeout server
, cela dépend de votre application Web. Lors de la définition du délai d'expiration, tenez compte de la complexité de l'application Web qui est servie et du temps qu'il pourrait prendre dans le pire des cas pour traiter une demande complexe. En cas de doute, augmentez la valeur.
J'ai réglé HAProxy pendant un certain temps et j'ai fait beaucoup de tests de performances dessus. De 100 requêtes/s HTTP à 50 000 requêtes/s HTTP.
Le premier conseil est de activer la page de statistiques sur HAProxy. Vous avez besoin de surveillance, sans exception. Vous aurez également besoin d'un réglage fin si vous avez l'intention de dépasser 10 000 requêtes/s.
Les délais d'attente sont une bête déroutante car ils ont une large gamme de valeurs possibles, la plupart n'ayant aucune différence observable. Je n'ai pas encore vu quelque chose échouer en raison d'un nombre 5% inférieur ou 5% supérieur. 10000 vs 11000 millisecondes, qui s'en soucie? Probablement pas votre système.
Je ne peux pas en toute bonne conscience donner quelques chiffres comme "meilleurs temps morts jamais pour tout le monde".
Ce que je peux dire à la place, ce sont les délais d'attente LES PLUS agressifs qui sont toujours acceptables pour l'équilibrage de charge HTTP (S). Si vous rencontrez des niveaux inférieurs à ceux-ci, il est temps de reconfigurer votre équilibreur de charge.
timeout connect 5000
timeout check 5000
timeout client 30000
timeout server 30000
Le délai d'inactivité s'applique lorsque le client doit accuser réception ou envoyer des données. En mode HTTP, ce délai est particulièrement important à prendre en compte lors de la première phase, lorsque le client envoie la requête, et lors de la réponse lors de la lecture des données envoyées par le serveur.
Lire: C'est le temps maximum pour recevoir la requête HTTP en-têtes du client.
La 3G/4G/56k/satellite peut parfois être lente. Pourtant, ils devraient pouvoir envoyer des en-têtes HTTP en quelques secondes, PAS 30.
Si quelqu'un a une connexion si mauvaise qu'il lui faut plus de 30s pour demander une page (puis plus de 10 * 30s pour demander les 10 images incorporées/CSS/JS), je pense qu'il est acceptable de le rejeter.
Le délai d'inactivité s'applique lorsque le serveur doit accuser réception ou envoyer des données. En mode HTTP, ce délai est particulièrement important à prendre en compte lors de la première phase de la réponse du serveur, lorsqu'il doit envoyer les en-têtes, car il représente directement le temps de traitement du serveur pour la requête. Pour savoir quelle valeur y mettre, il est souvent bon de commencer par ce qui serait considéré comme des temps de réponse inacceptables, puis de vérifier les journaux pour observer la distribution du temps de réponse et d'ajuster la valeur en conséquence.
Lire: C'est le temps maximum pour recevoir la réponse HTTP en-têtes du serveur (après avoir reçu la demande complète du client). Fondamentalement, il s'agit du temps de traitement de vos serveurs, avant qu'il ne commence à envoyer la réponse.
Si votre serveur est si lent qu'il faut plus de 30 secondes pour commencer à donner une réponse, je pense qu'il est acceptable de le considérer comme mort.
Cas spécial: Certains services RARE effectuant un traitement très lourd peuvent prendre une minute ou plus pour donner une réponse. Ce délai peut devoir être considérablement augmenté pour cette utilisation spécifique. (Remarque: il s'agit probablement d'une mauvaise conception, utilisez une communication de style asynchrone ou n'utilisez pas du tout HTTP.)
Définissez la durée maximale d'attente d'une tentative de connexion à un serveur pour réussir.
Lire: Le temps maximum qu'un serveur doit accepter une connexion TCP.
Les serveurs sont dans le même LAN que HAProxy, donc ça devrait être rapide. Donnez-lui au moins 5 secondes car c'est le temps que cela peut prendre en cas d'imprévu (un paquet perdu TCP à retransmettre, un serveur forking un nouveau processus pour prendre les nouvelles requêtes, pic de trafic) .
Cas particulier: lorsque les serveurs se trouvent sur un autre réseau local ou sur une liaison non fiable. Ce délai peut devoir être considérablement augmenté. (Remarque: il s'agit probablement d'un cas de mauvaise architecture.)
Définissez un délai de vérification supplémentaire, mais uniquement après qu'une connexion a déjà été établie.
Définir un délai de vérification supplémentaire, mais uniquement après qu'une connexion a déjà été établie Si défini, haproxy utilise min ("timeout connect", "inter") comme délai de connexion pour le contrôle et "timeout check" comme délai de lecture supplémentaire. Le "min" est utilisé pour que les personnes fonctionnant avec une très longue longue "connexion de temporisation" (par exemple, ceux qui en avaient besoin en raison de la file d'attente ou de tarpit) fassent pas ralentir leurs contrôles. (Veuillez également noter qu'il n'y a aucune raison valable d'avoir des délais d'expiration de connexion aussi longs, car "file d'attente d'expiration" et "tarpit d'expiration" peuvent toujours être utilisés pour éviter cela).
Lire: lors de l'exécution d'un contrôle de santé, le serveur a timeout connect
pour accepter la connexion puis timeout check
pour donner la réponse.
Tous les serveurs DOIVENT avoir un contrôle de santé HTTP (S) configuré. C'est la seule façon pour l'équilibreur de charge de savoir si un serveur est disponible. Le bilan de santé est un simple /isalive
page répondant toujours OK
.
Donnez ce délai au moins 5 secondes car c'est le temps que cela peut prendre en cas d'imprévu (un paquet perdu TCP à retransmettre, un serveur forking un nouveau processus pour prendre les nouvelles requêtes, pic de trafic) ).
War Story: Beaucoup de gens à tort croient que le serveur peut toujours répondre à cette simple page en 3 ms. Ils ont défini un délai d'attente agressif (<2000 ms) avec un basculement agressif (2 vérifications échouées = serveur mort). J'ai vu des sites Web entiers tomber à cause de cela. En règle générale, il y a une légère augmentation du trafic, les serveurs principaux ralentissent, les contrôles de santé sont retardés ... jusqu'à ce que soudainement, ils expirent tous ensemble, HAProxy pense que TOUS les serveurs sont morts en même temps et que le site entier tombe en panne.