Load Balancing (Équilibrage de charge réseau)

 

 

Load Balancing (Équilibrage de charge réseau)
Contexte 

Une entreprise héberge un site web sur un serveur mais celui-ci n’arrive pas à supporter la charge du nombre de visites générées. De plus, l’indisponibilité du site en cas de soucis sur le serveur est un problème.

Objectif 

Mettre en place une solution d’équilibrage de charge pour augmenter la disponibilité du site web. Celui-ci est répliqué entre différents serveurs sur un réseau à part et l’on accède à ces derniers par l’IP d’un serveur directeur, seul serveur accessible directement par les clients. Celui-ci répartit les connexions sur l’un ou l’autre serveur web. Ce système permet de programmer la maintenance d’un serveur sans pénaliser la disponibilité du site web en plus de répartir la charge en ressources de différentes requêtes demandées par les visiteurs.

 

Compétences mises en œuvre
C23 

C31

C32

C34

Installer et configurer un dispositif de sécurité 

Assurer les fonctions de base de l’administration d’un réseau

Assurer les fonctions de l’exploitation

Surveiller et optimiser le trafic sur le réseau

 

 

Conditions de réalisation
Matériel Logiciels
–       1 serveur directeur 

–       2 serveurs web

–       1 poste client

–       2 réseaux IP

–       VMware Workstation 7.1 

–       Ubuntu 10.04

–       Linux Virtual Server

–       KeepAlived

Autre : –

 

 

Description de l’activité réalisée
Situation initiale 

Il n’y a qu’un serveur web devant faire face à l’ensemble des connections sur son site.

Situation finale 

Deux serveurs web sur un réseau séparé sont accessibles à tour de rôle par le biais d’un serveur directeur. Les pages du site web sont répliquées d’un serveur à l’autre sur demande. Les postes clients ne peuvent pas communiquer directement avec les serveurs web, ces derniers sont donc isolés et ne répondent plus que part l’intermédiaire du directeur.

 

 

 

Introduction

 

Voici le schéma de la situation que nous cherchons à atteindre :

 

 

Ainsi, nous devons mettre en place un 2e serveur web et un serveur Directeur qui sera chargé de répartir la charge réseau sur les deux serveurs web.

 

 

Mise en place d’un serveur LAMP

 

Pour installer un serveur LAMP sur une distribution Ubuntu, il faut taper la ligne de commande suivante :

$ sudo apt-get install lamp-server^

Cette commande va installer les différents éléments de base pour la constitution d’un site web. Il contient Apache, MySQL et PHP.

 

Après installation, nous pouvons vérifier qu’Apache fonctionne bien en allant sur http://127.0.0.1 .

Les fichiers du site web sont stockés dans /var/www/ . On a besoin des droits root pour les modifier.

 

Création d’un index.php pour tester l’équilibrage de charge

On créé une page php où l’on insérera dans le <body></body> le code qui suit. Cela aura pour effet d’afficher une page index.php qui nous renseignera sur l’IP du serveur répondant, son port, l’IP du client demandeur et son port.

<?php

echo ‘IP serveur : ‘.$_SERVER[‘SERVER_ADDR’];

echo « <br/> »;

echo ‘Port serveur : ‘.$_SERVER[‘SERVER_PORT’];

echo « <br/><br/> »;

echo ‘IP client : ‘.$_SERVER[‘REMOTE_ADDR’];

echo « <br/> »;

echo ‘Port client : ‘.$_SERVER[‘REMOTE_PORT’];

?>

 

Synchronisation des données entre les deux serveurs

 

SSH

Pour synchroniser les données en toute sécurité et pour atteindre des dossiers demandant des accès root sur la machine distante, nous nous servons du protocole SSH.

 

Installation SSH sur les deux serveurs web $ sudo aptitude install openssh-client openssh-server
Générer une clé privée et une clé publique $ ssh-keygen –t dsa

 

Après la saisie d’une passphrase, deux clés par serveurs sont générées :

Clé privée dans : /home/random/.ssh/id_dsa

Clé publique dans : /home/random/.ssh/id_dsa.pub

 

On doit exporter la clé publique de chaque serveur sur l’autre.

A partir de 10.40.0.1 on tape :

$ ssh-copy-id –i .ssh/id_dsa.pub random@10.40.0.2

 

Pour garder en mémoire la passphrase :

$ ssh-add

 

Unison

On installe le package Unison qui permet de faire une synchronisation bidirectionnelle. Ainsi, les données des serveurs seront synchronisées de part et d’autre pour maintenir leur contenu identique. Le choix d’Unison est lié à cette caractéristique ainsi qu’à cette particularité de pouvoir synchroniser des données au travers d’SSH.

 

Installation $ sudo aptitude install unison
Fichier de configuration /home/.unisson/default.prf
Lancer Unison $ unison

 

Configuration du Serveur web 10.40.0.1

# Répertoire distant

root = ssh://root@10.40.0.2//var/www/

# Répertoire local

root = /var/www/

 

Configuration du serveur directeur

On installe sur le serveur Directeur KeepAlived qui permettra à ce serveur d’équilibrer la charge réseau sur les deux serveurs web. KeepAlived va se servir de l’algorithme round-robin (lb_algo rr) qui ne donne aucun poids aux serveurs ; il en choisira un puis l’autre puis reviendra sur le premier etc.. L’équilibrage de charge sera de type NAT. Ainsi, les serveurs réels ne répondront pas directement aux clients, les paquets qu’ils enverront passeront d’abord par le serveur directeur. Cela permet d’isoler complètement les serveurs web des clients.

Aussi, pour que KeepAlived vérifie si un serveur est disponible ou non, on configure un HTTP_GET qui va vérifier régulièrement si la page test.html est bien accessible (status_code 200). Si elle ne l’est pas, KeepAlived va enlever le serveur de sa liste. Si le serveur revient, il le prendra de nouveau en compte.

 

Installation et configuration de KeepAlived

 

Installation $ sudo apt-get install keepalived
Fichier de configuration /etc/keepalived/keepalived.conf
Redémarrer KeepAlived $ /etc/init.d/keepalived restart

 

Contenu de keepalived.conf

static_ipaddress { 

10.41.0.1/24 dev eth0

}

virtual_server 10.41.0.1 80

{

protocol TCP

lb_kind NAT

lb_algo rr

persistence_timeout 10

 

real_server 10.40.0.1 80 {

weight 1

HTTP_GET {

connect_port 80

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

url {

path /test.html

status_code 200

}

}

}

real_server 10.40.0.2 80 { 

weight 1

HTTP_GET {

connect_port 80

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

url {

path /test.html

status_code 200

}

}

}

}

 

On redémarre KeepAlived et on vérifie la configuration et le bon fonctionnement avec :

$ ipvsadm -ln (afficher les IP)

$ ipvsadm -lcn (afficher les connexions en cours et la durée avant la fin de celles-ci)

 

Configuration du routage

Pour finir, il faut configurer le routage des paquets sur le directeur afin que les clients puissent contacter le site web http://10.41.0.1 .

 

On édite le fichier $ gedit /etc/sysctl.conf
On décommente la ligne #net.ipv4.ip_forward=1
On redémarre le service $ sysctl -p