<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Decrypt &#187; Load Balancing</title>
	<atom:link href="http://decrypt.ysance.com/category/architecture/load-balancing/feed/" rel="self" type="application/rss+xml" />
	<link>http://decrypt.ysance.com</link>
	<description>Le site de decryptage des technologies de l&#039;informatique</description>
	<lastBuildDate>Thu, 01 Jul 2010 14:41:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Les 9 principes de S3</title>
		<link>http://decrypt.ysance.com/2009/11/les-9-principes-de-s3/</link>
		<comments>http://decrypt.ysance.com/2009/11/les-9-principes-de-s3/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 17:32:16 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Haute Disponibilité]]></category>
		<category><![CDATA[Load Balancing]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[S3]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=652</guid>
		<description><![CDATA[Décidemment, encore un article sur les <a title="Site de Amazon Web Services" href="http://aws.amazon.com/">AWS</a> (Amazon Web Services). Au-delà du fait, que ce sont de bons composants dans le cadre de la mise en place d'une infrastructure, il faut noter qu'ils couvrent un scope complet de ce que l'on peut trouver dans une infrastructure en termes de fonctionnalités (gestionnaire de files de messages -<a title="Site de Amazon Web Services, Rubrique Amazon Simple Queue Service" href="http://aws.amazon.com/sqs/">SQS</a>-, base de données non relationnelle -<a title="Site de Amazon Web Services, Rubrique Amazon SimpleDB" href="http://aws.amazon.com/simpledb/">SimpleDB</a>- et relationnelle -<a title="Site de Amazon Web Services, Rubrique Amazon Relational Database Service" href="http://aws.amazon.com/rds/">RDS</a>- depuis peu, traitement massif de données -<a title="Site de Amazon Web Services, Rubrique Amazon Elastic MapReduce" href="http://aws.amazon.com/elasticmapreduce/">MapReduce</a>, bonjour BI ?-, instances virtuelles -<a title="Site de Amazon Web Services, Rubrique Amazon Elastic Compute Cloud" href="http://aws.amazon.com/ec2/">EC2</a>-, VPN -<a title="Site de Amazon Web Services, Rubrique Amazon Virtual Private Cloud" href="http://aws.amazon.com/vpc/">VPC</a>-, ...), mais également en termes de "background technique". Je m'explique : prenons l'exemple de <a title="Site de Amazon Web Services, Rubrique Amazon Simple Storage Service" href="http://aws.amazon.com/s3/">S3</a>, qui sera notre sujet d'étude dans cet article d'ailleurs, quoi de plus simple qu'un système de stockage d'objets ? Ca se résume à "PUT", "GET" et "DELETE". Et pourtant derrière cette apparente simplicité, se cache une complexité technique sous-jacente étonnante, qui reprend bons nombres de concepts "standards", mais que l'on implémente rarement soi-même, parceque complexes à mettre en place. On laisse donc cela aux outils que l'on utilise ou tout simplement on fait l'impasse dessus. Tout cela pour introduire les 9 principes sous-jacents au service S3 d'Amazon qui font de ce service apparemment succint, un bel exemple technique.

[...]]]></description>
			<content:encoded><![CDATA[<p>Décidemment, encore un article sur les <a title="Site de Amazon Web Services" href="http://aws.amazon.com/">AWS</a> (Amazon Web Services). Au-delà du fait que ce sont de bons composants dans le cadre de la mise en place d&#8217;une infrastructure, il faut noter qu&#8217;ils couvrent un scope complet de ce que l&#8217;on peut trouver dans une infrastructure en termes de fonctionnalités (gestionnaire de files de messages -<a title="Site de Amazon Web Services, Rubrique Amazon Simple Queue Service" href="http://aws.amazon.com/sqs/">SQS</a>-, base de données non relationnelle -<a title="Site de Amazon Web Services, Rubrique Amazon SimpleDB" href="http://aws.amazon.com/simpledb/">SimpleDB</a>- et relationnelle -<a title="Site de Amazon Web Services, Rubrique Amazon Relational Database Service" href="http://aws.amazon.com/rds/">RDS</a>- depuis peu, traitement massif de données -<a title="Site de Amazon Web Services, Rubrique Amazon Elastic MapReduce" href="http://aws.amazon.com/elasticmapreduce/">MapReduce</a>, bonjour BI ?-, instances virtuelles -<a title="Site de Amazon Web Services, Rubrique Amazon Elastic Compute Cloud" href="http://aws.amazon.com/ec2/">EC2</a>-, VPN -<a title="Site de Amazon Web Services, Rubrique Amazon Virtual Private Cloud" href="http://aws.amazon.com/vpc/">VPC</a>-, &#8230;), mais également en termes de &laquo;&nbsp;background technique&nbsp;&raquo;. Je m&#8217;explique : prenons l&#8217;exemple de <a title="Site de Amazon Web Services, Rubrique Amazon Simple Storage Service" href="http://aws.amazon.com/s3/">S3</a>, qui sera notre sujet d&#8217;étude dans cet article d&#8217;ailleurs, quoi de plus simple qu&#8217;un système de stockage d&#8217;objets ? Ca se résume à &laquo;&nbsp;PUT&nbsp;&raquo;, &laquo;&nbsp;GET&nbsp;&raquo; et &laquo;&nbsp;DELETE&nbsp;&raquo;. Et pourtant derrière cette apparente simplicité, se cache une complexité technique sous-jacente étonnante, qui reprend bons nombres de concepts &laquo;&nbsp;standards&nbsp;&raquo;, mais que l&#8217;on implémente rarement soi-même, parceque complexes à mettre en place. On laisse donc cela aux outils que l&#8217;on utilise ou tout simplement on fait l&#8217;impasse dessus. Tout cela pour introduire les 9 principes sous-jacents au service S3 d&#8217;Amazon qui font de ce service apparemment succint, un bel exemple technique.</p>
<p>Je vais me baser pour cela sur une présentation de Simone Brunozzi à laquelle j&#8217;ai assisté au Luxembourg. Cette présentation a également eu lieu à Londres à la &laquo;&nbsp;Storage Expo&nbsp;&raquo;. Cette dernière ayant été filmée, je vous la laisse à disposition afin que vous puissiez voir et écouter Simone en live from London ! ;ob</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="225" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=7330740&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="225" src="http://vimeo.com/moogaloop.swf?clip_id=7330740&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowfullscreen="true" allowscriptaccess="always"></embed></object></p>
<p><a href="http://vimeo.com/7330740">Simone Brunozzi presents AWS and Amazon S3 at Storage Expo in London</a> from <a href="http://vimeo.com/user1039336">Simone Brunozzi</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><img class="size-full wp-image-510" title="Logo AWS" src="http://decrypt.ysance.com/wp-content/uploads/2009/08/logo_aws.gif" alt="Logo AWS" width="164" height="60" /></p>
<p><strong><em>Chapitre I : Redundancy / Redondance</em></strong><br />
La redondance, un moyen efficace d&#8217;assurer la durabilité (pas de perte définitive) et l&#8217;accessibilité (pas de perte temporaire) des données. La redondance consiste donc à dupliquer les informations (objets) que vous stockez sur S3 dans plusieurs zones d&#8217;accessibilité d&#8217;une région donnée. Les zones d&#8217;accessibilité sont en fait des datacenter physiquement séparés dans la périphérie d&#8217;une agglomération donnée et reliés entre eux par un réseau privé. Un certain nombre de précautions sont prises lors de la mise en place de ces datacenters, depuis la vérification que les zones sont non sismiques et non inondables, jusqu&#8217;à l&#8217;alimentation électrique distincte pour chacun de ces datacenter. Les objets sont donc répliqués dans et entre ces datacenters en background (transparent pour l&#8217;utilisateur), ce qui permet d&#8217;assurer qu&#8217;ils seront accessibles, même sur la détérioration temporaire ou permanente desdits objets d&#8217;un datacenter donné (panne de courant sur une grille d&#8217;alimentation, &#8230;).</p>
<p>Cette redondance touche également au domaine de la scalabilité, puisque sur la détection d&#8217;une augmentation des accès sur un objet donné, celui-ci est dupliqué de manière plus importante de façon à répartir la charge sur un pool d&#8217;objets.</p>
<p>Il est à noter que la redondance a un coût et engendre une complexité et donc ne doit être mise en place que lorsque cela est nécessaire. Ce coût et cette complexité sont occultés, dans ce cas, par la simplicité d&#8217;utilisation du service S3 pour l&#8217;utilisateur final (vous et moi ! ;ob).</p>
<p><strong><em>Chapitre II : Retry / Réessai</em></strong><br />
Le réessai est une technique afin de fournir une accessibilité maximale de la donnée et notamment de parer aux inaccessibilités temporaires. Un rejeu de la requête, &laquo;&nbsp;GET&nbsp;&raquo; par exemple, est effectué, de manière à réessayer de rapatrier l&#8217;information. Si cela n&#8217;est pas possible, un nouvel essai est réeffectué, mais un peu plus tard et ainsi de suite, avec un intervalle de temps croissant entre chaque essai de manière à ne pas surcharger le système. La requête peut également être rejouée plus tard. Ce qu&#8217;il est important de noter, c&#8217;est que les requêtes pouvant être rejouées automatiquement par S3 doivent être idempotent, c&#8217;est à dire ne pas avoir d&#8217;influence si elles sont jouées plusieurs fois, voire dans des ordres différents. De manière générale, une requête idempotent ne modifie pas le système cible (donc plutôt des &laquo;&nbsp;GET&nbsp;&raquo;).</p>
<p>Le détail du fonctionnement n&#8217;est évidemment pas divulgué par Amazon et ce que nous voyons là sont les grands principes du fonctionnement du service S3. Cela est confidentiel car, tout d&#8217;abord c&#8217;est leur &laquo;&nbsp;business&nbsp;&raquo;, mais aussi pour des questions de sécurité, évidemment, et cela est encore plus vrai pour les &laquo;&nbsp;chapitres&nbsp;&raquo; à venir. Mais bon&#8230; Au-delà de la frustration de ne pas connaître un peu plus en détail l&#8217;implémentation de ces standards de la haute-disponibilité / scalabilité, cela fait toujours une bonne révision, intéressante, de ce qu&#8217;il y a à prendre en compte dans la mise à disposition d&#8217;un tel système de stockage. Allez&#8230; Fini ces digressions, continuons !</p>
<p>Le &laquo;&nbsp;niveau&nbsp;&raquo; de redondance, cité plus haut et permettant d&#8217;augmenter la taille du pool d&#8217;objets disponibles, rentre également dans cette optique de réessai. S3 permet ainsi d&#8217;éviter une inaccessibilité temporaire en augmentant le nombre d&#8217;objets disponibles afin de servir le maximum de requêtes concurrentes.</p>
<p><strong><em>Chapitre III : Surge Protection / Protection contre les (D)DOS</em></strong><br />
Et oui ! Un service exposé sur le net est donc potentiellement livré en pâture à de terribles botnet, une armée de zombies prêts à déferler sur votre pauvre service&#8230; Mais là aussi des parades sont possibles.</p>
<p>Il y a le &laquo;&nbsp;rate limiting&nbsp;&raquo;, où sur un &laquo;&nbsp;sur-accès&nbsp;&raquo; au service à partir d&#8217;IPs qui semblent être fautives, seule une partie des requêtes de ces machines seront traitées. De même que pour le réessai, il y a ce que l&#8217;on appelle &laquo;&nbsp;l&#8217;exponential back-off&nbsp;&raquo;, où les temps de réponse sont de plus en plus espacés afin de laisser le système respirer. Finalement, le &laquo;&nbsp;Cache TTL&nbsp;&raquo; (Time To Live) de chaque objet est augmenté avant son rafraichissement.</p>
<p>Un déni de service est bien sûr distingué d&#8217;une utilisation intensive de la ou des ressources, sachant que la cible n&#8217;est pas un pool d&#8217;objets défini mais bien le service dans son intégralité (saturation de la bande passante, &#8230;).</p>
<p>De même que précédemment, pour le détail des algorithmes&#8230; ;ob</p>
<p><strong><em>Chapitre IV : Eventual Consistency / Consistance éventuelle (des données)</em></strong><br />
La consistance éventuelle revient sur la problématique de la redondance (Chapitre I). En effet, le service S3 se doit d&#8217;assurer la sauvegarde des données par redondance, leur accessibilité à tout instant et&#8230; Leur consistance. C&#8217;est-à-dire que du fait de la redondance, il faut bien propager les modifications effectuées sur un objet donné à ces réplicats. Cela amène la question, &laquo;&nbsp;est-ce qu&#8217;un système peut à la fois être redondant (donc durable), disponible (donc accessible) et consistant (donc intègre &#8211; tous les réplicats d&#8217;un même objet sont identiques) à un instant donné ?&nbsp;&raquo;. La réponse est&#8230; presque. C&#8217;est pour cela que l&#8217;on parle de consistence éventuelle, la même notion que l&#8217;on retrouve dans les concepts de SimpleDB. Ces 3 éléments font obligatoirement l&#8217;objet d&#8217;un compromis et ne peuvent être assurés entièrement ensemble à un instant &laquo;&nbsp;t&nbsp;&raquo;. Par exemple, si on veux assurer la durabilité (donc redondance) et la consistance, il faut à un instant &laquo;&nbsp;t&nbsp;&raquo; rendre le service non accessible afin de propager les modifications&#8230; On peut retourner le problème dans tous les sens, on ne peut tout avoir à un instant &laquo;&nbsp;t&nbsp;&raquo;. Cela se traduit par le fait que sur un accès quasi simultané à un objet, un &laquo;&nbsp;PUT&nbsp;&raquo; suivi d&#8217;un &laquo;&nbsp;GET&nbsp;&raquo; par exemple, il se peut que l&#8217;on récupère l&#8217;ancienne version de l&#8217;objet sur le &laquo;&nbsp;GET&nbsp;&raquo;, parce que la propagation n&#8217;est pas (encore) effective. Ce fonctionnement est normal. Pensez à vos problématiques de réplications sur bases de données dans le cas où vous auriez des accès en continu très rapprochés !</p>
<p>C&#8217;est la notion de consistance éventuelle.</p>
<p>Vous pourrez retrouver un article <a title="Eventually Consistent - Revisited" href="http://www.allthingsdistributed.com/2008/12/eventually_consistent.html">Eventually Consistent &#8211; Revisited</a> sur le sujet sur <a title="All Things Distributed, Werner Vogels' weblog on building scalable and robust distributed systems" href="http://www.allthingsdistributed.com/">All Things Distributed</a>, Werner Vogels&#8217; weblog on building scalable and robust distributed systems.</p>
<blockquote><p>Eventually Consistent &#8211; Building reliable distributed systems at a worldwide scale demands trade-offs between consistency and availability.</p></blockquote>
<p><strong><em>Chapitre V : Routine Failure / Processus en cas de panne</em></strong><br />
Comme disait justement Simone lors de la présentation : &laquo;&nbsp;Viagra ? Cialis ? It will fail anyway !&nbsp;&raquo;. C&#8217;est la routine ! Enfin bon&#8230; Je parle pour la défaillance des composants hardware tout du moins ! :ob Disques, serveurs, datacenters, &#8230; Tout composants harware doit arriver un jour ou l&#8217;autre à terme (et oui !), alors&#8230; &laquo;&nbsp;just unplug it !&nbsp;&raquo;. Puisque tout est redondé et en haute disponibilité, pas de problème.</p>
<p>Pour plus d&#8217;informations sur la fin de vie du matériel chez Amazon et plus généralement sur la sécurité des services et la sécurité / confidentialité des données, vous pouvez consulter leur Livre Blanc sur le sujet sur leur site dans la rubrique <a title="Site de Amazon Web Services, Rubrique Sécurité" href="http://aws.amazon.com/security/">Sécurité</a> et le <a title="Site de Amazon Web Services, Rubrique Sécurité, Livre Blanc" href="http://awsmedia.s3.amazonaws.com/pdf/AWS_Security_Whitepaper.pdf">télécharger</a> (format PDF).</p>
<p><strong><em>Chapitre VI : Diversity / Diversité</em></strong><br />
&laquo;&nbsp;Diversifier pour mieux règner&nbsp;&raquo; pourrait-on dire. Et ce à 3 niveaux : Software, Hardware, Workload.</p>
<p>Pour éviter une panne généralisée du fait d&#8217;un composant matériel d&#8217;un fournisseur, un panel de composants physiques a été sélectionné à chaque niveau de l&#8217;infrastructure afin de s&#8217;assurer que si un des éléments est défaillant (mauvaise série, &#8230;), l&#8217;ensemble des composants entrant dans le cadre de la haute disponibilité ne tombent pas en panne en même temps.</p>
<p>Le principe est le même pour le software, pour le type et la version de l&#8217;OS des Hosts (les OS supportant les machines virtuelles) par exemple, pour les mêmes raisons (bugs, exploits, &#8230;).</p>
<p>Finalement la charge est elle aussi &laquo;&nbsp;diverse&nbsp;&raquo; en fonction des applications et des clients qui utilisent les services, permettant ainsi de lisser la charge et de ne pas saturer les services à certaines périodes.</p>
<p><strong><em>Chapitre VII : Integrity Checking / Vérification de l&#8217;intégrité (des données)</em></strong><br />
La corruption est partout ! En découle donc la vérification de l&#8217;intégrité&#8230; Et oui ! Encore une autre tâche nécessaire pour assurer un stockage de données de qualité. Mais il faut faire attention au coût et à la complexité engendrés par ces traitements. Le mode opératoire utilisé sur S3 est un checksum au niveau applicatif. Si une corruption de l&#8217;objet est détectée sur un checksum, il est alors remplacé par une version &laquo;&nbsp;correcte&nbsp;&raquo; à partir d&#8217;un de ces duplicats. De la même manière que précédemment, cette fonctionnalité est assurée en background et ne laisse rien transparaître à l&#8217;utilisateur.</p>
<p><strong><em>Chapitre VIII : Telemetry / Monitoring</em></strong><br />
Tout est dans le titre. Un monitoring est effectué sur le système afin de diagnostiquer son &laquo;&nbsp;état de santé&nbsp;&raquo;.</p>
<p><strong><em>Chapitre IX : Autopilot / Automatisation</em></strong><br />
Par ce que les processus humains sont faillibles et que le temps de réponse humain est lent, il est préférable d&#8217;automatiser (tiens ça me rapelle des choses ça Cf. <a title="Puppet et Capistrano : la clé de l’automatisation" href="http://decrypt.ysance.com/2009/07/automatisation-puppet-capistrano/">Puppet et Capistrano : la clé de l’automatisation</a>). Cela paraît évident dès que l&#8217;on a eu à monter et surtout à maintenir une infrastructure ! Alors au niveau d&#8217;un datacenter&#8230;</p>
<p><strong><em>Conclusion</em></strong><br />
Comme je vous l&#8217;ai dit dans l&#8217;article, ceux qui pensaient découvrir tous les secrets d&#8217;Amazon seront déçus. Pour des raisons évidentes de confidentialité et de sécurité, le détail et l&#8217;implémentation de chacun de ces principes n&#8217;est pas présenté. Je suis effectivement un peu frustré de ne pas en savoir plus, ne serait-ce que pour vérifier l&#8217;implémentation de tous les principes énoncés. Les constatations à notre niveau ne peuvent être qu&#8217;empiriques et, dans ce cadre, je suis entièrement satisfait du service, surtout quand on fait la relation entre le coût du service et sa qualité/fiabilité. Tous les mécanismes énoncés ne peuvent être mis en place qu&#8217;à une grande échelle, comme dans les datacenters d&#8217;Amazon, vu le coût en ingénieurie et matériel que cela engendre afin d&#8217;implémenter ces mécanismes (autant au niveau algorithmes/software qu&#8217;au niveau hardware).</p>
<p>De plus, les mêmes principes ont été apportés aux autres services (ou tout du moins des principes similaires fonction du service). Les Web Services Amazon sont fondés sur le même modèle et les mêmes règles de base. Cela nous laisse donc entrevoir une qualité de service, au niveau des différentes fonctionnalités que couvre le large scope Amazon, que nous ne pourrions nous offrir en interne ou chez certains de nos hébergeurs physiques.</p>
<p>Sorti de S3 (ou d&#8217;autres services Amazon), je trouve ces notions également intéressantes à prendre en compte dans nos infrastructures, à un moindre niveau bien sûr, car ces principes sont plein de bon sens et il est intéressant de se poser au moins les questions.</p>
<p>Vous pouvez également recevoir toutes les nouveautés sur AWS et autres sujets techniques (scalabilité, haute dispo, &#8230;) sur <a title="Twitter Frédéric FAURE" href="http://twitter.com/fredericfaure">Twitter @fredericfaure</a>.</p>
<p><strong><em>Frédéric FAURE</em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2009/11/les-9-principes-de-s3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Load Balancing – Haute Dispo – Clustering. Un triptyque parfois confus…</title>
		<link>http://decrypt.ysance.com/2009/04/load-balancing-haute-dispo-clustering/</link>
		<comments>http://decrypt.ysance.com/2009/04/load-balancing-haute-dispo-clustering/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 16:49:46 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Haute Disponibilité]]></category>
		<category><![CDATA[Load Balancing]]></category>

		<guid isPermaLink="false">http://godard.ysance.com/~decrypt/?p=97</guid>
		<description><![CDATA[Il m’arrive souvent chez les clients de rencontrer la même confusion autour de ce triptyque, ce qui peut mener à de sérieux problèmes, surtout quand le client se base sur l’idée que « dans le doute on prend toutes les options, c’est forcément mieux ! ». C’est faux !
Une explication de chacune de ces notions s’impose.

[...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
<div class="mceTemp"> </div>
<div class="mceTemp">Il m’arrive souvent chez les clients de rencontrer la même confusion autour de ce triptyque, ce qui peut mener à de sérieux problèmes, surtout quand le client se base sur l’idée que « dans le doute on prend toutes les options, c’est forcément mieux ! ». C’est faux !</div>
<p>Une explication de chacune de ces notions s’impose.</p>
<p><strong><em>Découpage et positionnement des fonctionnalités</em></strong></p>
<div><strong><em> </em></strong></div>
<div><strong><em> </em></strong></div>
<div><strong><em> </em></strong></div>
<div><strong><em> </em></strong></div>
<div id="attachment_118" class="wp-caption alignnone" style="width: 444px"><strong><em><img class="size-full wp-image-118" title="Architecture applicative standard" src="http://decrypt.ysance.com/wp-content/uploads/2009/04/architecture_app_std.png" alt="Architecture applicative standard" width="434" height="538" /></em></strong><p class="wp-caption-text">Architecture applicative standard</p></div>
<p><strong><br />
</strong></p>
<p><strong><em>Load Balancing ou répartition de charge<br />
</em></strong>Cette tâche est acquittée par le load balancer ou répartiteur de charge. Il s’agit du point d’entrée de l’architecture applicative (on peut trouver avant firewall, reverseproxy, …) et il permet de répartir les requêtes sur différentes « branches » identiques entre elles, donc la charge, entre les services répliqués. On peut définir l’algorithme de la répartition (roundrobin, stickysession, …), la pondération sur chaque backend (serveur récupérant les requêtes distribuées par le balancer), la politique de vérification de l’état des backends (nombre de requêtes en erreur, intervalle de vérification, …), … De nombreuses options sont disponibles de manière générale et en fonction des balancers en particulier.</p>
<p>Il est à noter que le balancer peut être hard ou soft. Je constate souvent que les clients préfèrent acheter un balancer hard, probablement pensant que c’est un gage de fiabilité et de performances. Effectivement le balancer hard dispose d’une infrastructure matérielle conçue spécialement pour cette tâche et permet donc des performances un peu meilleure. Il dispose également d’un paramétrage plus poussé (donc plus de possibilités, mais plus complexe à prendre en main). Cependant, dans quasiment tous les cas que j’ai rencontré, un balancer soft aurait amplement suffit, autant en termes de performances que d’options… Le balancer est un dispatcher (intelligent tout de même) et ne consomme donc pas (ou peu) de CPU, de mémoire, … Il n’est donc pas gourmand et fait juste la tâche pour laquelle il a été conçu. Le balancer soft que j’utilise en général est HAProxy, et pour l’instant je n’ai pas à m’en plaindre. Facile à configurer, il supporte une montée en charge importante comme un grand (cf. « Conception d’une infrastructure sur AWS : best practices ! ») ! Bien sûr, d’autres balancer soft (et gratuits bien entendu ^^) existent et chacun trouvera son bonheur, n’hésitez pas à installer et comparer.</p>
<p>Il est intéressant de mettre en place du balancing à partir du moment où la population cible d’utilisateurs n’est pas figée ou bien qu’elle ne peut être supportée par un seul serveur.</p>
<p>Il faut en revanche bien penser qu’à partir du moment ou l’architecture aura plusieurs branches identiques de services, le déploiement devra être effectué de manière iso et de préférence (si vous ne le faites pas c’est à vos risques et périls) automatisée sur les X backends.</p>
<p>Il faut également penser à minima en termes distribué et intégrer la notion du partage des sources de données, chaque branche de l’architecture devant avoir accès à une ou des sources de données centralisées et partagées : partage de fichiers, cache réseau, …</p>
<p>Cela a un coût supplémentaire en termes de machines, de mise en place d’un déploiement automatisé et de réflexion distribuée, mais le bénéfice est toujours là et la configuration relativement simple.</p>
<p><strong><em>Haute Dispo</em></strong><br />
La haute disponibilité s’appuie tout d’abord sur le load balancing. C’est le second niveau que l’on peut apporter à l’architecture. La haute dispo, pour être efficace, doit être mise en place à tous les niveaux de l’architecture, 2 formules étant disponibles : </p>
<p style="padding-left: 30px;">• Soit plusieurs services qui fonctionnent en parallèle et répondent aux différentes requêtes dispatchées, si l’un d’entre eux tombe, les autres sont à même de supporter la charge supplémentaire induite et de répondre convenablement. C’est ce que l’on trouve au niveau des serveurs HTTP ou applicatifs.</p>
<p style="padding-left: 30px;">• Soit une machine attend en backup, et si elle (ou un système externe) détecte (Heartbeat, …) la perte de la machine principale, elle prend le relai (IP failover, …). C’est ce que l’on trouve au niveau du balancer ou de la base.</p>
<p>Au niveau de la base, le fonctionnement est un peu plus complexe, car contrairement au balancer qui n’héberge pas de données applicatives, la base doit assurer la mise à disposition des données à la « date du crash – n » avec « n » le plus petit possible. Les données sont donc répliquées sur le backup en quasi temps réel. Il est aussi possible d’utiliser la base de backup (ou slave) en lecture afin de diminuer la charge sur la base principale (master). La base est donc un sujet plus complexe.</p>
<p>Concernant les services fonctionnant en parallèle, il est important qu’à chaque niveau, la requête puisse être redirigée sur un autre service équivalent en cas de défaillance. Le balancer n’ayant pas la même visibilité que le serveur HTTP sur la disponibilité du serveur applicatif, le serveur HTTP doit donc faire du dispatching passif. Dans le cas où il n’y a pas de serveur applicatif, parce que le site est en PHP par exemple, la mise en place est d’autant plus simple : pas besoin de dispatching à ce niveau et de questions métaphysiques… Mais ce cas est bien moins amusant ! ^^</p>
<p>Dans le cas d’une architecture avec serveurs applicatifs, il convient de répondre à un certain nombre de questions/remarques que l’on m’a posées plus d’une fois, en particulier sur le dispatching au niveau du serveur HTTP et son utilité :</p>
<p style="padding-left: 30px;"><strong><em>« Le serveur web est-il capable de détecter une défaillance du serveur applicatif ? »<br />
</em></strong>Oui. Si le serveur http dispose d’un module de dispatching, comme Apache par exemple, il est plus que probable qu’il soit capable de détecter la défaillance de son backend (le serveur applicatif) et de rediriger les requêtes sur les autres (fonction du paramétrage retenu sur le nombre d’essais et le délai avant déclaration du backend HS). J’ai surtout travaillé avec Apache, mais pense que c’est la base de tout fonctionnement de serveur web… Peut-être y a-t-il un exemple pour me faire mentir ? Il est à noter tout de même que Apache peut détecter le statut du serveur applicatif, mais pas de la ou des applications ! Si l’application provoque des erreurs internes sur le serveur applicatif ou ne renvoie pas les réponses escomptées, cela rentre dans le cadre d’un monitoring de l’application (fonctionnel et technique) via une interface et des outils spécifiques.</p>
<p style="padding-left: 30px;"><strong><em>« Alors pourquoi ne pas mettre un Apache (en l’occurrence) en balancer ? »<br />
</em></strong>Parce que ce n’est pas son rôle premier et il n’a pas toutes les fonctionnalités d’un HAProxy, par exemple, et surtout parce qu’il effectue un certain nombre de traitements liés à sa fonctionnalité de serveur web qui n’ont rien à faire sur un répartiteur de charge dont le fonctionnement doit être minimaliste afin d’encaisser toute la montée en charge en un point.</p>
<p style="padding-left: 30px;"><strong><em>« Mais en activant le dispatching Apache, il est difficile de suivre les log d’une transaction pour un utilisateur donné au niveau du serveur applicatif »<br />
</em></strong>C’est là qu’intervient le « sticky session ». Si le site se limite à des serveurs web, pour un site PHP par exemple, le « sticky session » doit être positionné au niveau du HAProxy. Dans le cas d’un site utilisant des serveurs applicatifs, le « sticky session » doit être positionné au niveau des serveurs Web. En effet, le « sticky session » doit être positionné un cran avant la brique gérant la session. Le « sticky session » est tout simplement un flag positionné dans un cookie (de session par exemple) et qui permet pour un utilisateur donné de savoir sur quel serveur il a été redirigé lors de ses requêtes précédentes et donc de pouvoir le rediriger à nouveau dessus afin qu’il récupère sa session. Si « son » serveur est HS, il est alors redirigé vers un autre et sa session recréée, à vide (c’est là qu’intervient le clustering, mais on verra ça plus tard ^^).</p>
<p style="padding-left: 30px;"><strong><em>« Faire de la répartition de charge au niveau du serveur Apache n’annule-t-elle pas celle du balancer ? »<br />
</em></strong>De manière générale : Non. En général, car il faut prendre en compte les différents algorithmes de répartition, mais vu qu’en général c’est du roundrobin… Y’a pas de souci. Je parle au niveau de Apache de dispatching passif. Si on effectue une répartition par requête sans pondération au niveau de Apache, cela n’annule en rien la répartition de charge du balancer (même si il y avait de la pondération au niveau du balancer). Tout simplement la charge est répartie au niveau des Apache, qui eux même dispatchent les requêtes qu’ils reçoivent équitablement au niveau des serveurs applicatifs.</p>
<p style="padding-left: 30px;"><strong><em>« Et si on veut quand même conserver un lien « un pour un » entre Apache et le serveur applicatif ? »<br />
</em></strong>Et bien optez au niveau du Apache pour du « hot standby ». En fait, tant que le ou les serveurs du pool défini répondent, les requêtes sont redirigé vers lui ou eux, et si plus aucun ne répond, dans notre cas si le serveur ne répond plus, alors on passe sur le serveur de backup (« hot standby ») qui peut être l’un des autres serveurs applicatifs. Dès que le serveur principal ou un des serveurs principaux revient, il récupère de suite le trafic.</p>
<p>La haute disponibilité s’appuie donc sur le load balancing et est déjà un peu plus complexe à mettre en place. Il faut bien penser à redonder chaque élément de l’architecture avec des services en parallèle ou des backup. Si vous voulez vraiment de la haute disponibilité, pensez également à brancher les serveurs sur des alimentations électriques séparées (ne riez pas, c’est du vécu…) et à prendre en compte votre réseau électrique de manière générale. Il y a plusieurs niveaux de haute disponibilité et c’est à chacun de définir son compromis.</p>
<p>De même que pour le balancing, la haute disponibilité ne fera pas de mal à l’architecture. C’est « juste » plus coûteux en termes de réflexion, de configuration et de ressources.</p>
<p><strong><em>Clustering</em></strong><br />
Le clustering est le dernier niveau de la haute disponibilité. C’est à ce niveau qu’il faut surtout réfléchir à la notion de compromis ! En effet, le clustering est coûteux à différents niveaux et risqué si mal maîtrisé.</p>
<p>Il faut aussi faire attention au terme cluster qui regroupe des notions variées et est employé de manière générale pour un regroupement de machines, quelques soient leurs inter dépendances. Dans notre cas, nous parlerons de clustering pour la réplication de sessions au niveau des serveurs applicatifs.</p>
<p>Tout d’abord le clustering se met en place afin de pouvoir répliquer les informations de sessions, donc volatiles, afin que n’importe quel serveur puisse reconstruire la session de l’utilisateur. Il est utilisé pour des sites ne pouvant tolérer de rupture de service dans les « occasions » suivantes :</p>
<p style="padding-left: 30px;">• si une des machines utilisant les sessions crashe, afin de reconstruire la dite session sur une autre machine,</p>
<p style="padding-left: 30px;">• afin de pouvoir effectuer des maintenances ou des mises à jour de version de l’application sans rupture de service.</p>
<p>J’ai vu pas mal de clients très embêtés par leur clustering parce que leur application était lente, parce que ça consommait des ressources effrayantes, … parce que leurs serveurs applicatifs ne démarraient même plus à cause de la surcharge de trafic généré (ne riez toujours pas, c’est du vécu…) !!!</p>
<p>En effet, le clustering est basé sur la réplication des informations de sessions entre les différents serveurs applicatifs et s’effectue en multicast, c&#8217;est-à-dire qu’à chaque modification des informations de la session d’un utilisateur, le serveur applicatif l’annonce sur le réseau à destination des autres serveurs écoutant sur l’adresse de multicast. Le paramétrage des nœuds du cluster, du ttl (time to live) des trames, l’étanchéité des sous-réseau, … doivent être impeccables, sous peine d’avoir de terribles latences. De plus, il faut garder un œil vigilent sur les développements applicatifs afin de limiter de façon drastique les informations qui auront leur place en session.</p>
<p>Il ne faut pas partir en se disant « on réplique les sessions, de toute façon ça ne fera pas de mal… Qui peut le plus, peut le moins…» ! Si c’est mal configuré, et c’est souvent le cas, le résultat est médiocre et au final après moult temps et argent gâchés, la fonctionnalité est retirée. Il faut l’utiliser à bon escient, et si le besoin est réel, la mettre en place rigoureusement après s’être correctement documenté…</p>
<p>De plus, la fonctionnalité peut bien souvent être contournée, par exemple pour un site marchand, j’ai déjà entendu : « si notre client perd son caddie, c’est critique ! ». Le besoin est tout d’abord à relativiser car le cas où un serveur applicatif est HS est (et doit être) un évènement rare (sauf courte période de maintenance la nuit par exemple). De plus, pourquoi ne pas stocker ses informations en base de données ou dans une source de données centralisée (cache réseau, …) afin de pouvoir gérer ce genre de données et y accéder ailleurs si besoin.</p>
<p>Concernant les mises à niveau logicielles, il est préférable, à mon avis, d’accepter une rupture de service de quelques minutes via une méthodologie et un scripting rigoureux et d’avoir un site efficace le reste du temps, qu’un site qui fonctionne en permanence mais avec un temps de réponse moyen, voire pire…</p>
<p><strong><em>Conclusion</em></strong><br />
Je n’ai fait que brosser le sujet qui demande réflexion quand on rentre dans les détails. Il y a beaucoup de notions à connaître que l’on acquiert avec l’expérience. Mais les grandes lignes sont là.</p>
<p>Comme dans tout projet, il faut d’abord définir ses besoins et à partir de là, envisager les solutions à mettre en place et en accepter les compromis. Ce n’est pas parce que vous ne mettrez pas de répartition de charge, de haute dispo ou de clustering que votre architecture et au final votre application ne fonctionneront pas ou encore pire… seront « has been » (oui ça c’est terrible, c’est mal les vieux concepts… Pourtant ça marche souvent très bien et c’est même efficace parfois…) ! Vous avez juste un serveur HTTP et un serveur applicatif parce que votre charge est modérée et avez prévu un PRA (Plan de Reprise d’Activité) rigoureux et efficace via scripting ! Bingo ! Vous aurez un downtime de 5-10 minutes en cas de problème, mais à côté de ça votre application répond bien pour un coût d’infra minimaliste.</p>
<p>Il faut juste adapter les possibilités architecturelles à vos besoins et ne pas créer de dépenses inutiles. La compréhension de chaque option à disposition est la clé de vos choix.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><em><strong>Frédéric FAURE</strong></em></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> </p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2009/04/load-balancing-haute-dispo-clustering/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
