Optimisation de serveurs LAMP et problématique de scalabilité
Transcription
Optimisation de serveurs LAMP et problématique de scalabilité
Optimisation de serveurs LAMP et problématique de scalabilité 28 mars 2016 IUT Nancy-Charlemagne Licence Professionnelle ASRALL Avcar Osman, Baltic Husref, Champain Bastien 1 TABLE DES MATIÈRES Table des matières 1 Introduction 1.1 Présentation du projet . . . . . . . . . . . . . . . . . . . . 1.1.1 Problématique . . . . . . . . . . . . . . . . . . . . . 1.1.2 Organisation . . . . . . . . . . . . . . . . . . . . . 1.2 Contexte de mise en place des optimisations (e-commerce) 1.2.1 Contexte du projet . . . . . . . . . . . . . . . . . . 1.2.2 Serveur LAMP . . . . . . . . . . . . . . . . . . . . 1.2.3 Description technique du serveur . . . . . . . . . . 1.2.4 Modules apache . . . . . . . . . . . . . . . . . . . . 1.2.5 Configuration réseau . . . . . . . . . . . . . . . . . 1.3 Tests de performance du serveur . . . . . . . . . . . . . . . 1.3.1 Disques Durs . . . . . . . . . . . . . . . . . . . . . 1.3.2 Réseau . . . . . . . . . . . . . . . . . . . . . . . . . 1.4 Optimisation . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.1 L’optimisation de serveur . . . . . . . . . . . . . . . 1.4.2 L’importance d’une optimisation . . . . . . . . . . 2 Cahier des charges 2.1 Présentation du projet . . . . . 2.1.1 Objet du projet . . . . . 2.1.2 Composition de l’équipe 2.1.3 Délai . . . . . . . . . . . 2.2 Suivi du projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Optimisation du serveur Web 3.1 Environnement critique . . . . . . . . . 3.2 Site web de e-commerce . . . . . . . . 3.2.1 Implication . . . . . . . . . . . 3.2.2 Système de gestion des contenus 3.3 Activité et traffic sur un serveur web . 3.4 Préparation de la plateforme . . . . . . 3.4.1 Backup . . . . . . . . . . . . . 3.4.2 Plateforme de test . . . . . . . 3.5 Optimisation de la couche middleware 3.5.1 Optimisation Apache . . . . . . 3.5.2 Optimisation Mysql . . . . . . . Avcar Baltic Champain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Projet SCAL Page 2/54 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 4 4 5 5 6 8 9 10 10 10 11 12 12 13 . . . . . 14 14 14 14 15 15 . . . . . . . . . . . 15 15 16 16 16 17 17 17 17 18 18 27 28 mars 2016 TABLE DES MATIÈRES 3.5.3 3.5.4 3.5.5 3.5.6 Les logs de requêtes lentes . . . Ne pas utiliser d’index . . . . . L’utilisation des requêtes lentes Défragmentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 29 30 30 4 Benchmarks 4.1 Outils de benchmarks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 31 5 Suivi d’activité 5.1 SLA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 33 6 Infrastructure de Haute disponibilité 6.1 Schéma de l’infrastructure . . . . . . . . . . . . 6.2 HAProxy . . . . . . . . . . . . . . . . . . . . . 6.3 Installation et configuration . . . . . . . . . . . 6.4 Configurations réseaux des serveurs . . . . . . . 6.5 Load Balancing . . . . . . . . . . . . . . . . . . 6.6 Configuration serveurs web . . . . . . . . . . . . 6.7 Test de la répartition de charge . . . . . . . . . 6.8 MariaDB . . . . . . . . . . . . . . . . . . . . . . 6.9 Gelra Cluster . . . . . . . . . . . . . . . . . . . 6.10 Heartbeat . . . . . . . . . . . . . . . . . . . . . 6.10.1 Installation et configuration d’Heartbeat 6.11 Installation MariaDB et Galera Cluster . . . . . 6.11.1 Configuration Galera Cluster . . . . . . 6.12 Test de la réplication . . . . . . . . . . . . . . . 34 34 34 35 35 37 40 41 41 41 42 42 43 43 44 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Conclusion 45 8 Remerciements 45 9 Annexes 46 Avcar Baltic Champain Projet SCAL Page 3/54 28 mars 2016 1 INTRODUCTION 1 1.1 1.1.1 Introduction Présentation du projet Problématique Pour notre projet, nous avions comme objectif d’optimiser un serveur web hébergeant un site d’e-commerce afin de le rendre, d’une part, plus réactif et fluide, et, d’autre part, de permettre à un maximum de client de pouvoir se connecter simultanément sur le serveur web sans que celui-ci ne surcharge. Nous avons dû mettre en place des benchmarks afin d’évaluer les performances du serveur web et penser à la mise en place d’une infrastructure de haute disponibilité permettant la scalabilité du serveur web. Afin de mener à bien notre projet, nous avons du répondre à la problématique que nous posait le sujet : Comment optimiser une plateforme de type LAMP dans un environnement critique type e-commerce ? 1.1.2 Organisation Dates Semaine du 25/01 Semaine du 01/02 Semaine Semaine Semaine Semaine Semaine du du du du du 08/02 15/02 22/02 29/02 07/03 Semaine du 14/03 Semaine du 21/03 Objet(s) Etude des solutions d’optimisations Etudes des outils de benchmark et Récupération des données au niveau du hardware Mise en place de tests de benchmark Mise en place d’optimisation au niveau du serveur web Optimisation serveur web et serveur de base de données Test de charge sur le serveur web et analyse des corrections à apporter Mise en place de plateforme dédié au e-commerce et recherche sur une mise en place d’un infrastructure de haute disponibilité Mise en place d’une infrastructure de haute disponibilité et début de rédaction du pré-rapport de projet Finalisation du pré-rapport de projet Figure 1 – Tableaux d’organisation du travail. Il existe plusieurs façon d’arriver à la bonne optimisation d’un serveur web. Il nous a donc fallut dans un premier temps, étudier les différentes solutions que l’on pouvait mettre en place dans notre contexte d’environnement e-commerce. Par la suite, afin de pouvoir analyser les performances du serveur web, nous avons récupérer diverses informations aussi bien au niveau du harware que du middleware. Une fois les données collectées, nous avons pu mettre en place différents “stress test” afin d’analyser les performances du serveur web et ainsi trouver Avcar Baltic Champain Projet SCAL Page 4/54 28 mars 2016 1 INTRODUCTION les points faibles de celui-ci. Une fois cela effectué, nous avons procédés à la mise en place d’optmisation du serveur web et du serveur de base de données afin d’améliorer les performance de ceux-ci et de répondre le mieux possible à notre problématque. Pour réussir notre projet, il nous a aussi fallut nous pencher sur les domaines de la haute disponibilité pour les plateformes web, les technologies qui existent pour gérer la répartition de charge et le gestion de cache. Nous devons également étudier les différentes solutions de benchmarks de plateformes web existantes afin d’anticiper les évolutions de l’architecture proposée. Nous aborderont également les notions de capacity planning et d’engagement des services (SLA). Afin d’optimiser au mieux notre temps de travail, nous avons décider de nous répartir les tâches de façon équitables en fonction des préférances de chacun. Nous disposions d’un serveur web où l’on pouvait mettre en place nos otpimisations et donc il était difficile pour le groupe de travailler en même temps sur le serveur web. En effet, afin d’éviter que les erreurs des uns impacte les autres, il nous a fallut faire un roulement au niveau de l’accès au serveur web. Lorsqu’une personne avait accès au serveur web, les autres en profiter pour faire des recherches sur les optimisations ou la résolution de problèmes liés aux optimisations. 1.2 1.2.1 Contexte de mise en place des optimisations (e-commerce) Contexte du projet Pour le projet, l’objectif est l’optimisation de serveur LAMP et problématique de scalabilité. Notre tuteur nous a mis à disposition un serveur web ayant un site avec un trafic réel, le site est http ://www.trackmusik.fr. Ce serveur web utilise l’ensemble de logiciel libre LAMP afin de mettre en place une solution complète permettant de construire un serveur de site web. De plus, le site web utilise un système de gestion de contenu (CMS) afin de concevoir et de mettre à jour dynamiquement le site web. Avcar Baltic Champain Projet SCAL Page 5/54 28 mars 2016 1 INTRODUCTION Figure 2 – Capture d’écran du site Trackmusik 1.2.2 Serveur LAMP LAMP est un ensemble de logiciels libres permettant la construction de serveur de sites webs, d’applications métiers et de web services. Ainsi, grâce à ce type de solution, il sera possible de mettre en place un serveur web optionnel rapidement et efficacement. Dans ce type de solution, les différentes parties communiquent entre elles et sont directement liées. Un changement sur une partie peut impacter directement une autre partie. Le gros avantage de ce type de serveur est que ses parties peuvent être changées en lieu et place d’autres parties, par exemple, il est possible d’utiliser le language Perl ou lieu du PHP. Il est aussi possible de placer ces différentes partie sur plusieur machine afin d’assurer la haute disponibilité. L signifie Linux. Il s’agit ici du système d’exploitation dont le serveur sera basé. Cette partie fera en sorte de gérer la gestion du hardware afin de répondre au mieux à la couche software. Il existe d’autres variantes, comme par exemple pour Windows ou MacOS. Pour notre projet, Figure 3 – Logo Linux. notre serveur se base sur une distribution Debian, donc Linux. Avcar Baltic Champain Projet SCAL Page 6/54 28 mars 2016 1 INTRODUCTION A signifie Apache. Cette seconde lettre fait référence au type de serveur HTTP utilisé. Le serveur web sera capable d’interpréter les requêtes HTTP arrivant sur le port associé au protocole HTTP (par défaut le port 80), et de fournir une réponse avec ce même protocole. Dans notre cas il s’agit du serveur Apache mais il est possible d’utiliser d’autre serveur Figure 4 – Logo Apache. web, comme par exemple Nginx. M signifie MySQL. Il s’agit ici du type de système de gestion de bases de données. Ce genre de système va être destiné à stocker et à partager des informations dans une base de données, en garantissant la qualité, la pérennité et la confidentialité des informations et le tout en cachant la complexité des opérations. Les données du type, compte utilisateur, achats effectués ou encore points de fidélités Figure 5 – Logo MySQL. seront stockées et organisées dans des bases de données. Il est aussi possible d’utiliser MariaDB ou en Postgre en lieu et place de MySQL. Figure 6 – Logo PHP. Avcar Baltic Champain P signifie PHP, Perl ou Python. Il s’agit du type de langauge script utilisé. Il va ainsi permettre la génération de pages web dynamiques et la communication avec le serveur de base de données. Comme toutes les parties, il est aussi possible d’utiliser différents languages comme le Perl ou encore le Python. Projet SCAL Page 7/54 28 mars 2016 1 INTRODUCTION 1.2.3 Description technique du serveur Système d’exploitation Debian Jessie 8.3 Version noyau Linux Version du système Processeurs 3.16.7-ckt11-1+deb8u6 amd64 mais multiarch x86/x64 AMD Opteron™ 6338P (12 cœurs x 2,3 GHz) Mémoire vive Disque dur 32 Go de RAM DDR3 ECC 2 x 2 To SATA uname -a cat /etc/debian_version cat /etc/issue cat /etc/proc/cpuinfo cat /etc/proc/cpuinfo | grep processor | wc -l free -t fdisk -l /dev/sd* Figure 7 – Description du serveur web. Version Apache : 2.4.10 Commande 1 apachectl -V Cela nous permet ainsi de savoir quelle version Apache est installé sur le serveur et ainsi nous allons pouvoir nous référer à la bonne documentation Apache. Version Mysql : 5.5.46 Commande 1 Mysql : >mysql -V Connaitre le numéro de version de MySQL nous permettera d’appliquer les bonnes optimsations correspondant à la version. Version PHP : 5.6.17-0+deb8u1 Commande 1 php -v Le numéro de version de PHP nous permettera comme pour Apache et Mysql, se référer à la bonne doc et appliquer les bonnes optimisations de la version. Avcar Baltic Champain Projet SCAL Page 8/54 28 mars 2016 1 INTRODUCTION Version Joomla : 3.4.8 1.2.4 1 Modules apache apachectl –t –D DUMP_MODULES core_module (static) so_odule (static) watchdog_module (static) http_module (static) log_config_module (static) logio_module (static) version_module (static) unixd_module (static) access_compat_module (shared) actions_module (shared) alias_module (shared) auth_basic_module (shared) authn_core_module (shared) authn_file_module (shared) authz_core_module (shared) authz_host_module (shared) authz_user_module (shared) autoindex_module (shared) cache_module (shared) cache_disk_module (shared) deflate_module (shared) dir_module (shared) env_module (shared) expires_module (shared) filter_module (shared) headers_module (shared) mime_module (shared) mpm_prefork_module (shared) negotiation_module (shared) pagespeed_module (shared) php5_module (shared) rewrite_module (shared) setenvif_module (shared) Avcar Baltic Champain Projet SCAL Page 9/54 28 mars 2016 1 INTRODUCTION status_module (shared) Grâce à cela nous savons quels modules Apache charge lors de son lancement. Ainsi nous pouvons vérifier si tous les modules listés sont nécessaires et s’ils nécessitent une optimisation. 1.2.5 Configuration réseau IPv4 IPv6 Masque Passerelle 87.106.20.127 2001 :08D8 :087D :3100 :0000 :0000 :006B :D53D FFFF :FFFF :FFFF :FFFF :0000 :0000 :0000 :0000 10.255.255.1 Figure 8 – Configuration eth0 du réseau. 1.3 Tests de performance du serveur Afin d’avoir de savoir comment se comporte le serveur dans ces retranchements, nous avons effectué certains tests. Cela nous permet ainsi d’obtenir des résultats de performance que nous analyserons pour savoir si les différents matériels testés fonctionnent correctement et s’il est nécessaire de changer de matériels ou non. 1.3.1 Disques Durs Le serveur possède deux disques durs identiques de 2 To chacun. Ici nous allons tester les performances en lecture et en écriture des disques durs pour savoir s’ils n’impactent pas les performances du serveur. En effet, des disques durs avec des faibles taux d’écriture et de lecture ralentiraient fortement le serveur et le traitement des requêtes des clients. Il est donc nécessaire d’avoir des disques durs dotés de bonnes performances. Lecture Pour tester les performance en lecture on installe le logiciel hdparm qui va nous permettre d’effectuer le test. 1 hdparm -t -T /dev/sd* L’option “-t” permet d’effectuer des tests en lecture du disque dur et l’option “-T” permet d’effectuer des tests en lecture des caches. Pour des résultats plus significatifs il aurait fallu effectuer ses tests sur un système inactif (sans processus actifs). Nous n’avons pas pu réaliser Avcar Baltic Champain Projet SCAL Page 10/54 28 mars 2016 1 INTRODUCTION les tests dans les meilleures conditions, néanmoins cela donne une bonne idée de la performance en lecture. Nous avons effectué ses tests 3 fois par disque afin d’avoir une moyenne. Résultat : Les performances en lecture en moyenne sont de 138,653 MB/sec pour sda et 121,8 MB/sec pour sdb. Ces performances sont bonnes et permettent donc un accès en lecture rapide et donc cela permet de traiter les données rapidement. Ecriture Une fois la lecture vérifiée, il nous faut regarder du côté de l’écriture des disques durs. Une mauvaise écriture impacterait le temps de traitement des requêtes clients et ainsi pourrait faire chuter le chiffre d’affaires de l’entreprise. Pour effectuer ce test on utilise la commande “dd”. Cette commande permet d’écrire sur des périphériques tels que des disques durs. 1 dd if=/dev/zero of=/tmp/test.data bs=1M count=1024 conv=fdatasync Pour tester les performances en écriture des disques nous avons simulés l’écriture d’un fichier de 1,1 GB sur chacun des disques et donc d’écrire des blocs de la taille de 1 MB 1024 fois. Résultat : Nous avons effectués les tests 7 fois de suite afin d’obtenir une moyenne nous permettant d’avoir une idée de la performance d’écriture des disques. Pour sda, nous avons une moyenne de 995 MB/s et 1,06 GB/s pour sdb. Ces performances nous permettent d’affirmer qu’il s’agit de disques durs performants en écriture et donc idéaux pour un serveur de e-commerce demandant souvent la sollicitation d’un disque dur. 1.3.2 Réseau Les performances réseaux sont primordiales pour qu’un serveur web puisse communiquer avec les clients rapidement et en grande quantité. En effet, quand bien même le serveur web est optimisé, s’il ne dispose pas d’une bande passante suffisamment conséquente pour accueillir un grand nombre de client simultanément, celui-ci sera toujours bridé par sa bande passante qui nous pourra pas accueillir un trop grand nombre de connexions simultannées dans son canal. Pour simuler les performances du serveur dédié, nous avons utilisé l’application “iperf”. Iperf doit être lancé sur deux machines se trouvant de part et d’autre du réseau à tester. La première machine lance Iperf en "mode serveur" (avec l’option -s), la seconde en "mode client" (option -c). Par défaut le test réseau se fait en utilisant le protocole TCP (mais il est Avcar Baltic Champain Projet SCAL Page 11/54 28 mars 2016 1 INTRODUCTION également possible d’utiliser le mode UDP avec l’option -u). Commande serveur : 1 iperf -s Commande client : 1 iperf -c 87.106.20.127 (Adresse IP du serveur) Résultats : 1 2 [ ID] Interval [ 3] 0.0-10.1 sec Transfer 12.0 MBytes Bandwidth 9.92 Mbits/sec Les tests éffectué ont été très faibles et il s’agit là d’un problème assez conséquent. En effet, s’il l’entreprise souhaite augmenter sa fréquentation, elle sera limitée par sa connexion réseau qui ne lui permettera pas d’accepter tout le monde. 1.4 1.4.1 Optimisation L’optimisation de serveur L’optimisation d’un serveur consiste en amélioration des différentes couches dont dispose le serveur. L’optimisation va avoir pour but général d’améliorer les performances du serveur pour ainsi permettre au serveur d’effectuer un plus grand nombre de tâches dans un temps plus réduit. Comme dit précédement, il existe différentes couches au niveau du serveur, la couche hardware, qui va centraliser les composants physique du serveur, c’est-à-dire, les processeurs, les disques durs, la mémoire vive ou encore la carte réseau. L’optimisation pour cette couche va consister au remplacement des composants pour de nouveaux plus performants. La couche qui se trouve juste au dessus de la couche hardware et la couche du système d’exploitation. Celle-ci se compose du système d’exploitation et son optimisation se fait, d’une part, par le choix d’un système d’exploitation qui va permettre de gèrer les composants de la couche hardware de manière la plus optimale, et, d’autre part, par la bonne configuration des composants hardware pour ainsi permettre une communication optimale des composants. La couche suivante se nomme middleware et elle est composée de tous les paquets du système d’exploitation permettant de mettre en place l’application web souhaitée. Par exemple, pour notre cas, celle-ci sera composée du serveur web Apache, du serveur de base de donnée Mysql ou encore du PHP. Ici l’optimisation consistera en la configuration du fonctionnement ce ceux-ci pour qu’ils puissent fonctionner de façon optimale grâce aux composants que la Avcar Baltic Champain Projet SCAL Page 12/54 28 mars 2016 1 INTRODUCTION couche hardware lui propose. Ainsi dans notre cas, en optimisant le serveur LAMP, les performances du serveur augmenteront et les sites webs hébergés sur le serveur pourront recevoir plus de clients et la navigation sera plus fluide. La dernière couche est la couche application qui se compose de l’application web ou du site web en lui même. L’optimisation dans ce cas va consister en l’amélioration du code source de l’applciation web pour éviter les traitements lourds et inutiles. Figure 9 – Schéma des couches d’un serveur 1.4.2 L’importance d’une optimisation La performance d’un serveur est importante, elle peut influencer le référencement d’un site sur un moteur de recherche, par exemple le temps de réponse du serveur est pris en compte, la fluidité d’un site web et la vitesse de chargement sont aussi prises en compte. Néanmoins Avcar Baltic Champain Projet SCAL Page 13/54 28 mars 2016 2 CAHIER DES CHARGES l’optimisation n’est pas forcement nécéssaire pour tout le cas de figure. En effet, une personnes ayant un site web dans son réseau local pour partager des choses avec son entourage proche n’a pas vraiment besoin d’une optimisation. L’optimisation s’adresse surtout aux sites web ayant un grand nombre de visiteurs par jours ou souhaitant acquérir un grand nombre de visiteur. Les sites webs ayant besoin d’optimisation seront plus dans cette optique. Par exemple, les sites marchand de e-commerce, les sites communautaires ou bien les réseaux sociaux ont un grand intêret à ce que leur plateforme web soit optimisée. Si un utilisateur attend plusieurs secondes pour le chargement d’une page, celui-ci va quitter le site web en question et la société dérrière perdra un potentiel client. 2 Cahier des charges 2.1 2.1.1 Présentation du projet Objet du projet Le projet consiste à étudier l’état de l’art en matière de disponibilité des plateformes web, des technologies qui existent pour gérer la répartition de charge, la gestion du cache... Il faudra proposer une architecture type qui répondra aux exigences de haute disponibilité en environnement critique. Cette architecture devra être facilement scalable tout en restant simple à administrer et à faire évoluer. Dans un second temps, il faudra étudier les solutions de benchmarks de plateformes web qui existent sur le marché (ab, dareboost,...) pour pouvoir anticiper les évolutions de l’architecture proposée et valider les performances attendues. Les étudiants approfondiront durant ce projet leurs connaissances sur les architectures à haute disponibilité et sur comment les dimensionner par rapport à des besoins précis. Ils aborderont également les notions de capacity planning et d’engagement de services (SLA). 2.1.2 Composition de l’équipe L’équipe est composée des étudiants suivants : - Avcar Osman - Baltic Husref - Champain Bastien Le tuteur est Yohan Parent. Avcar Baltic Champain Projet SCAL Page 14/54 28 mars 2016 3 OPTIMISATION DU SERVEUR WEB 2.1.3 Délai Nous avons commencé le projet le 25 Janvier 2016, et le rapport final sera à rendre pour le 28 Mars 2016. 2.2 Suivi du projet Pour le suivi du projet, nous renseignons à chaque fin de séance ce que l’on a fait sur la page http ://suivi-projet-asrall.iutnc.univ-lorraine.fr/. Nous communiquons tous les jours entre nous, et nous envoyons fréquemment des mails au tuteur. Chaque vendredi nous faisons une réunion avec le tuteur afin de voir où on en est, et de lui poser des questions sur certains points. 3 Optimisation du serveur Web Nous allons donc devoir optimiser le serveur web hébergeant le site de e-commerce, TrackMusik. Pour cela nous allons mettre en application des optimisation sur la partie middleware et nous analyserons les différents changements qu’il serait possible d’effectuer sur la couche hardware et la couche OS. Nous excluons ici la couche applicative car celle-ci est plus de la responsabilité du développeur que de l’administrateur système. 3.1 Environnement critique Un environnement critique est un environnement où une panne, par exemple un serveur qui tombe, aura de lourdes conséquences pour l’entreprise. Dans notre cas ici, nous somme dans un environnement critique car, d’une part nous travaillons directement en production et donc cela peut impacter directement le client souhaitant naviguer sur le site web. D’autre part, c’est un environnement critique car le site web est un site de e-commerce générant des revenus financiers et donc cela met en place un gros enjeu pour l’entreprise derrière le site web. En effet en cas de panne, et d’indisponibilité du serveur web, l’entreprise risque de perdre des clients et les clients ne peuvent pas acheter sur le site. Cela entraine donc une grosse perte d’argent pour l’entreprise tant que la panne n’est pas résolue. Avcar Baltic Champain Projet SCAL Page 15/54 28 mars 2016 3 OPTIMISATION DU SERVEUR WEB 3.2 Site web de e-commerce Un site de e-commerce est un plateforme web permettant d’acquérir un bien ou service en échange d’une somme d’argent. Des sites comme Amazon.com ou encore ebay.com sont des sites de e-commerce. 3.2.1 Implication Dans notre contexte nous devons optimiser un site de e-commerce et cela implique plusieurs choses. En effet, il est très important pour un site de e-commerce d’être au maximum optimisé afin d’avoir de la visibilité et de la sécurité. Plus le site de e-commerce sera optimisé, plus celui-ci disposera d’un meilleur référencement web et sera plus fluide pour ainsi augmenter sa clientèle. Il est aussi nécéssaire de faire attention lors des différentes optimisations. En effet, un site de e-commerce nécéssite une certaine sécurité étant donné que des informations bancaires sont en transit sur le site. Il est donc nécéssaire de vérifier si certaines optimisations n’ouvrent pas des failles de sécurité. De plus, il est aussi necéssaire de faire attention à ce qu’une optimisation n’entrave pas le bon fonctionnement du site web car cela pourrait avoir des répercutions directs sur la clientèle. 3.2.2 Système de gestion des contenus Il est souvent difficile et fastidieux de mettre en place un site de e-commerce codé en dur. On peut donc passer par un sytème de gestion des contenus (CMS) spécialisé dans le e-commerce. Le premier avantage est que cela facilite grandement la mise à jour du site web et cela permet donc aussi à des personnes n’ayant que peu de connaissances informatique à gèrer son contenu facilement. Le second avantage est le coût de développement. En effet, cela réduit drastiquement le coût de développement par rapport à un site codé en dur. Le dernier avantage est que cela permet de gestionner efficacement son contenu. Joomla 3.4.8 Comme dit auparavant, nous utilisons le CMS joomla pour le site de e-commerce TrackMusik. Ce CMS gère très bien les differents contenus car il s’agit là de son principale argument. Néanmoins pour ce qui est d’un site de e-commerce, Joomla n’est peut être pas la meilleure solution comme CMS car ce n’est pas sa spécialité première. Afin de pouvoir créer un boutique de e-commerce avec Joomla, il faut d’abord rajouter des modules d’extensions supplémentaire comme par exemple, VirtueMart. Cela ne rentre donc pas dans notre optimique d’optimisation de platefrome web. Pour palier Avcar Baltic Champain Projet SCAL Page 16/54 28 mars 2016 3 OPTIMISATION DU SERVEUR WEB à cela on peut par exemple se tourner vers d’autres CMS spécialisés dans le e-commerce, Prestashop est une bonne alternative. Autre solution : Prestashop L’aternative qui nous a semblé la plus crédible est Prestashop. En effet, comparé à Joomla, ce CMS est spécilisé dans le e-commerce et permet de faire de la gestion de contenus lié au e-commerce de façon plus otpimale et native. En effet, ce CMS permet de mettre tout un tas de choses lié au commerce. Par exemple, il est possible de mettre en place des promotions et des bons de réduction, de faire des catégories ou encore de mettre en place un système de point de fidélité. Nous avons testé les deux CMS afin de voir lequel s’adaptait le mieux au e-commerce. Nous avons donc installé les deux CMS sur deux machines virtuelles identiques disposant d’un serveur web Apache et nous avons constaté que Prestashop était bien plus adapté pour le e-commerce grâce à toutes ces fonctions bien pensées et permettant la mise en place d’une boutique en ligne rapidement et facilement. Ce CMS à était pensé pour que son administrateur ait la plus grande facilité à s’y retrouver et à gèrer son contenu. Il est donc préférable pour notre contexte d’utiliser un CMS le plus nativement possible dédié au e-commerce pour ainsi une correlation optimale avec notre objectif. 3.3 Activité et traffic sur un serveur web 3.4 Préparation de la plateforme 3.4.1 Backup Avant d’effectuer toutes optimisations du serveur LAMP, il est préférable d’effectuer systématiquement une copie original du fichier que l’on souhaite modifier afin que si une erreur survient, il y est toujours un fichier de backup disponible pour faire fonctionner le site. Le backup s’effectue simple avec la commande cp : 1 sudo cp FICHIER_CONF FICHIER_CONF.BACKUP-DATE 3.4.2 Plateforme de test Lors d’une optimsation d’un serveur web, il peut être intéréssant de mettre en place un plateforme de test afin dans un premier temps d’effectuer les optimisations sur la plateforme et ainsi voir les répèrecutions que cela engendre tant bien au niveau des erreurs que de l’optimisation. Ainsi avec une plateforme de test on pourra éviter les conflits dû on différentes Avcar Baltic Champain Projet SCAL Page 17/54 28 mars 2016 3 OPTIMISATION DU SERVEUR WEB modifications pour l’optimisation et qui pourrait ouvrir des failles ou bien ralentir le site web. De plus cela permet aussi d’éviter de rendre le site inaccessible à cause de relancement de service de serveur et ainsi aussi éviter la perte de données qui pourrait être très dommageable dans un environnement de e-commerce. 3.5 Optimisation de la couche middleware Dans la couche middleware, il existe deux composantes à optimiser dans notre contexte de e-commerce. Il s’agit en fait de deux des composantes du serveur LAMP, à savoir, le serveur Apache via l’installation et la configuration des modules et le serveur MySQL avec par exemple l’optimisation de la configuration ou encore l’utilisation du cache. Il est aussi possible d’optimiser le PHP mais cela touche à la couche applicative qui n’est pas abordée dans le projet. 3.5.1 Optimisation Apache L’optimisation d’Apache va consister en la mise en place de différents modules et/ou de reglès de configurations. Etant donné qu’Apache est un serveur web modulaire, il existe une grande liste d’optimisation possible sur Apache. Module Apache Les modules sont donc des fragements de code particuliers que l’on peut greffer de différentes façons au binaire représentant le serveur web Apache. Nous verrons ici seulement l’installation de module via le manager de paquet apt-get. Prefork Il s’agit d’un module multi-processus (MPM) qui implémente un serveur web avec démarrage anticipé de processus. C’est ce module MPM qui est nativement installé par Apache. Un processus de contrôle unique a pour tâche de lancer les processus enfants qui attendent les connexions et les traitent au fur et à mesure qu’elles arrivent. Apache essaie toujours de maintenir plusieurs processus serveurs inactifs ou en réserve, afin de pouvoir traiter les requêtes entrantes. De cette façon, les clients n’ont pas besoin d’attendre le démarrage d’un nouveau processus enfant pour que leurs requêtes puissent être traitées. Il s’agit du MPM le plus approprié si l’on souhaite isoler les requêtes les unes des autres, de façon à ce qu’un problèmes concernant un requête n’affecte pas les autres. Dans notre optique d’optimisation de serveur web, il ne s’agit pas forcement du module le plus performant dans le traitement de plusieures requêtes successives. Néanmoins c’est celuici que l’on a décidé de garder faute de problème de compatibilité avec l’autre module MPM. Avcar Baltic Champain Projet SCAL Page 18/54 28 mars 2016 3 OPTIMISATION DU SERVEUR WEB Il existe plusieures façon de mettre en place une configuration pour le module MPM prefork. Nous utiliserons ici une conditionnelle placée dans le fichier de configuration générale de Apache, apache.conf : 1 2 3 4 5 6 7 8 9 10 <IfModule mpm_prefork_module> MaxRequestWorkers 700 ServerLimit 700 StartServers 4 MinSpareServers 5 MaxSpareServers 10 MaxConnectionsPerChild 1000 </IfModule> Ce module MPM dispose de plusieurs directives permettant la configuration du modules et ainsi modifier son comportement. • La directive MaxRequestWorkers permet de fixer le nombre maximum de requêtes pouvant être traitées simultanément. Si la limite MaxRequestWorkers est atteinte, toute tentative de connexion sera normalement mise dans une file d’attente. • ServerLimit définit le nombre maximum que l’on peut affecter à la directive MaxRequestWorkers. • StartServers permet de définir le nombre de processus enfants du serveur créés au démarrage. • La directive MinSpareServers permet de définir le nombre minimum désiré de processus serveurs enfants inactifs. • La directive MaxSpareServers permet de définir le nombre maximum souhaité de processus serveurs enfants inactifs. • La directive MaxConnectionsPerChild permet de définir le nombre maximum de connexions qu’un processus enfant va pouvoir traiter au cours de son fonctionnement. Worker Ce module multi-processus (MPM) implémente un serveur hybride multi-processus multithread. En utilisant les threads pour servir les requêtes, il peut en traiter un grand nombre tout en consommant moins de ressources qu’un serveur à base de processus. Cependant, il Avcar Baltic Champain Projet SCAL Page 19/54 28 mars 2016 3 OPTIMISATION DU SERVEUR WEB conserve une grande partie de la stabilité d’un serveur à base de processus en maintenant plusieurs processus disponibles, chacun de ces derniers possédant de nombreux threads. Un processus de contrôle unique (le parent) a pour tâche de lancer les processus enfants. Chaque processus enfant crée un nombre fixe de threads serveurs selon la valeur de la directive ThreadsPerChild, ainsi qu’un thread chargé d’attendre les connexions et de les passer à un thread serveur pour traitement au fur et à mesure de leur arrivée. Le principal problème auquel on se heurte, c’est le type d’installation standard d’un serveur web Apache avec PHP, qui consiste à brancher PHP en tant que module Apache. De cette manière, les deux compères se retrouvent mariés et indissociables, mais ce n’est pas sans inconvénient. En effet, PHP (ou plutôt ses nombreuses librairies) n’étant pas threadsafe, il est indispensable d’utiliser le mode prefork-mpm d’Apache 2.4, l’évitant d’utiliser des threads séparés en forkant ses processus à la place. Pour palier à ce problème nous allons devoir avoir recours au FastCGi et à PHP-FPM. FastCGI FastCGI est une technique permettant la communication entre un serveur HTTP et un logiciel indépendant. C’est-à-dire, c’est une évolution du vieux protocole CGI, qui offre notamment la possibilité de recycler les processus et donc d’éviter d’avoir à les réinitialiser à chaque demande. Nous utiliserons le module Apache mod_fastcgi qui offre la possibilité de définir un Process Manager externe. Ces modules permettent donc de faire le pont entre Apache et PHP en lançant des processus (ou workers) PHP et de les recycler au besoin, sans pour autant que PHP soit intégré à Apache. Ils ont donc 2 rôles : • Passer les requêtes demandant une interprétation depuis le serveur vers un worker PHP. • Gérer les workers, leur nombre et leur recyclage. Ainsi on peut passer en mode worker-mpm, bien plus efficace. PHP-FPM FastCGI Process Manager (PHP-FPM) aide à réduire l’addition des ressources système utilisées en forçant le serveur à agir comme un proxy et à ne passer que les fichiers portant l’extension .php à PHP-FPM. Installation Malheureseument nous n’avons pas pu mettre en place ce module car celui-ci rentrait avec un conflit d’incompatibilité avec le module de recherche du CMS Joomla. Nous avons essayé Avcar Baltic Champain Projet SCAL Page 20/54 28 mars 2016 3 OPTIMISATION DU SERVEUR WEB de changer de module mais aucun ne fonctionnait comme convenu. Il s’agit d’un erreur CallStack et d’après nos recherches celui-ci viendrait de la mauvaise interprétation du code php par FastCGI et PHP-FPM. Néanmoins nous avons quand même effectué des tests afin de voir le potentiel d’optimisation et celui-ci est assez important. En effet nous avons réussi à passer 950 personnes simultanément. Voir fichier Test Charge Compression Expire Worker dans l’Annexe. Compression gzip Introduction Ce qui est intéressant avec la compression, c’est quelle va permettre d’optimiser le site web sur plusieurs point intéréssants. Tout d’abord envers la bande passante, en effet, comme les données renvoyées sont moins importante, cela va réduire la bande passante et ainsi permettre d’envoyer plus de requêtes vers les clients. Ensuite, cela un impact sur les performance du serveur web. Les données seront moins longues à être envoyées et donc plus rapide à être reçu par le client. Pour finir, le référencement. En effet, les moteurs de recherche comme google ou encore yahoo attribuent une note aux sites référencés qui permet de positionner le site web en fonction des résultats de recherche. Cette note peut être améliorer, si le site possède une compression gzip sur ses pages. Il donc intéréssant d’un point de vue visibilité d’activer la compression. Fonctionnement La compression des données est fait sur le serveur hébergeur du site. Les données compressées transitent ensuite par le réseau via HTTP(port 80) et ensuite le navigateur web du client décompresse les données avant de les interpréter. Optimisation L’optimisation est gérée par le module deflate. Il est possible d’optimiser un serveur soit, via le fichier .htaccess, via le fichier de configuration d’apache, apache.conf, ou, via le fichier de configuration mod_deflate.conf. Nous nous attaderons sur cette troisième solution. Pour débuter, nous allons d’abord activer mod_deflate et mod_headers. Ce dernier module va fournir des directives permettant de contrôler et de modifier les en-têtes de requêtes. 1 2 sudo a2enmod deflate sudo a2enmod headers Avcar Baltic Champain Projet SCAL Page 21/54 28 mars 2016 3 OPTIMISATION DU SERVEUR WEB Par la suite il va nous falloir modifier le fichier de configuration de mod_deflate, /etc/apache2/modsavailable/deflate.conf, afin d’optimiser la compression. Voir le fichier de configuration en annexe. Une fois le fichier de configuration modifié, il nous suffit de redémmarrer Apache afin qu’il prenne en compte la configuration. 1 sudo service apache2 restart Test En effectuant un test avec ab, on s’apercoit que le temps par requête est passé de 42 à 36 ms. Ce qui nous a permis d’optimiser le temps de le nombre de requête par second. Quand au nombre de connexion simultanées, il a aussi été augmenté. Nous sommes passés de 200 à 250. Voir les fichiers Test Charge Compression et Test Charge en Annexe. Temps d’expiration Expires Introduction Le mod_expires permet de contrôler le temps d’expiration d’un fichier récupéré par le visiteur lors de la visite d’une page web en modifiant l’en-tête HTTP Expires. Cette entête défini auprès du navigateur client le temps de validité et de persistence du document, lui indiquant combien de temps il est souhaitable qu’il le conserve dans son cache local. Ainsi en configurant correctement ces directives, cela permet d’abaisser le nombre de requêtes sur le serveur. En effet, le client privilégiera son cache lors du rechargement d’un document qui n’est pas considéré comme expiré. De plus cela permettra aussi au client une navigation plus fluide. Fonctionnement Le client va récupérer des données via le serveur. Si ces mêmes données sont appelées de nouveau et que le temps expiration de l’en-tête HTTP Expires n’est pas dépassé, alors les données seront récupérées via le cache du client et non en refaisant une requête au serveur de données. Si l’entête est expiré alors les données seront demandées de nouveau au serveur de données. Optimisation La configuration de l’entête HTTP Expires se fait via le module mod_expires. Ainsi comme Avcar Baltic Champain Projet SCAL Page 22/54 28 mars 2016 3 OPTIMISATION DU SERVEUR WEB pour la compression gzip, il est possible de configurer via le fichier .htaccess afin de le définir sur un répertoire donnée, soit via la configuration général avec le fichier apache.conf, ou, soit via le fichier de configuration expires.conf. Nous allons ici, continuer la configuration via cette troisième option. Mais avant la configuration, il faut s’assurer que le module est bien activé. 1 sudo a2enmod expires Ensuite, si le fichier de configuration, /etc/apache2/mods-available/expires.conf, n’existe pas, il faut alors le créer. Sinon il suffit d’ajouter les lignes suivantes au fichier de configuration. Cela permettra d’optimiser de façon intelligente la gestion du cache local du client. Voir le fichier de configuration en annexe. Une fois le fichier de configuration modifié, il nous suffit de redémmarrer Apache afin qu’il prenne en compte la configuration. 1 sudo service apache2 restart Test Après avoir optimisé les dates d’expiration. On peut aisement passer à 300 connexions simultannées. Voir le fichier Test Charge Compression Expires en Annexe. Xcache PHP5 Introduction XCache est un outil permettant de mettre en cache (en mémoire vive) le résultat de la compilation des fichiers PHP. Cela entraine bien évidemment un gain en performance (en terme de CPU et d’I/O). Il est possible de l’installer via le paque suivant : 1 sudo apt-get install php5-xcache Fonctionnement Lorsque l’on fait une requête sur une page php, le serveur web, via une librairie dédiée au service de pages php récupère le code de la page, le fichier, et le compile sous forme de bytecode (code binaire). C’est ensuite ce bytecode qui est exécuté pour générer le texte au format HTML qui sera ensuite envoyé au client. Lorsqu’il n’y a qu’un ou deux fichiers php, et peu de visites cette étape ne prend pas longtemps et donc cela ne se voit pas, mais dans notre Avcar Baltic Champain Projet SCAL Page 23/54 28 mars 2016 3 OPTIMISATION DU SERVEUR WEB contexte, il existe pas mal de fichiers php, qui entrent en jeu pour servir une seule page... et cela prend du temps. Il est donc assez judicieux de vouloir sauvegarder en mémoire le résultat de la compilation de ces fichiers php, de manière à les exécuter plus vite, dès réception de la requète. C’est ce que fait Xcache. Optimisation Tout est préparé par default et l’on peut vérifier que l’outil est bien installé via un phpinfo(). Les seules valeurs intéressantes à modifier dans le fichier de configuration sont la valeur xcache.size et la valeur de xcache.count. Les direcives se trouve dans le fichier /etc/php5/conf.d.xcache.ini 1 2 xcache.size = xcache.count = 128M 12 Xcache.size va permettre de spécifier la quantité complète de mémoire utilisable. Nous fixons à 128M car nous disposons de beaucoup de mémoire vive. Xcache.count permet de préciser le nombre de processeurs sur le serveur. Ainsi le cache va être divisé pour une meilleur optimisation des accès mémoire lors de la recherche du code précompilé d’un fichier PHP. Etags ETag sert à vérifier si un document a été mis à jour ou pas depuis la dernière fois. Un identifiant unique pour chaque URL est transmis par requête HTTP. Le navigateur va demander au serveur si le document a été modifié. Le navigateur et le serveur vont comparer leur identifiant. Si le document n’a pas été modifié, le serveur répondra "304 Not Modified", et le navigateur utilisera son cache pour afficher le document. Si le document a été modifié, le document sera à nouveau téléchargé. Le problème d’ETag est que si le site web est géré par un cluster de serveurs, l’ETag peut être différent même si les documents ont tous été mis à jour à la même date. Le navigateur risque donc de télécharger le document, et donc d’utiliser de la bande passante, alors que sa version dans le cache est à jour. Voilà pourquoi on va désactiver ETag. On rajoute donc dans le fichier de configuration général d’Apache, apache.conf : 1 2 Header unset ETag FileETag none Timeout Timeout définit le nombre de secondes entre l’envoie et la récupération maximum. Si le Avcar Baltic Champain Projet SCAL Page 24/54 28 mars 2016 3 OPTIMISATION DU SERVEUR WEB Timeout est trop élevé, cela forcera les visiteurs à attendre en ligne le chargement. Si le Timeout est trop faible, cela provoquera un script qui terminera plus tôt que prévu l’échange. 100 est une valeur raisonnable pour un Virtual Private Servers ou heavily loaded dedicated servers. Pour un loaded didicated server normal, il faut laisser par défaut 300, ce qui est suffisant. On modifie donc dans le fichier de configuration général d’Apache, apache.conf : 1 Timeout 100 KeepAlive On laisse KeepAlive sur On afin de permettre de réutiliser une connexion ouverte pour envoyer plusieurs documents au même client. Le navigateur va pouvoir télécharger les images d’une page en économisant l’ouverture de connexions successives. En cas d’attaque et de trafics trop lents importants, il est recommandé de désactiver cette fonctionnalité, juste le temps de rétablir la situation. KeepAliveTimeout KeepAliveTimeout va définir la durée en secondes pendant laquelle le serveur attendra, après avoir servi une demande, la demande suivante, avant d’interrompre la connexion. On passe de la valeur par défaut 5 à 2. HostnameLookups Habituellement le serveur web va enregistrer le nom complet de chaque client, dans le fichier access.log Cette résolution de nom prend du temps. En désactivant cette option, ce qui est le cas par défaut, on évite cette perte de temps et le serveur peur donc avoir un trafic plus important. Serveur Memcached Introduction Memcached est un serveur de cache permettant d’accélérer les requêtes des clients. Il permet de garder en mémoire vive des portions de données, un accès plus rapide et soulager les accès Avcar Baltic Champain Projet SCAL Page 25/54 28 mars 2016 3 OPTIMISATION DU SERVEUR WEB à la base de données. Il peut également être utilisé pour une meilleure efficacité en complément du module ModPageSpeed. On traitera de ce dernier juste après. Ce module est utilisé par de nombreux sites très fréquenté tel que, Youtube, Facebook ou encore Tweeter. Afin de faire fonctionner Memcached, il est nécéssaire d’installer les paquets suivants : 1 2 sudo apt-get install memcached php5-memcached libmemcached-tools sudo apt-get install php5-dev php-pear make Ainsi dans le paquet memcached on retrouve toutes les librairies nécéssaires à son fonctionnement. Le paquet php5-memcached contient tout ce qui va permettre pour communiquer avec le serveur Memcached en se servant de la librairie libmemcached. Enfin le paquet libmemcached-tools permettra la communication via une ligne de commande avec le serveur Memcached. Fonctionnement Memcached fonction comme un serveur, au sens applicatif du terme. C’est à dire, comme pour une base de donnée, les applications adressent des requêtes à memcached, qui leur répond. Il fonctionne à la manière d’une table de hash, c’est à dire une correspondance clévaleur. De plus, memcached dispose d’un caractère distribué. C’est à dire que l’on peut lancer autant d’instances de memcached, sur autant de serveurs que l’on veut, elles se repartiront le travail et le stockage de manière totatlement automatique et transparente. Chaque paire de clé-valeur ne sera stockée que dans une seule instance de memcached. Optimisation Une fois tous les paquets installés. Il est nécéssaire de vérifier si dans le fichier, /etc/php5/modsavailable/memcache.ini, ces deux lignes sont bien présentes. Sinon il faut les rajouter. 1 -m 8192 Cette ligne permet d’activer l’extension memcache.so. Il ne s’agit pas vraiment d’optimisation dans ce fichier mais plus de vérification pour le meilleur focntionnement de memcached. Par la suite, il va nous falloir modifier la mémoire de memcached. Par défaut elle est de 64MB et il est possible de l’augmenter jusqu’à 1/4 de la RAM total. La mémoire est définit via l’option "-m" dans le fichier de configuration de memcached, /etc/memcached.conf. 1 extension=memcache.so Avcar Baltic Champain Projet SCAL Page 26/54 28 mars 2016 3 OPTIMISATION DU SERVEUR WEB On décide de mettre cette valeur à 1/4 de la ram total du serveur c’est à dire 8192 pour notre cas. Puisque que nous disposons de beaucoup de mémoire vive. Pour finir, il est nécéssaire de redémarrer le service memcached afin qu’il prenne en compte la nouvelle configuration 1 service memcached restart On peut voir si le serveur de cache fonction bien via cette commande : 1 sudo netstat -tap | grep memcache On devrait y retrouver la ligne suivant nous confirmant l’activité du port 11211 (port par défaut de memcached). 1 tcp 0 0 localhost.localdo:11211 *:* LISTEN 7013/memcached Test Lors de notre projet nous n’avons pas réussi à mettre en place le serveur memcached car celui-ci rentrer en conflit avec Joomla pour une raison qui nous a été inconnue. Cependant lors de mise place sur une plateforme de test, nous avons ressentie une certaines amélioration. 3.5.2 Optimisation Mysql Pour l’optimisation de MySQL nous avons utilisé un outil qui s’appelle MySQLTuner. Il s’agit en fait d’un script écrit en Perl qui va analyser le serveur MySQL et proposer des améliorations et des recommandations à faire afin de l’optimiser. On télécharge le script et on lui donne les droits d’exécution puis on l’exécute : 1 2 3 wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl chmod +x mysqltuner.pl ./mysqlturner.pl (Voir les résultats dans l’annexe) Après l’analyse faite du résultat obtenu par le script, on constate qu’il y a quelques modifications à faire. Dans les recommandations il est indiqué d’activer les logs de requêtes lentes, les requêtes qui n’utilisent pas d’index et de défragmenter les tables. Avcar Baltic Champain Projet SCAL Page 27/54 28 mars 2016 3 OPTIMISATION DU SERVEUR WEB 3.5.3 Les logs de requêtes lentes Le but de ce fichier de log sera de recenser requêtes lentes, c’est-à-dire toutes les requêtes qui auront un temps d’exécution supérieur à la valeur de la variable « long-query-time ». Ensuite les analyser et traiter. Pour activer les logs de requêtes lentes on rajoute la ligne suivante dans le fichier /etc/mysql/my.cnf en précisant le chemin du fichier de logs créé : 1 slow\_query\_log\_file = /var/log/mysql/mysql-slow.log La ligne suivante consiste, comme dit précédemment, à définir un temps (en seconde) pour qualifier une requête de « requête lente ». 1 long\_query\_time = 3 Toutes les requêtes qui mettrons plus de 3 secondes à s’exécuter seront dans le fichier de logs défini précédemment. On peut éventuellement modifier la valeur de « long_query_time » depuis MySQL. On affiche la valeur de la variable avec la commande suivante : 1 SHOW GLOBAL VARIABLE LIKE ‘long\_query\_time’; On modifie la valeur de la variable avec la commande suivante : 1 SET @@global.long\_query\_time = 3}; Exemple de log de requêtes lentes : 1 2 3 4 5 \# Time: 160320 10:14:53 \# User@Host: db\_user[db\_database] @ localhost [] \# Query\_time: 4.485129 Lock\_time: 0.000065 Rows\_sent: 215 Rows\_examined: 226 SET timestamp=1425695147; SELECT option\_name, option\_value FROM wp\_options WHERE autoload = ’yes’} • La première ligne indique la date et l’heure où la requête a été enregistrée. Le format est AAMMJJ pour la date et H :M :S pour l’heure. Ici la requête a été enregistrée le 20 mars 2016 à 10 heures 14 et 53 (heure du serveur). • La seconde ligne indique l’utilisateur MySQL, la base de donnée et le nom d’hôte. Avcar Baltic Champain Projet SCAL Page 28/54 28 mars 2016 3 OPTIMISATION DU SERVEUR WEB • La troisième ligne indique le temps de recherche total, le temps de verrouillage, le nombre de lignes envoyés ou retournés, et le nombre de lignes examinées lors de la requête. • La quatrième ligne indique le temps réel passé pour la requête. • La dernière ligne indique la requête complète. 3.5.4 Ne pas utiliser d’index Un index est une information présente sur une ou plusieurs colonnes qui va faciliter la recherche de données. En effet le système de base de données va d’abord chercher l’index pour retrouver plus facilement et plus rapidement des données précises. Cela fonctionne comme un livre, des mots précis sont listés avec leur numéro de page là où ces mots sont évoqués. Grâce à l’option log_queries_not_using_indexes les requêtes qui n’ont pas d’index seront logués. Il suffit d’ajouter la ligne dans le fichier /etc/mysql/my.cnf. Par la suite nous pourrons leur ajouter des index. Il y a trois types d’index : PRIMARY KEY, UNIQUE et INDEX. Un index PRIMARY KEY est unique, les valeurs NULL ne sont pas acceptées. Un index UNIQUE est unique, les valeurs NULL sont acceptées. Un index INDEX permet d’indexer une colonne qui peut contenir des doublons. Pour créer un index UNIQUE on tape la commande suivante : 1 CREATE UNIQUE INDEX nom\_index ON nom\_table (nom\_colonne) ; Pour créer un index INDEX on tape la commande suivante : 1 CREATE INDEX nom\_index ON nom\_table (nom\_colonne) ; Les index PRIMARY KEY sont automatiquement indexés lors de la création des tables mais on peut quand même en créer manuellement : 1 2 ALTER TABLES nom\_table ADD CONSTRAINT table\_pk PRIMARY KEY (table\_id) ; Avcar Baltic Champain Projet SCAL Page 29/54 28 mars 2016 4 BENCHMARKS 3.5.5 L’utilisation des requêtes lentes Quand une requête n’a pas d’index, le serveur MySQL doit utiliser plus de ressources donc plus de temps pour traiter la requête. C’est pour cela que ces deux options, les logs de requêtes lentes et requêtes sans index, vont parfaitement en semble. 3.5.6 Défragmentation La base MySQL faisant constamment des requêtes il est nécessaires de défragmenter régulièrement les tables afin de les optimiser. Pour cela on peut utiliser la commande : 1 OPTIMIZE TABLE nom\_table ; pour défragmenter une table précise. Mais pour défragmenter toutes les tables en même temps on va utiliser la commande suivante : 1 mysqlcheck -u root -p --auto-repair --optimize--all-databases} La commande OPTIMIZE TABLE détecte si la table est fragmentée et la compacte, trie les index si nécessaires et met à jour les statiques. Exemple de différents résultats obtenus à la fin de la défragmentation des tables : table_x table_y table_z Table is already up to date OK Table does not support optimize, doing recreate + analyze instead « Table is already up to date » signifie que l’optimisation n’était pas nécessaire. « OK » signifie que l’optimisation a été faite. « Table does not support optimize, doing recreate + analyze instead » indique qu’il y a un problème d’incompatibilité. En effet pour les tables en InnoDB la requête n’est pas la même, il faut utiliser la requête : « ALTER TABLE nom_table ENGINE=’InnoDB’ ; » afin de pourvoir optimiser les tables en InnoDB. 4 Benchmarks Le benchmarking peut être défini comme un démarche de comparaison utilisée pour évaluer la performance des différentes applications. Avcar Baltic Champain Projet SCAL Page 30/54 28 mars 2016 4 BENCHMARKS 4.1 Outils de benchmarks • ab est un outil d’Apache qui permet de lancer plusieurs requêtes à la suite. Il affiche ensuite les résultats sur le temps de réponse (min, max, moyen), le nombre de réponses valides. http ://httpd.apache.org/docs/2.2/programs/ab.html • Curl Loader est un outil gratuit open source qui simule des connexions simultanées, il peut aussi simuler des connexions depuis différentes adresses ip. Fwptt fonctionne aussi avec plusieurs protocoles tels que HTTP/S, FTP/S, SCP, SSH, LDAP, TFTP, Telnet. Il gère aussi les cookies. http ://curl-loader.sourceforge.net/ • fwptt est un outil qui enregistre des requêtes à partir d’un navigateur. Il peut enregistrer des requêtes normales mais aussi des requêtes AJAX. http ://fwptt.sourceforge.net/ • http_load est un outil qui permet de tester la charge pour une page en envoyant une URL plusieurs fois avec plusieurs connexions simultanées. Il affiche ensuite les résultats : la durée des réponses, le temps de réponse, nombres de requêtes etc. . . http ://www.acme.com/software/http_load/ • JMeter est un outil d’Apache qui permet de tester les performances de plusieurs serveurs/protocoles : Web – HTTP/S. SOAP / REST. FTP. SGBD via JDBC. LDAP. Mail – SMTP/S, POP3/S, IMAP/S. MongoDB. TCP. http ://jmeter.apache.org/ • Pylot est un outil open source, gratuit qui permet de tester les performances et la montée en charge de services web. Il créé des requêtes concurrentes et vérifie les types de réponse. http ://www.pylot.org/ • Selenium est à la base un outil qui permet de mettre en œuvre des tests afin de vérifier les affichages des sites. On peut l’utiliser aussi comme outil de tests de charge puisqu’il permet de d’enregistrer des séquences de navigation depuis le navigateur internet. http ://www.seleniumhq.org/ Avcar Baltic Champain Projet SCAL Page 31/54 28 mars 2016 5 SUIVI D’ACTIVITÉ • Siege est un outil qui permet de faire des tests de montée en charge en simulant un nombre défini de connexions simultanées sur une ou plusieurs sites. Les résultats affichent le nombre totale de hits enregistrés, de bytes transférés, le temps de réponse, les accès concurrents et retourne le statut du serveur. https ://www.joedog.org/siege-home/ • Tsung est un outil open source, gratuit sous licence GPLv2 qui permet de faire des tests sur HTTP, WebDAV, SOAP, PostgreSQL, MySQL, LDAP et Jabber/XMPP mais aussi de mesurer l’utilisation de la RAM et du CPU. http ://tsung.erlang-projects.org/ • Web Polygraph est un outil gratuit qui permet de tester plusieurs protocoles, tel que HTTP, HTTPS, FTP. . . http ://www.web-polygraph.org/ 5 Suivi d’activité Pour le suivi d’activité nous avons utilisé Google Analytics. Google Analytics est un service que Google propose gratuitement qui permet d’analyser les statistiques d’audience du site concerné. Avcar Baltic Champain Projet SCAL Page 32/54 28 mars 2016 5 SUIVI D’ACTIVITÉ Que peut-on faire principalement avec Google Analytics ? On peut suivre le trafic de notre site, le nombre de visiteurs datés ou en temps réel, l’origine du trafic c’est-à-dire d’où l’utilisateur provient ? S’il provient d’un moteur de recherche, d’un réseau social ou directement en ayant tapé l’URL du site. Il est également possible de savoir si l’utilisateur est sur mobile, sur tablette ou sur ordinateur. Une carte indique aussi sa localisation géographique. Il est possible de savoir les pages les plus visitées, le navigateur utilisé, le système d’exploitation utilisé, et bien d’autres informations. Tout cela représenté sous différents types de diagrammes. Quel est l’intérêt de Google Analytics ? Grâces aux informations récoltées on va pouvoir optimiser le contenu du site par rapport aux utilisateurs. Par exemple s’il y a plus 70% des utilisateurs qui vont sur le site via leur téléphone mobile, grâce à cette information on adaptera le site pour qu’il soit un maximum compatible pour les mobiles. Un autre exemple, si notre site est un site d’e-commerce, en déterminant le profil des utilisateurs (âge, zone géographique, etc. . . ) on pourra cibler les produits vendus sur le site par rapport aux profils des utilisateurs. Google Analytics nous a été utile dans le sens où nous avons pu observer la chute et la montée du nombre d’utilisateur en temps réel lors de nos tests et nos modifications. Cela est pratique pour voir à quel degré on affecte le site. 5.1 SLA Service level agreement (SLA) est un document qui va défnir la qualité de service requise entre un prestataire et un client. Le contrat va spécifier les niveaux de disponibilité, de performance, d’opération ou d’autres choses concernant le service en question. Les SLA ont commencé à être utilisés à la fin des années 1980 par les opérateurs téléphoniques. Actuellement, les services informatiques des entreprises ont repris l’idée des SLA afin de comparer la qualité de service fournie avec celle promise. Le contrat peut contenir plusieurs mesures, par exemple le taux de pannes résolues, le pourcentage de l’uptime de serveurs sur le réseau, le temps moyen de résolution d’un incident. Pour améliorer ces mesures, on peut mettre en place de la haute disponibilité ainsi que de la répartition de charges. Avcar Baltic Champain Projet SCAL Page 33/54 28 mars 2016 6 INFRASTRUCTURE DE HAUTE DISPONIBILITÉ 6 Infrastructure de Haute disponibilité La haute disponibilité va permettre d’augmenter le taux de disponibilité du serveur. Il faut rendre les sites web accessibles le plus longtemps possible. Pour cela on peut mettre en place des réplications de serveur apache et base de données. Par exemple si on a 2 serveurs identiques, le risque que les sites web soient inaccessibles est réduit car si un serveur subit une panne, le 2nd prendra le relais, la haute disponibilité est donc augmentée. 6.1 Schéma de l’infrastructure Pour la haute disponibilité et répartition de charges, nous avons choisi de prendre 1 serveur HAProxy qui fait également routeur, 3 serveurs de base de données sous MariaDB ainsi que 3 serveurs web où sera répartie la charge. 6.2 HAProxy HAProxy est un logiciel libre, open source de licence GNU General Public License Version 2 écrit en langage C. Le créateur de ce logiciel est Willy Tarreau. La première version de ce logiciel date du 16 décembre 2001. La dernière version stable est la 1.6.4, elle date du 14 mars 2016. La dernière version en développement est la 1.7-dev. HAProxy fonctionne sur les systèmes d’exploitations suivants : Linux, FreeBSD, OpenBSD, Avcar Baltic Champain Projet SCAL Page 34/54 28 mars 2016 6 INFRASTRUCTURE DE HAUTE DISPONIBILITÉ Solaris, AIX. De nombreux sites utilisent HAProxy, comme par exemple GitHub, Bitbucket, Stack, Overflow, Reddit, Tumblr, Twitter et Tuenti. Willy Tarreau, le créateur d’HAProxy, est un contributeur au noyau linux. Il continue de maintenir le projet HAProxy. HAProxy va permettre la répartition des connexions reçues d’un protocole sur plusieurs serveurs. Il fonctionne avec les connexions TCP. HAPproxy peut également servir en tant que reverse-proxy pour les sites webs. HAProxy est très performant, il peut tenir des charges importantes, et les ressources matérielles nécessaires à son utilisation sont très faibles, cependant il possède quelques inconvénients. Il ne possède pas d’interface Web pour la configuration, et il est impossible de reconfiguer à chaud. 6.3 Installation et configuration Pour l’installation, on va simplement installer le paquet haproxy. On va ensuite activer haproxy : sed -i "s/ENABLED=0/ENABLED=1/g" /etc/default/haproxy sed -i "s/ENABLED=0/ENABLED=1/g" /etc/init.d/haproxy La configuration d’HAProxy se fait grâce au fichier haproxy.cfg Voir fichier haproxy.cfg dans Annexe. 6.4 Configurations réseaux des serveurs Les 3 serveurs web et les 3 serveurs mariaDB sont dans le réseau 10.1.0.0/24 Ils ont pour passerelle : 10.1.0.1 Ils ont pour masque : 255.255.255.0 Le serveur Hearbeat/HAProxy nous sert de routeur afin que les serveurs web et bases de données ne soient pas joignables depuis un autre réseau. Il possède donc 2 cartes réseaux : eth0 qui a pour adresse IP 192.168.4.23 Avcar Baltic Champain Projet SCAL Page 35/54 28 mars 2016 6 INFRASTRUCTURE DE HAUTE DISPONIBILITÉ Elle a pour masque 255.255.255.0 Elle a pour passerelle 192.168.4.1 eth1 qui a pour adresse IP 10.1.0.1 Elle a pour masque 255.255.255.0 Elle a pour passerelle elle même. Son nom d’hôte est : serverhaproxy. Les 3 serveurs webs ont pour configuration : Dates Nom d’hôte web1 web2 web3 Objet(s) Addresse IP 10.1.0.21 10.1.0.22 10.1.0.23 Figure 10 – Tableau récapitulatif des base de données. Les 3 serveurs de base de données sous mariaDB ont pour configuration : Dates Nom d’hôte mariadb1 mariadb2 mariadb3 Objet(s) Addresse IP 10.1.0.24 10.1.0.25 10.1.0.26 Figure 11 – Tableau récapitulatif des base de données. Avcar Baltic Champain Projet SCAL Page 36/54 28 mars 2016 6 INFRASTRUCTURE DE HAUTE DISPONIBILITÉ 6.5 Load Balancing Le load balancing signifie répartition de charge en français. C’est un ensemble de techniques qui va permettre de répartir une charge entre différentes marchines. Lorsqu’on a un serveur web par exemple, et qu’on a une forte audience sur notre site on aura énormément de traffic sur notre serveur, et la charge sera élevée. Grâce au load balancing, on va pouvoir répartir cette charge élevée entre différents serveurs webs. Le fait de répartir correctement la charge sur plusieurs machines évite la saturation d’un serveur web comme ce serait le cas par exemple lors d’une attaque par déni de service. Avec HAProxy, on a 1 seule adresse IP, celle du serveur HAProxy, pour accéder au service demandé (ici web). Il existe 3 types de solutions de load balancing : DNS Round-Robin, GeoDNS et Anycast. DNS Round Robin est un système de tourniquet, c’est à dire lorsqu’une requete DNS arrive, le serveur DNS peut répondre en ne fournissant pas une, mais plusieurs IP dans une liste et rangées dans un ordre précis. La première adresse IP de cette liste est l’IP que le client doit utiliser, les autres IP de la liste ne sont là qu’en cas de secours au cas où par exemple le serveur de la première IP ne répond pas. L’ordre des IP de la liste change à chaque requête du client. Ce n’est donc jamais la même Avcar Baltic Champain Projet SCAL Page 37/54 28 mars 2016 6 INFRASTRUCTURE DE HAUTE DISPONIBILITÉ adresse IP en tête de liste. On peut attribuer sur chaque serveur un poids qui influence la répartition. Ce poids est sur 100. Prenons par exemple un serveur web qui a comme poids 20, et un autre serveur web qui a comme poids 80. Lorsqu’un client fait une requete, celle-ci a 80%de chance d’arriver sur le serveur web ayant comme poids 80. Cette attribution de poids est utile car tous les serveurs n’ont pas exactement la même puissance. Si on a un serveur avec peu de puissance et un serveur beaucoup plus puissant et qu’on ne met pas de poids (dans ce cas ce sera 50 chacun), alors on a un risque que le serveur avec peu de puissance se retrouve complétement saturé alors que le serveur beaucoup plus puissant n’exploite même pas 40% de ses capacités. Cette méthode de DNS Round-Robin présente quand même quelques incovénients. En effet lors de la répartition, DNS Round-Robin ne tient pas compte de la charge propre à chaque serveur et peut envoyer une requête d’un client vers un serveur momentanément en état de surcharge. Il y’a également un autre inconvénient, si on se trouve dans une situation avec plusieurs serveurs distants répartis géographiquement dans le monde, le serveur DNS peut indiquer l’adresse IP d’un serveur qui se trouve être le plus éloigné du client. Le temps de réponse sera donc plus lent et la qualité de service se dégradera. GéoDNS est un système qui va permettre de résoudre le problème vu précédément où on a des serveurs distants répartis géographiquement dans le monde. Le serveur DNS va d’abord localiser le client en analysant son adresse IP. Il fournira ensuite l’adresse IP du serveur étant le plus proche géographiquement du client. La liste d’adresses IP de serveurs ne se fait plus de façon circulaire, mais avec un classement des serveurs allant du plus près géographiquement du client, jusqu’au serveur le plus éloigné. C’est le système le plus utilisé sur Internet et qui est intéressant dans le cadre d’une répartition mondiale. Avcar Baltic Champain Projet SCAL Page 38/54 28 mars 2016 6 INFRASTRUCTURE DE HAUTE DISPONIBILITÉ DNS Anycast est un système où on est dans un cas de plusieurs plateformes réparties mondialement. Chaque plateforme possède un serveur DNS. Tous les serveurs DNS possèdent la même adresse IP. Quand un client va effectuer une requète, il atteindra le serveur DNS le plus proche, au niveau topologie d’Internet, de chez lui. Ce serveur DNS va ensuite lui fournir une liste d’adresses IP de serveurs de sa propre plateforme de la même manière qu’en DNS Round-Robin. Ce système est utilisé par des gros sites web, comme par exemple Google, dont l’architecture est réparties mondialement sur plusieurs plateformes. Contrairement à ce que l’ont pourrait penser, cette méthode ne présente pas de risques. Le fait d’avoir la même adresse IP sur les serveurs DNS ne posent pas de problèmes car le protocole DNS repose sur UDP et donc ne nécessite pas l’établissement d’une session contrairement à TCP. Pour conclure, le load balancing est une bonne chose, mais il y’a tout de même 2 inconvénients non-négligeables : - Le fait que le serveur va répartir sans vérifier si un serveur n’est pas déjà en surcharge. - Le fait qu’il n’y ai pas de détection de panne. Le serveur continura de répartir même si un serveur n’est pas disponible, un certain nombre de requêtes seront donc perdues. Il y’a également un dernier inconvénient : le client ne peut pas toujours être en relation avec le même serveur car chaque requète change de serveur. Il n’est donc pas possible de garder une connexion permanente entre le client et un serveur. On peut tout de même préciser que le client va conserver pendant quelques minutes dans son cache l’adresse IP du serveur utilisé. La répartition de charge dans ce cas là appartient à la couche numéro 4 du modèle OSI, c’est à dire Transport. Avcar Baltic Champain Projet SCAL Page 39/54 28 mars 2016 6 INFRASTRUCTURE DE HAUTE DISPONIBILITÉ Il y’a donc une connexion entre la machine et les serveurs avant toute communication. Le load balancing va également s’appuyer sur le principe de la translation d’adresse NAT (Network Address Translation). Les machines extérieures ne voient pas ce qu’il y’a dans l’autre réseau. Pour le client il n’y a qu’un seul serveur web possédant une adresse IP unique et publique. Comme expliqué précédement, la répartition se fait de plusieurs manières. Il existe une multitude d’algorithmes pour la répartition de charges : - Round-robin : l’affectation va se faire de manière circulaire( web1, puis web2, puis web3, puis web1, ...) - Weighed-round-robin : c’est l’affectation de la même manière qu’en Round-robin, mais avec un système de poids. Le poids va influancer lors de la répartition. - Least-connection : le choix va se faire sur le serveur ayant le moins de connexions en cours. - Weighed-least-connection : cela reprend le précédent principe, mais en rajoutant un système de poids. - Priority-activation : si un niveau de charge est dépassé sur des serveurs, d’autres serveurs de secours seront alors activés et utilisés. - Affinité : le client, identifié par son adresse IP et le port TCP, aura toujours le même serveur. - Aléatoire : le choix du serveur va s’effectuer par tirage au sort, et donc de manière totalement aléatoire. 6.6 Configuration serveurs web On installe le paquet apache2 sur tous les serveurs webs. Avcar Baltic Champain Projet SCAL Page 40/54 28 mars 2016 6 INFRASTRUCTURE DE HAUTE DISPONIBILITÉ 6.7 Test de la répartition de charge Pour tester si la répartition de charge est fonctionnelle, on modifie la page index.html de chaque serveur web afin des les rendre unique. On va ensuite utiliser une machine située à l’extérieur, et on se connecte depuis un navigateur sur le serveur web en rentrant l’adresse IP du serveur Haproxy. On devrait normalement tomber sur la page index.html d’un des serveurs web. Quand on actualise la page, on devrait tomber sur la page index.html d’un autre serveur web. Si on actualise une nouvelle fois, on tombe sur une autre page index.html, lorsqu’on a configuré HAProxy en Round-robin. 6.8 MariaDB MariaDB est un système de gestion de base de données (SGBD). Il est édité sous licence GPL.C’est le fondateur de MySQL, Michael Widenius, qui quitte sa société suite au rachat de MySQL par Sun Microsystems. Il a décidé de lancer MariaDB afin de remplacer MySQL. Le nom MariaDB vient du nom de la seconde fille du fondateur qui s’appelle Maria. MariaDB est un fork communautaire de MySQL. 6.9 Gelra Cluster Avcar Baltic Champain Projet SCAL Page 41/54 28 mars 2016 6 INFRASTRUCTURE DE HAUTE DISPONIBILITÉ Gelra Cluster est une solution disponible uniquement sur Linux. Cette solution va permettre un cluster multi-maître synchrome pour MariaDB. Gelra Cluster se met en place un minimum 3 serveurs. Lorsqu’un utilisateur écrit dans une des bases de données sur un serveur, les nouvelles données seront répliquées sur les autres serveurs de base de données. 6.10 Heartbeat Heartbeat est une application distribué sous licence GPL. Cette application est compatible sous Ubuntu, Debian, FreeBSD, OpenBSD, Solaris et MacOS X. Heartbeat est une application qui va pouvoir surveiller la disponibilité de serveurs. Heartbeat signifie en français battements de coeur. C’est son nom car il va écouter les services d’une grappe de serveurs lorsque ceux ci sont opérationnels. Lorsqu’un serveur ne répond plus, Heartbeat va, grâce à des scripts, s’assurer qu’un serveur prenne le relais. Heartbeat fonctionne avec Pacemaker. 6.10.1 Installation et configuration d’Heartbeat On installe le paquet heartbeat. On a 3 fichiers à configurer : ha.cf 1 2 3 4 5 6 7 8 9 10 11 12 13 mcast eth0 239.0.0.11 694 1 0 logfile /var/log/ha-log warntime 4 # le delai avant de declarer qu’un noeud est mort deadtime 5 # c’est le temps avant qu’heartbeat ne demarre les ressources la premiere #fois qu’il se lance: mariadb initdead 15 keepalive 2 #Re-balance les services sur le lb primaire quand il revient en ligne auto\_failback on Avcar Baltic Champain Projet SCAL Page 42/54 28 mars 2016 6 INFRASTRUCTURE DE HAUTE DISPONIBILITÉ 14 15 16 #Serveurs du cluster node serverhaproxy haresources 1 serverhaproxy IPaddr::192.168.4.23/24/eth0 haproxy authkeys 1 2 auth 3 3 md5 cluster-db-key 6.11 Installation MariaDB et Galera Cluster Afin de mettre en place notre cluster de base de données MariaDB avec Galera Cluster, il faut ajouter les dépôt Debian nécessaire. Sur les trois serveurs de bases de données, faire les manipulation suivantes : 1 2 3 sudo apt-get install software-properties-common sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db sudo add-apt-repository ’deb [arch=amd64,i386] http://ftp.igh.cnrs.fr/pub/mariadb/rep Par la suite il nous faut recharger le nouveau dépôt et on pourra installer le paquet mariadbserver : 1 2 sudo apt-get update sudo apt-get install mariadb-server 6.11.1 Configuration Galera Cluster Maintenant que MariaDb est installé, il faut configurer Galera Cluster afin de mettre en place la réplication entre les serveurs. Il y’a un fichier à configurer : /etc/mysql/conf.d/galera.cnf 1 2 3 4 5 [mysqld] #mysql settings binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 Avcar Baltic Champain Projet SCAL Page 43/54 28 mars 2016 6 INFRASTRUCTURE DE HAUTE DISPONIBILITÉ 6 7 8 9 10 11 12 13 14 query_cache_size=0 query_cache_type=0 bind-address=0.0.0.0 #galera settings wsrep_provider=/usr/lib/galera/libgalera_smm.so wsrep_cluster_name="mon_cluster_dbr" #On définit ici les addresses des différentes BDD du cluster wsrep_cluster_address="gcomm://10.1.0.24,10.1.0.25,10.1.0.26" wsrep_sst_method=rsync 6.12 Test de la réplication Pour tester la réplication des serveurs de base de données, il suffit de se connecter sur la base de données d’un des serveurs et d efaire des modifications dessus, par exempler créer une table. On se déconnecte ensuuite de ce serveur et on se connecte sur un autre serveur de base de données. On affiche les tables de la base de données, et normalement si la réplication fonctionne correctement, on devrait voir la table qui a été créée précédemment sur l’autre serveur. Avcar Baltic Champain Projet SCAL Page 44/54 28 mars 2016 8 REMERCIEMENTS 7 Conclusion Pour conclure, ce projet nous aura appris comment optimiser un serveur web afin d’utiliser au mieux ses performances. On aura également vu ce qu’est un SLA et la manière dont on peut l’améliorer en faisant de la répartition de charges de serveurs web, et la haute disponibilité. On aura appris à travailler sur un serveur web dans un environnement critique de type ecommerce. Pour tester nos modifications sur le serveur web, nous avons utilisé des outils de tests de performance. De plus cela nous à aussi permit de travailler en groupe et ainsi de s’organiser afin d’optimiser notre notre travail. Ainsi, l’optimisation d’une plateforme de type LAMP doit se préparer à l’avance, afin d’acquérir un maximum d’information sur le fonctionnement actuel du serveur et ainsi pouvoir détecter les points faibles de celui-ci. En plus de cela, il existe plusieurs solutions lorsque l’on travaille dans un environnement critique pour assurer du bon fonctionnement de celuici, le backup et un environnement de test font parties des solutions. Lorsque l’on souhaite optimiser un serveur web, il faut garder à l’idée que tout est lié et qu’une modification sur une composante peut impacter sur une autre composante et la rendre défaillante. Il est donc nécéssaire quà chaque modification, il faille faire des tests afin de confirmer le bon fonctionnement du serveur. Enfin, la supervision du serveur est une chose très importante qui permet de voir le bon déroulement de celui-ci et de réagir vite en cas de problème. 8 Remerciements Nous tenons à remercier, dans un premier temps, notre tuteur de projet, Yohan Parent, pour son aide lors de nos difficultés et pour ses conseils qui nous ont permis d’aller de l’avant. Dans un second temps, nous remercions les propriétaires du site trackmusik.fr, qui nous ont permis d’avoir accès à leur serveur pour pouvoir appliquer les différentes optimisations. Enfin nous remercions aussi, tous les professeurs tout au long de l’année qui nous ont donnés les enseignements nécessaires pour nous permettre de bien comprendre le sujet. Avcar Baltic Champain Projet SCAL Page 45/54 28 mars 2016 9 ANNEXES 9 Annexes Test Charge Compression Expire Workers Avcar Baltic Champain Projet SCAL Page 46/54 28 mars 2016 9 ANNEXES Test Charge Compression Avcar Baltic Champain Projet SCAL Page 47/54 28 mars 2016 9 ANNEXES Test Charge Avcar Baltic Champain Projet SCAL Page 48/54 28 mars 2016 9 ANNEXES Expires.conf Avcar Baltic Champain Projet SCAL Page 49/54 28 mars 2016 9 ANNEXES Test Charge Compression Expires Avcar Baltic Champain Projet SCAL Page 50/54 28 mars 2016 9 ANNEXES Script mysqltuner.pl Avcar Baltic Champain Projet SCAL Page 51/54 28 mars 2016 9 ANNEXES Avcar Baltic Champain Projet SCAL Page 52/54 28 mars 2016 9 ANNEXES Fichier de configuration HAProxy Avcar Baltic Champain Projet SCAL Page 53/54 28 mars 2016 9 ANNEXES Avcar Baltic Champain Projet SCAL Page 54/54 28 mars 2016