Mettre en place une répartition de charge avec Varnish

varnish_logo-closeup

Un site internet a pour vocation d'être opérationnel aussi longtemps que voulu. Ainsi la tenue en charge est une condition obligatoire avant la mise en ligne d’un site. La répartition de charge, ou load-balancing, est une technique visant à partager la charge sur plusieurs serveurs. Ceci est indispensable sur les sites à fort trafic (site de jeux, réseaux sociaux etc…).

Dans cet article je vais donc vous présenter l'algorithme « Round-Robin » , qui nous est proposé par Varnish pour assurer cette répartition de charge.

Cas pratique

Considérons le parc suivant :

  • Tout le trafic sera réceptionné en amont par Varnish
  • Nous avons 2 back-ends LAMP
  • Un serveur de média ne servira que les ressources statiques (js, css, images, etc)

infra

  • La requête HTTP venant du navigateur est reçue par Varnish en premier lieu
    • Si Varnish possède un cache de la requête ci-dessus, il le renvoie directement au navigateur
  • Via le load-balancing, Varnish envoie la requête vers un des back-ends. L’algorithme de load balancing consiste à décider vers quel back-end envoyer la requête. Cet algorithme calcule, par exemple, quel back-end est le moins sollicité entre tous. De la même manière, l’algorithme « isole » un back-end considéré comme « sick » c’est-à-dire un back-end qui ne répond pas.
  • Le back-end renvoie à varnish la réponse correspondante
  • Varnish envoie la réponse finale au client (navigateur)

Configurations

La mise en place est assez simple.
Il faudra ajouter les lignes suivantes dans le fichier de configuration varnish (/etv/varnish/config.vcl)

backend back-end-1 {
     .host = "back-end-1.monsite.com" ;
     .port = "80" ;
     .probe = {
          .url = "/";
           .interval = 5s;
           .timeout = 2s;
           .window = 5;
           .threshold = 3;
      }
 }
backend back-end-2 {
      .host = "back-end-2.monsite.com" ;
      .port = "80" ;
      .probe = {
          .url = "/";
          .interval = 5s;
          .timeout = 2s;
          .window = 5;
          .threshold = 3;
      }
 }
backend media {
      .host = "media.monsite.com" ;
      .port = "80" ;
      .connect_timeout = 2s ;
 }

Ainsi on a la déclaration de nos 3 backends : back-end-1, back-end-2, media

Dans les sections .probes on indique que :

  • Varnish doit vérifier toutes les 5 secondes (.interval) chaque backend
  • Si le backend ne répond pas dans 2 secondes (.timeout) c’est considéré comme un échec
  • Si plus de 3 (.threshold) sur les 5 (.window) derniers appels ne sont pas en échec, le backend sera considéré comme « healthy ». Autrement il sera considéré comme « sick » et, comme vu plus haut, Varnish ne tentera plus de diriger de trafic vers ce backend.

Bien sûr ces configurations sont modifiables en fonction du besoin et des dimensionnements des machines.

Ensuite il faudra englober les 2 back-ends dans ce que l’on appelle « logical director ». C’est dans cette section que Varnish va réellement appliquer l’algorithme Round-Robin sur les back-ends configurés.

director repartitionCharge round-robin {
     { .backend = back-end-1; }
     { .backend = back-end-2; }
 }

Pour rappel nos 2 back-ends vont répondre aux appels PHP dynamiques. Notre serveur média va servir uniquement les ressources statiques. Afin de différencier tout cela, on peut mettre en place les confs suivantes :

sub vcl_recv {
     if (req.http.host ~ "media.monsite.com") {
          set req.backend = media;
      } else {
          set req.backend = repartitionCharge;
      }
 }

Liens:
https://www.varnish-cache.org/
https://fr.wikipedia.org/wiki/Round-robin_(informatique)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.