<?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; Infrastructure</title>
	<atom:link href="http://decrypt.ysance.com/category/infrastructure/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>Fri, 03 Feb 2012 08:25:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Le Web accélère avec Varnish !!!</title>
		<link>http://decrypt.ysance.com/2012/02/le-web-accelere-avec-varnish/</link>
		<comments>http://decrypt.ysance.com/2012/02/le-web-accelere-avec-varnish/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 19:42:44 +0000</pubDate>
		<dc:creator>Laurent Roux</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Haute Disponibilité]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Load Balancing]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[IaaS]]></category>
		<category><![CDATA[NCSA]]></category>
		<category><![CDATA[S3]]></category>
		<category><![CDATA[Syslog-NG]]></category>
		<category><![CDATA[Varnish]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=2756</guid>
		<description><![CDATA[<img class="size-full wp-image-2795 alignright" title="Varnish Cache" src="http://decrypt.ysance.com/wp-content/uploads/2012/01/varnish_cache.jpg" alt="Varnish Cache" width="192" height="192" /><a title="Site de Varnish Cache" href="http://www.varnish-cache.org/" target="_blank">Varnish</a> est un outil fabuleux à bien des égards. C’est une boite à outils qui permet de simplifier, harmoniser, sécuriser et accélérer les architectures web. Nous allons aborder dans cet article certaines fonctionnalités de Varnish pour commencer à en tirer le maximum. Il se positionne comme un reverse proxy cache. En gros nous allons le placer en amont des serveurs Web pour intercepter les requêtes, mettre en cache ce qui est généré par les backends et resservir le contenu généré depuis son cache. Mais son fonctionnement peut aller plus loin.

<em><strong>Le fonctionnement</strong></em>
Varnish se configure simplement grâce à deux types de fichiers. Le fichier de configuration de Varnish où nous allons définir certains paramètres internes et les fichiers VCL qui permettent de configurer le comportement de Varnish via une sorte de langage de programmation.

[...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-2795 alignright" title="Varnish Cache" src="http://decrypt.ysance.com/wp-content/uploads/2012/01/varnish_cache.jpg" alt="Varnish Cache" width="192" height="192" /><a title="Site de Varnish Cache" href="http://www.varnish-cache.org/" target="_blank">Varnish</a> est un outil fabuleux à bien des égards. C’est une boite à outils qui permet de simplifier, harmoniser, sécuriser et accélérer les architectures web. Nous allons aborder dans cet article certaines fonctionnalités de Varnish pour commencer à en tirer le maximum. Il se positionne comme un reverse proxy cache. En gros nous allons le placer en amont des serveurs Web pour intercepter les requêtes, mettre en cache ce qui est généré par les backends et resservir le contenu généré depuis son cache. Mais son fonctionnement peut aller plus loin.</p>
<p>&nbsp;</p>
<h3>Le fonctionnement</h3>
<p>Varnish se configure simplement grâce à deux types de fichiers. Le fichier de configuration de Varnish où nous allons définir certains paramètres internes et les fichiers VCL qui permettent de configurer le comportement de Varnish via une sorte de langage de programmation.</p>
<p><a title="Le principe de Varnish" href="https://www.varnish-cache.org/trac/wiki/VCLExampleDefault" target="_blank">Le principe de Varnish</a> s’appuie sur la machine à état suivante :</p>
<p style="text-align: center;"><img class="aligncenter size-large wp-image-2761" title="VCL" src="http://decrypt.ysance.com/wp-content/uploads/2012/01/vcl-649x1024.png" alt="VCL" width="649" height="1024" /></p>
<p>&nbsp;</p>
<p>Varnish permet d’intervenir au niveau de chacun des états pour effectuer des opérations sur HTTP ou sur lui-même. C’est cette finesse d’intervention qui permet à Varnish d’être véloce et complet.</p>
<p>Un client effectue une requête sur une ressource qui n’est pas en cache suivra le cheminement suivant :<br />
<img class="size-full wp-image-2804" title="Varnish cache miss" src="http://decrypt.ysance.com/wp-content/uploads/2012/01/cache_miss.png" alt="Varnish cache miss" width="532" height="109" /><br />
Si cette ressource est demandée à nouveau, le chemin suivi change car la ressource est maintenant en cache :<br />
<img class="size-full wp-image-2806" title="Varnish cache hit" src="http://decrypt.ysance.com/wp-content/uploads/2012/01/cache_hit.png" alt="Varnish cache hit" width="404" height="116" /></p>
<p>Toutes ces étapes sont symbolisées en VCL par des “procédures standards” (vcl_recv, vcl_fetch, vcl_deliver&#8230; etc). Toutes ces procédures sont surchargables et nous pouvons aussi déclarer les nôtres qui seront appelées dans les procédures standards. Le langage VCL ne tolère aucun code orphelin, tout ce qui est déclaré doit être utilisé.</p>
<p>&nbsp;</p>
<h3>Le Cache</h3>
<p>Varnish propose un cache en mémoire et un cache sur disque. Mais il faut faire un choix, les deux ne sont pas cumulables. Le cache accepte à peu près tout ce qui passe dans les mains de Varnish (pages HTML, fichiers statics, flux de données en JSON&#8230; etc), à partir du moment où l’on déclare l’objet cachable et qu’il a une TTL.<br />
Le cache est alimenté juste après l’étape “Fetch”, en réalité c’est juste après la récupération de la donnée sur le backend. C’est à cet endroit que l’on va faire toutes les modifications de l’entête HTTP de la ressource cachée. Faire ces modifications au niveau du “Fetch” va permettre de garantir une entrée cache propre (ne pas avoir plusieurs entrées cache car une même ressource va avoir un payload différent). De plus l’objet est stocké dans le cache avec son entête HTTP, il est donc plus efficace de traiter une fois pour toute l’entête et la resservir avec l’objet.<br />
Comme nous le verrons plus loin, la compression d’objet influe aussi sur les performances du cache. Il est préférable de stocker un objet compressé et laisser Varnish le délivrer compressé ou non suivant l’entête “Accept-Encoding”.</p>
<p>La définition correct de la TTL d’un objet pour manager le cache-control est un élément important de Varnish. Nous pouvons contrôler le cache de façon précise en définissant la TTL pour un type de ressource ou pour une url par exemple :</p>
<blockquote>
<pre>if(beresp.ttl &gt; 0s){
  unset beresp.http.Expires;
  if ( req.backend == backend_S3 ) {
     set beresp.http.Cache-Control = "public, max-age=60";
     set beresp.ttl = 60s;
  } else {
     set beresp.http.Cache-Control = "public, max-age=7200";
     set beresp.ttl = 2h;
  }
}</pre>
</blockquote>
<p>Ici nous demandons à Varnish de cacher sur 60 secondes tout ce qui vient de le backend “backend_S3” et le reste sera caché deux heures.</p>
<p>Le cache peut se manager de deux façons différentes :</p>
<li>Via des appels HTTP par la méthode PURGE et en gérant des ACLs pour sécuriser l’appel.</li>
<li>Via les “Bans” que l’on peut inclure dans le VCL ou effectuer via varnishadm.</li>
<p>&nbsp;</p>
<h3>La Compression</h3>
<p>Depuis la version 3.0, Varnish a la possibilité de compresser et décompresser des ressources. Cette fonctionnalité est importante pour 3 raisons :</p>
<li>Économiser de la bande passante entre le backend et Varnish.</li>
<li>Économiser de la place dans le cache de Varnish surtout quand il est en mémoire.</li>
<li>Économiser de la bande passante entre Varnish et le Client.</li>
<p>Elle peut être activée simplement en harmonisant l’entête “Accept-Encoding” et en positionnant la variable “do_gzip” au niveau du backend ou de la réponse du backend. Pour le reste Varnish va adapter la réponse (objet compressé ou non) au client en s’appuyant sur le “Accept encoding” de la requête.<br />
Il est bien sûr évident que la stratégie de compression doit être adaptée au type d’objet. On ne compressera pas un objet déjà compressé (gif, jpg&#8230;etc) :).</p>
<p>&nbsp;</p>
<h3>Le Loadbalancing</h3>
<p>Varnish peut gérer des backends de tous horizons. Avec des sites de plus en plus chargés, il est capable d’offrir la possibilité de faire du loadbalancing. Varnish dispose de 3 types de loadbalancing qui sont appelés “Director” :</p>
<li>RoundRobin.</li>
<li>Client (permet de faire du sticky session sur n’importe quel élément du header).</li>
<li>Random (disponible&#8230; utile c’est une autre histoire).</li>
<p>Varnish sait gérer l’éviction d’un backend lorsqu’il est indisponible. Cette fonctionnalité est d’autant plus utile quand nous activons le “probe” sur les backends.</p>
<blockquote>
<pre>backend server1 {
   .host = "server1.example.com";
   .probe = {
     .url = "/";
     .interval = 5s;
     .timeout = 1s;
     .window = 5;
     .threshold = 3;
   }
}</pre>
</blockquote>
<p>Varnish dispose aussi d’un mécanisme pour palier complètement à la défaillance d’un backend ou d’un Director. Nous appelons cela “Grace mode” ou “Saint mode”. Ces termes cachent la possibilité de servir un contenu caché même x minutes après la TTL en cas de non réponse d&#8217;un serveur. Il est aussi capable d’aiguiller une requête vers un autre serveur répondant correctement quand le serveur cible initial donne des réponses HTTP 500 à cause d’une trop grande charge par exemple.</p>
<p>&nbsp;</p>
<h3>Reverse Proxy</h3>
<p>Nous avons vu que Varnish se place devant toute notre infrastructure. Il va permettre de masquer complètement l’architecture déployée en utilisant toute la puissance de Reverse Proxy qu’il met à notre disposition.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-2765" title="Reverse Proxy" src="http://decrypt.ysance.com/wp-content/uploads/2012/01/Varnish1.png" alt="Reverse Proxy" width="382" height="370" /></p>
<p>En fait, il nous permet de faire un découplage complet entre l’organisation des URIs d’appels et l’organisation de leurs traitements sur l’infrastructure.</p>
<p>Voici un exemple d’une requête cliente que nous arrivons à aiguiller avec Varnish vers un bucket S3 public du nom de “ressources” et l’aiguillage prend en compte ce qu’il y a dans le nom du host de la requete :</p>
<blockquote>
<pre>set req.backend = backend_s3;
if(req.url == "/ressources1.xml") {
  set req.url = regsuball(req.http.host,
              "^(?:.*[.])?([a-z]+)[.](?:net|com)$", "/ressource1.\1.xml");
}else if(req.url == "/ressource2.txt") {
  set req.url = regsuball(req.http.host,
              "^(?:([a-z]+)[0-9]*[.])(?:([a-z]+)*[.])[a-z]+$","/ressources.\1.\2.txt");
}
set req.http.host = "resources.s3.amazonaws.com";

backend  backend_s3 {
  .host = "ressources.s3.amazonaws.com";
  .port = "80";
  .connect_timeout = 5s;
  .first_byte_timeout = 3s;
  .between_bytes_timeout = 2s;
  .max_connections = 1000;
}</pre>
</blockquote>
<p>&nbsp;</p>
<h3>Sécuriser et nettoyage HTTP</h3>
<p>Le protocole HTTP permet d’utiliser plusieurs types de méthodes (GET, POST, DELETE&#8230; etc). Ces méthodes peuvent être utilisées de différentes manières pour déclencher des actions spécifiques (cas de services REST) sur les services abrités sur les backends. Or la protection au niveau HTTP de ce genre de services est assez fastidieuse côté serveurs d’applications. Varnish va permettre de filtrer précisément ce qui doit passer et pour quelle utilisation. Nous allons donc limiter les effets de bords.<br />
Imaginons que nous avons un service accessible uniquement en GET /service1/ et un deuxième /service2/ accessible lui en GET et POST nous allons écrire quelque chose comme ceci :</p>
<blockquote>
<pre>if (req.request != "GET" &amp;&amp; req.request != "POST"){
  call error;
}

if (req.url ~ "^/service2"){
call service2;
}

if(req.request == "POST"){
  call error;
}

if (req.url ~ "^/service1"){
  call service1;
}

call error;</pre>
</blockquote>
<p>Dans cet exemple nous interdisons systématiquement tout ce qui n’est pas méthode GET ou POST. Ensuite pour une url qui commence par /service2 nous allons vers la routine qui va traiter le payload pour ce service. Puis nous bannissons la méthode POST et nous traitons les urls avec /service1 et enfin nous bannissons le reste.</p>
<p>Avec cette méthode aucune requête non prévue peut remonter vers un backend. Nous avons deux avantages :</p>
<li>Le code pour traiter les cas aux limites sera plus simple.</li>
<li>Une majorité d’erreurs ne remonteront pas vers le backend, celles-ci ne provoqueront donc aucune exception ni saturation.</li>
<p>Dans un deuxième cas de figure il peut être intéressant de normaliser les entêtes HTTP. Prenons l’exemple de l’Accept-Encoding. Varnish préconise de le normaliser ainsi :</p>
<blockquote>
<pre>if (req.http.Accept-Encoding) {
  if (req.http.Accept-Encoding ~ "gzip") {
    set req.http.Accept-Encoding = "gzip";
  } elsif (req.http.Accept-Encoding ~ "deflate") {
    set req.http.Accept-Encoding = "deflate";
  } else {
    remove req.http.Accept-Encoding;
  }
}</pre>
</blockquote>
<p>Tout simplement pour éviter de créer des entrées cache différentes pour un même payload uniquement parce que tous les clients n’écrivent pas cet entête de la même façon.</p>
<p>Nous pouvons aussi enlever certains headers qui peuvent donner trop d’informations sur l’infrastructure. Pour S3 par exemple nous allons passer ces commandes dans le fetch :</p>
<blockquote><p>unset beresp.http.x-amz-id-2;<br />
unset beresp.http.x-amz-request-id;<br />
unset beresp.http.x-amz-meta-s3cmd-attrs;<br />
unset beresp.http.x-amz-meta-s3fox-filesize;<br />
unset beresp.http.x-amz-meta-s3fox-modifiedtime;</p></blockquote>
<p>Ou positionner des entêtes plus personnelles :</p>
<blockquote><p>set beresp.http.Server = &laquo;&nbsp;ServeurPerso&nbsp;&raquo;;</p></blockquote>
<p>La dernière petite chose à penser pour le nettoyage réside dans le positionnement d’un content-type correct pour toutes des ressources. Cette opération se fait de la même manière que pour le nettoyage des headers en positionnant “set beresp.http.Content-Type” par groupe de ressources.</p>
<p>De par ces fonctionnalités, Varnish est capable d&#8217;assurer l&#8217;orchestration de la haute disponibilité d&#8217;une architecture. Il est capable de détecter les backends défaillants et même de les remplacer en s&#8217;appuyant sur son cache. Il va les protéger en prenant en compte une grande partie de la gestion des erreurs 404.</p>
<p>&nbsp;</p>
<h3>Uniformisation des Logs d’accès</h3>
<p>Le process “varnishd” ne produit aucun log. Il se contente d’écrire les informations dans des segments de mémoire partagée. Ces segments sont consommés par des outils comme varnishadm, varnishlog ou encore varnishncsa. C’est principalement varnishncsa qui nous intéresse. C’est ce process qui va lire les informations et créer un fichier de log au format NCSA. L’avantage ici est énorme. Nous pouvons décharger les serveurs d’applications et front http de la production de ces logs. De plus ces logs seront moins éparpillés (quoi que, avec l’utilisation de <a title="syslog-ng" href="http://www.balabit.com/sites/default/files/documents/syslog-ng-v3.0-guide-admin-en.html/bk01-toc.html" target="_blank">syslog-ng</a> ça ne soit pas un problème). Enfin les logs seront tous normalisés qu&#8217;ils soient sur Apache, Tomcat, JBoss ou encore lighttp et NginX. Nous pouvons donc penser uniquement aux traitements que nous allons bien pouvoir leur faire subir et ne plus passer du temps à tout reformater. Cette considération prend tout son sens quand on commence à atteindre plusieurs gigas de logs d’accès par jour.<br />
Depuis la version 3.0, Varnishncsa permet de ne pas suivre la norme NCSA et nous laisse le choix du format de sortie.</p>
<p><em><strong>Laurent ROUX</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2012/02/le-web-accelere-avec-varnish/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Plus loin dans l’automatisation avec le DNS</title>
		<link>http://decrypt.ysance.com/2012/01/plus-loin-dans-l%e2%80%99automatisation-avec-le-dns/</link>
		<comments>http://decrypt.ysance.com/2012/01/plus-loin-dans-l%e2%80%99automatisation-avec-le-dns/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 08:55:31 +0000</pubDate>
		<dc:creator>Laurent Roux</dc:creator>
				<category><![CDATA[Automatisation]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Haute Disponibilité]]></category>
		<category><![CDATA[Industrialisation]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[Capistrano]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[IaaS]]></category>
		<category><![CDATA[Scalability]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=2727</guid>
		<description><![CDATA[Dans le monde élastique du Cloud et plus précisément en ce qui concerne l’IaaS, nous nous heurtons souvent au problème : “quelle est l’adresse de telle machine, quel est son mode d’accès...”. A ces questions peuvent s’ajouter la problématique du tout automatique via un <a title="Site de Capistrano" href="http://www.capify.org/">Capistrano</a> par exemple. Vous me direz qu’il existe une console Web et des API. Oui mais la console n’est pas réellement exploitable pour l’automatisation et les API ont besoin de crédentials que l’on ne préfère pas disséminer partout sur les serveurs.

Le but de cet article est de montrer comment avoir un référentiel des instances disponibles sur un compte Amazon (ou autre) avec toutes les informations qui vont bien sans devoir utiliser la console web Amazon. Cette solution permet de pousser l’automatisation un cran plus loin en proposant une liste exhaustive que l’on peut automatiser et la possibilité d’avoir une liste des serveurs disponibles en une ligne de commande pour n’importe quel Devops allergique aux opérations sur navigateur web.

[...]
]]></description>
			<content:encoded><![CDATA[<p>Dans le monde élastique du Cloud et plus précisément en ce qui concerne l’IaaS, nous nous heurtons souvent au problème : “quelle est l’adresse de telle machine, quel est son mode d’accès&#8230;”. A ces questions peuvent s’ajouter la problématique du tout automatique via un <a title="Site de Capistrano" href="http://www.capify.org/">Capistrano</a> par exemple. Vous me direz qu’il existe une console Web et des API. Oui mais la console n’est pas réellement exploitable pour l’automatisation et les API ont besoin de crédentials que l’on ne préfère pas disséminer partout sur les serveurs.</p>
<p>Le but de cet article est de montrer comment avoir un référentiel des instances disponibles sur un compte Amazon (ou autre) avec toutes les informations qui vont bien sans devoir utiliser la console web Amazon. Cette solution permet de pousser l’automatisation un cran plus loin en proposant une liste exhaustive que l’on peut automatiser et la possibilité d’avoir une liste des serveurs disponibles en une ligne de commande pour n’importe quel Devops allergique aux opérations sur navigateur web.</p>
<p>Dans le but de rester élastique dans la démarche, nous allons utiliser deux fonctionnalités DNS des plus intéressantes qui sont :</p>
<li>les requêtes nsupdate</li>
<li>les requêtes AXFR</li>
<p>Nous allons aussi nous aider des API Amazon et tout ça dans un environnement Linux. Notre DNS va donc servir de base de données pour référencer les machines via leurs IP privées.</p>
<h4>Liste des pré-requis</h4>
<p>Un serveur T1-Micro sur Amazon servant de DNS est largement suffisant. Le package BIND9 doit être installé. Sachant que sur une infrastructure nous préférons utiliser des noms à la place des IP, l’utilisation d’un DNS est fortement conseillée. De plus, la configuration des différents éléments techniques d’une plate-forme est nettement plus souple en utilisant des noms.</p>
<h4>Configuration</h4>
<p>Pour effectuer des requêtes nsupdate sur un DNS il faut autoriser les IP des machines qui ont le droit d&#8217;émettre ces requêtes vers notre DNS (nsupdate et axfr). Ensuite il faut placer les bases du DNS (fichiers db.xxx) dans un endroit ou le process bind a le droit d’écrire. Pour des raisons de sécurité, il est hors de question que ce process puisse avoir un accès en écriture dans le répertoire /etc/ nous allons donc déplacer ces fichiers dans /var/cache/bind/.</p>
<h4>Elements de Configuration DNS</h4>
<p>Dans le fichier named.conf.local dans la section de la zone que nous voulons contrôler il faut ajouter l’ip de la machine autorisée à faire les requêtes nsupdate :</p>
<blockquote><p>allow-update { xxx.xxx.xxx.xxx; };</p></blockquote>
<p>Les requêtes AXFR sont autorisées dans ce même fichier de configuration en ajoutant l’ip des serveurs autorisés dans la sections “allow-transfer” de la zone.<br />
Dans cette même section nous allons déplacer le fichier de la zone en modifiant son chemin :</p>
<blockquote><p>file &laquo;&nbsp;/var/cache/bind/db.xxxx.yyyy&nbsp;&raquo;;</p></blockquote>
<h4>Démarche</h4>
<p>Une fois cette opération réalisée nous pouvons utiliser les API Amazon pour récupérer les informations qui concernent une instance (par exemple, nous utiliserons ec2-describe-instances dont la documentation est à l’adresse suivante :  <a title="Site de Amazon Web Services, AWS Documentation - ec2-describe-instances" href="http://docs.amazonwebservices.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-DescribeInstances.html">DOC API</a>).<br />
Les informations que nous allons récupérer (security groupes, Key, EBS ID&#8230;..), vont être réorganisées pour ensuite être injectées dans le DNS sous la forme d’enregistrements TXT en plus de l’enregistrement A utilisé pour référencer une adresse.<br />
Pour réaliser une mise à jour automatique du DNS il est préférable d’exécuter une instruction de “delete” avant l’ajout d’un enregistrement. Vu que nous sommes sur un DNS qui sera utilisé pour les zones de notre infrastructure nous allons prendre en compte les trois enregistrements suivants :</p>
<li>le forward record, qui fait correspondre un nom à une ip.</li>
<li>le reverse record, qui fait correspondre une ip à un nom.</li>
<li>le text record, qui va nous permettre d’enregistrer les informations sur l’instance.</li>
<p>Pour enlever les enregistrements précédents (dans le cas ou le serveur est déjà référencé ou pour enlever le serveur).</p>
<blockquote><p>nsupdate<br />
&gt; server monserverdns.domain.com<br />
&gt; zone domain.net<br />
&gt; update delete monserver.domain.net A<br />
&gt; update delete monserver.domain.net TXT<br />
&gt; update delete zzz.yyy.xxx.www.in-addr.arpa. PTR<br />
&gt; send</p></blockquote>
<p>Ensuite on enregistre le serveur.</p>
<blockquote><p>nsupdate<br />
&gt; server monserverdns.domain.com<br />
&gt; zone domain.net<br />
&gt; update add monserver.domain.net 86400 IN A www.xxx.yyy.zzz<br />
&gt; update add monserver.domain.net 86400 IN TXT informations sur le serveur<br />
&gt; update add zzz.yyy.xxx.www.in-addr.arpa 86400 IN PTR monserver.domain.net.<br />
&gt; send</p></blockquote>
<p>Nous partons du principe que le DNS est bien déclaré au niveau du fichier /etc/resolv.conf.</p>
<p>Une fois tous les enregistrements en place il suffit de passer la commande suivante pour que la liste apparaisse :</p>
<blockquote><p>dig @ip_du_dns axfr domain.net</p>
<p>sh-3.2# dig @10.211.55.5 axfr test.net<br />
; &lt;&lt;&gt;&gt; DiG 9.7.3-P3 &lt;&lt;&gt;&gt; @10.211.55.5 axfr test.net;<br />
(1 server found)<br />
;; global options: +cmd<br />
test.net.		604800	IN	SOA	dns. root.test.net. 4 604800 86400 2419200 604800<br />
test.net.		604800	IN	NS	dns.<br />
test.net.		604800	IN	A	10.211.55.5<br />
test.net.		604800	IN	AAAA	::1<br />
s1.test.net.		86400	IN	A	1.2.3.4<br />
s1.test.net.		86400	IN	TXT	&laquo;&nbsp;tout&nbsp;&raquo; &laquo;&nbsp;ce&nbsp;&raquo; &laquo;&nbsp;que&nbsp;&raquo; &laquo;&nbsp;l&nbsp;&raquo; &laquo;&nbsp;on&nbsp;&raquo; &laquo;&nbsp;peut&nbsp;&raquo; &laquo;&nbsp;dire&nbsp;&raquo; &laquo;&nbsp;sur&nbsp;&raquo; &laquo;&nbsp;un&nbsp;&raquo; &laquo;&nbsp;serveur&nbsp;&raquo;<br />
test.net.		604800	IN	SOA	dns. root.test.net. 4 604800 86400 2419200 604800<br />
;; Query time: 19 msec<br />
;; SERVER: 10.211.55.5#53(10.211.55.5)<br />
;; WHEN: Mon Jan  9 16:03:56 2012<br />
;; XFR size: 7 records (messages 1, bytes 237)</p></blockquote>
<p>Nous touchons au but. Il suffit maintenant d&#8217;exécuter la même commande avec un grep sur “TXT” pour récupérer la liste qui nous intéresse.</p>
<p>Avec la commande suivante nous allons enlever l’enregistrement TXT du DNS :</p>
<blockquote><p>nsupdate<br />
&gt; server monserverdns.test.com<br />
&gt; zone test.net<br />
&gt; update delete monserver.test.net TXT<br />
&gt; send</p></blockquote>
<blockquote><p>sh-3.2# dig @10.211.55.5 axfr test.net<br />
; &lt;&lt;&gt;&gt; DiG 9.7.3-P3 &lt;&lt;&gt;&gt;<br />
@10.211.55.5 axfr test.net;<br />
(1 server found);;<br />
global options: +cmd<br />
test.net.		604800	IN	SOA	dns. root.test.net. 5 604800 86400 2419200 604800<br />
test.net.		604800	IN	NS	dns.<br />
test.net.		604800	IN	A	10.211.55.5<br />
test.net.		604800	IN	AAAA	::1<br />
s1.test.net.		86400	IN	A	1.2.3.4<br />
test.net.		604800	IN	SOA	dns. root.test.net. 5 604800 86400 2419200 604800<br />
;; Query time: 2 msec<br />
;; SERVER: 10.211.55.5#53(10.211.55.5)<br />
;; WHEN: Mon Jan  9 16:15:30 2012<br />
;; XFR size: 6 records (messages 1, bytes 183)</p></blockquote>
<p>Nous avons donc une base de données (le serveur DNS) qui va nous servir de référence pour y placer toutes les informations des instances tirées des API Amazon.<br />
Cet article n’aborde pas le côté sécurité de bind et ne fait donc pas référence à la gestion de clé pour les requêtes nsupdate.</p>
<p><em><strong>Laurent ROUX</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2012/01/plus-loin-dans-l%e2%80%99automatisation-avec-le-dns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>7 Tendances Cloud Computing en 2011</title>
		<link>http://decrypt.ysance.com/2011/07/7-tendances-cloud-computing-en-2011/</link>
		<comments>http://decrypt.ysance.com/2011/07/7-tendances-cloud-computing-en-2011/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 14:55:56 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[Cloud Hybride]]></category>
		<category><![CDATA[Cloud Privé]]></category>
		<category><![CDATA[Configuration Management System]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Infogérance]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Portabilité]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=2643</guid>
		<description><![CDATA[<img class="size-thumbnail wp-image-2646 alignright" title="Cloud Invader" src="http://decrypt.ysance.com/wp-content/uploads/2011/07/space_invader-150x150.png" alt="Cloud Invader" width="90" height="90" /> Bonjour à tous ! Je mets à disposition sur Decrypt les slides de ma présentation lors de la Web Conférence <strong>Tendances Cloud 2011</strong>. Vous y trouverez ma <strong><span style="color: #ff0000;">définition </span></strong>du Cloud Computing, ainsi que les<strong><span style="color: #ff0000;"> 7 tendances</span></strong> de la fin de cette année qui, à mon sens, marqueront la direction du Cloud au niveau des entreprises :
<ol>
	<li>Champ Libre pour l’Open Source</li>
	<li>La Portabilité dans le Cloud</li>
	<li>DevOps</li>
	<li>AWS, l’Unique ?</li>
	<li>Cloud Privé : Mythe ou Réalité ?</li>
	<li>Moteur Hybride</li>
	<li>Infogérance</li>
</ol>
En vous souhaitant bon visionnage !

[...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-2646 alignright" title="Cloud Invader" src="http://decrypt.ysance.com/wp-content/uploads/2011/07/space_invader-150x150.png" alt="Cloud Invader" width="90" height="90" /> Bonjour à tous ! Je mets à disposition sur Decrypt les slides de ma présentation lors de la Web Conférence <strong>Tendances Cloud 2011</strong>. Vous y trouverez ma <strong><span style="color: #ff0000;">définition </span></strong>du Cloud Computing, ainsi que les<strong><span style="color: #ff0000;"> 7 tendances</span></strong> de la fin de cette année qui, à mon sens, marqueront la direction du Cloud au niveau des entreprises :</p>
<ol>
<li>Champ Libre pour l’Open Source</li>
<li>La Portabilité dans le Cloud</li>
<li>DevOps</li>
<li>AWS, l’Unique ?</li>
<li>Cloud Privé : Mythe ou Réalité ?</li>
<li>Moteur Hybride</li>
<li>Infogérance</li>
</ol>
<p>En vous souhaitant bon visionnage !</p>
<div style="width:595px" id="__ss_8574899"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/fredericfaure/tendances-cloud-2011" title="7 Tendances Cloud Computing en 2011" target="_blank">7 Tendances Cloud Computing en 2011</a></strong> <object id="__sse8574899" width="595" height="497"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=tendancescloud2011-ffa-110712091958-phpapp01&#038;stripped_title=tendances-cloud-2011&#038;userName=fredericfaure" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse8574899" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=tendancescloud2011-ffa-110712091958-phpapp01&#038;stripped_title=tendances-cloud-2011&#038;userName=fredericfaure" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="595" height="497"></embed></object>
<div style="padding:5px 0 12px"> </div>
</p></div>
<p><strong>Frédéric FAURE</strong> <a title="Frédéric FAURE @Twitter" href="http://twitter.com/fredericfaure">@Twitter</a> <a title="Ysance, Simplifions les projets informatiques" href="http://www.ysance.com/">@Ysance</a></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2011/07/7-tendances-cloud-computing-en-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automation on AWS with Ruby and Puppet</title>
		<link>http://decrypt.ysance.com/2011/06/automation-on-aws-with-ruby-and-puppet/</link>
		<comments>http://decrypt.ysance.com/2011/06/automation-on-aws-with-ruby-and-puppet/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 15:33:57 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Automatisation]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[Capistrano]]></category>
		<category><![CDATA[IaaS]]></category>
		<category><![CDATA[Puppet]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[UrbanDive]]></category>
		<category><![CDATA[XTR-Lucid]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=2459</guid>
		<description><![CDATA[<img class="size-full wp-image-2465 alignright" title="Logo UrbanDive" src="http://decrypt.ysance.com/wp-content/uploads/2011/06/urbandive.png" alt="Logo UrbanDive" width="141" height="141" />

<a title="UrbanDive" href="http://www.urbandive.com">Urbandive</a> is an immersive view service launched by the <a title="Groupe Pages Jaunes" href="http://www.pagesjaunesgroupe.com/">French YellowPages</a> which allows you to travel in cities in France thanks to a 360° view. Urbandive focuses on providing high definition pictures and accurate professional and social content. One of the biggest jobs was to enable a fast scalable architecture, because it was really difficult to forecast the traffic load at production time. Traffic load may be influenced if the service receives attention from users as a result of advertising.

Below you will find a summary of the goals we achieve by using a Ruby scheduler built on top of <a title="Puppet Labs" href="http://www.puppetlabs.com/">Puppet</a> on <a title="Amazon Web Services" href="http://aws.amazon.com/">AWS</a> to create a complete infrastructure.

<strong><em>Workflow &#38; XTR-Lucid</em></strong>
Our scalability combo is : a home-made Ruby scheduler (<em>XTR-Lucid</em>) to deal with AWS APIs + the Puppet Master to install services and configure EC2 instances and keep them up-to-date during all the production time. This leads to full automation.

Here is the workflow (for the <span style="text-decoration: underline;">creation step</span>, there are other workflows for stop/reboot/health-check/...) of our automation tool. The dashboard allows you to select a template (which contains the following informations : AMI id, instance type, availability zone, key, list of security groups, list of EBS - from snapshots or not -, ...) and to set a name for the instance in the "create" workflow.

[...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-2465 alignright" title="Logo UrbanDive" src="http://decrypt.ysance.com/wp-content/uploads/2011/06/urbandive.png" alt="Logo UrbanDive" width="141" height="141" /></p>
<p><a title="UrbanDive" href="http://www.urbandive.com">Urbandive</a> is an immersive view service launched by the <a title="Groupe Pages Jaunes" href="http://www.pagesjaunesgroupe.com/">French YellowPages</a> which allows you to travel in cities in France thanks to a 360° view. Urbandive focuses on providing high definition pictures and accurate professional and social content. One of the biggest jobs was to enable a fast scalable architecture, because it was really difficult to forecast the traffic load at production time. Traffic load may be influenced if the service receives attention from users as a result of advertising.</p>
<p>Below you will find a summary of the goals we achieve by using a Ruby scheduler built on top of <a title="Puppet Labs" href="http://www.puppetlabs.com/">Puppet</a> on <a title="Amazon Web Services" href="http://aws.amazon.com/">AWS</a> to create a complete infrastructure.</p>
<p><strong><em>Workflow &amp; XTR-Lucid</em></strong><br />
Our scalability combo is : a home-made Ruby scheduler (<em>XTR-Lucid</em>) to deal with AWS APIs + the Puppet Master to install services and configure EC2 instances and keep them up-to-date during all the production time. This leads to full automation.</p>
<p>Here is the workflow (for the <span style="text-decoration: underline;">creation step</span>, there are other workflows for stop/reboot/health-check/&#8230;) of our automation tool. The dashboard allows you to select a template (which contains the following informations : AMI id, instance type, availability zone, key, list of security groups, list of EBS &#8211; from snapshots or not -, &#8230;) and to set a name for the instance in the &laquo;&nbsp;create&nbsp;&raquo; workflow.</p>
<p><img class="size-full wp-image-2472" title="Automatisation AWS XTR-Lucid Puppet" src="http://decrypt.ysance.com/wp-content/uploads/2011/06/Automatisation-AWS-PuppetLabs.png" alt="Automatisation AWS XTR-Lucid Puppet" width="960" height="720" /></p>
<p>This schema gives the general idea of how it works.</p>
<p>To be more accurate and to explain the workflow just a bit :</p>
<ul>
<li>The scheduler can be outside or inside of AWS.</li>
<li>First an <em>action file</em> is put into the <em>TODO </em>directory, by the web application (simple <em>rhtml </em>dashboard) or by the monitoring tool directly. For posting files from the monitoring tool, we will have to define thresholds after some weeks of use of the application. At this time, we have not enough data feedback as we just commenced production.</li>
<li>The action file is then processed by the scheduler :</li>
</ul>
<ol>
<li>Connection to AWS and request to start an EC2 instance from the AMI.</li>
<li>Scheduler checks that instance is running, EBS (Elastic Block Store) are <em>available</em>, then <em>in-use</em>, and eventually that EC2 TCP stack is up and SSH is OK. Then it connects to the brand-new instance.</li>
<li>Puppet client is installed and started, so it sends a certificate request to the master.</li>
<li>Puppet client is stopped to avoid any interaction.</li>
<li>Connection to the PuppetMaster : update the main files (nodes files of PuppetMaster, &laquo;&nbsp;/etc/hosts&nbsp;&raquo; file, roles file of Capistrano) and then accept the certificate request of the client.</li>
<li>Capistrano updates the &laquo;&nbsp;/etc/hosts&nbsp;&raquo; file on all instances of our infrastructure as soon as a new EC2 instance comes up (or down), without having to trigger (<em>puppetrun</em>) the simultaneous &laquo;&nbsp;pull configuration&nbsp;&raquo; of all the Puppet clients.</li>
<li>Connection to the new instance.</li>
<li>Puppet client is started.</li>
<li>Puppet client connects to the master and authenticate. Then it gets what it needs to install and configure the new instance.</li>
<li>The installation occurs on the new instance that will be soon available.</li>
</ol>
<ul>
<li>The scheduler doesn&#8217;t wait until the instance is fully configured to end the task : installation by Puppet is asynchronous. The scheduler just ends by updating its repository and the monitoring tool.</li>
</ul>
<p><span style="text-decoration: underline;">Technical note 1 :</span> we use <a title="Capistrano" href="http://www.capify.org/">Capistrano</a> mainly for application deployment. In the above case (<em>create instance</em>), we use it to update the &laquo;&nbsp;/etc/hosts&nbsp;&raquo; file on all instances of our infrastructure as soon as a new EC2 instance comes up (or down &#8211; it is the same use for <em>stop instance</em>), without having to trigger (<em>puppetrun</em>) the simultaneous &laquo;&nbsp;pull configuration&nbsp;&raquo; of all the Puppet clients (bad idea ;ob). That&#8217;s just a little tip for this workflow.</p>
<p><span style="text-decoration: underline;">Technical note 2 :</span> the Ruby scheduler works in asynchronous mode (for security reasons &amp; to be called by other tools &#8211; like a monitoring one) by creating <em>action files</em> from the web application in the <em>TODO </em>directory (which can be filled by the monitoring tool for auto-scalability) checked every minute by a CRON which calls the heart of the automation tool.</p>
<p><strong><em>Technical facts</em></strong></p>
<ul>
<li>We have actually 40 &#8211; 50 servers, that&#8217;s our base, but we probably will go higher when the traffic will come with marketing campaigns.</li>
<li>We use Lucid Lynx Ubuntu OS (from a standard AMI powered by <a title="Canonical" href="http://www.canonical.com/">Canonical</a>).</li>
<li>We use the PuppetMaster installed on <a title="Apache" href="http://httpd.apache.org/">Apache</a> with <a title="Phusion Passenger" href="http://www.modrails.com/">Phusion Passenger</a> to increase performances.</li>
<li>We took Puppet (standard version) right from the Ubuntu repositories packaged in the AMI.</li>
</ul>
<p><strong><em>Why using Puppet (and especially on AWS) ?</em></strong><br />
<span style="text-decoration: underline;"> Consistency &amp; Flexibility</span><br />
We have multiple services, so we need to be sure that each group of servers is consistent in terms of configuration. If we need to push a quick change on all nodes of a type at a given time, we can even push (trigger &laquo;&nbsp;pull&nbsp;&raquo;, to be more accurate, with <em>puppetrun</em>) this new setting from the PuppetMaster without waiting the pull of Puppet client (30min period) and we are sure that this one is pushed everywere it is needed.<br />
AWS offer AMIs to &laquo;&nbsp;snapshot&nbsp;&raquo; an instance and clone this one as many as we want. This is very good for developpement, load tests, .. But when we come into production, we cannot build another AMI each time we do a change on a setting and deploy again EC2 instances from the new AMI. We need something flexible to patch our configurations quickly, keeping consistency at all times.</p>
<p><span style="text-decoration: underline;">Scalability &amp; Ease</span><br />
This is a new Internet service which can have a load peak at anytime depending on marketing campaigns. But we have to deal with financial things too. So we keep a base and have to start quickly full configured up-to-date instances within a few minutes. We achieve this by writing a home-made ruby-script-based scheduler (<em>XTR-Lucid</em>) that deals with AWS APIs to launch/stop EC2, add EBS (empty or from snapshot), add/remove to/from ELB, add/delete the new/old host to/from our monitoring tool, &#8230; AWS EC2 instances are kept in a repository on our Ruby scheduler. Then our tool lets Puppet take over which ensures for each brand-new instance started from a standard Lucid Lynx AMI that all services, configurations, security rules are installed/applied. So with the feedback of our monitoring tool, the infrastructure can grow and decrease alone (depending on the thresholds set) or we can deploy and stop instances in just one click on our web dashboard.</p>
<p><span style="text-decoration: underline;">Operating</span><br />
In such a project, there is a lot of various services to monitor for the Ops team (And&#8230; Yes ! Ops team is always essential, even with automated infrastructure ! :o)). So this is important to capitalize upon knowledge in Puppet descriptors and XTR-Lucid repository and templates, so that by simply reading the descriptors/repository/templates, the whole team knows all what it needs to know at a glance (no need to look everywhere). Things become a lot easier.</p>
<p><span style="text-decoration: underline;">Portable Infrastructure</span><br />
Because of the diversity of services run in the project, maybe not all will fit into AWS in a long term experience (over one year). Once we have real-life feedback on traffic, some services will stay on AWS, others, maybe, will migrate into our physical datacenter. So it will be easier to migrate because all the configuration is concentrated in Puppet descriptors. This enables us to re-deploy easily a brand-new infrastructure on another plateform (even if it is not in the Cloud).</p>
<p>I hope you enjoyed this. You can find here some more information on the way the Ops job is evolving, based on this experience (among others) : <a title="Decrypt, Solutions Linux / Open Source 2011 – Le métier de l’Administration Système avec le Cloud Computing" href="http://decrypt.ysance.com/2011/05/solutions-linux-open-source-2011-le-metier-de-l-administration-systeme-avec-le-cloud-computing/">Solutions Linux / Open Source 2011 – Le métier de l’Administration Système avec le Cloud Computing</a> (FR). These slides are the ones used for a talk I gave at Solution Linux 2011 (France).</p>
<p><em><strong>Frédéric FAURE</strong></em> <a title="Frédéric FAURE @Twitter" href="http://twitter.com/fredericfaure">@Twitter</a> <a title="Ysance, Simplifions les projets informatiques" href="http://www.ysance.com/">@Ysance</a></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2011/06/automation-on-aws-with-ruby-and-puppet/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Solutions Linux / Open Source 2011 &#8211; Le métier de l&#8217;Administration Système avec le Cloud Computing</title>
		<link>http://decrypt.ysance.com/2011/05/solutions-linux-open-source-2011-le-metier-de-l-administration-systeme-avec-le-cloud-computing/</link>
		<comments>http://decrypt.ysance.com/2011/05/solutions-linux-open-source-2011-le-metier-de-l-administration-systeme-avec-le-cloud-computing/#comments</comments>
		<pubDate>Thu, 12 May 2011 16:10:57 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Automatisation]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Administration Système]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[Capistrano]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[IaaS]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Puppet]]></category>
		<category><![CDATA[Solutions Linux 2011]]></category>
		<category><![CDATA[UrbanDive]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=2322</guid>
		<description><![CDATA[<img class="size-full wp-image-2408 alignright" title="Solutions Linux / Open Source 2011" src="http://decrypt.ysance.com/wp-content/uploads/2011/05/SolutionsLinux2011.png" alt="Solutions Linux / Open Source 2011" width="260" height="68" />

De retour du <a title="Solutions Linux / Open Source" href="http://www.solutionslinux.fr/">salon Solutions Linux / Open Source 2011</a> (salon professionnel annuel dédié aux logiciels et solutions libres pour les entreprises), je publie les slides que j'ai présentés en compagnie d'Omer SHALA (Mappy) lors d'une des conférences du salon ayant pour sujet le Cloud Computing. Cette présentation porte sur l'évolution du métier de l'Administration Système avec l'utilisation du Cloud Computing. Nous avons pris comme support notre expérience du projet <a title="UrbanDive" href="http://www.urbandive.com/">UrbanDive</a>, le nouveau service de vue immersive en zone urbaine du groupe PagesJaunes.

Omer SHALA, responsable de l'infrastructure du projet, a tout d'abord exposé le contexte du projet, puis a expliqué les éléments de décision qui nous ont amené à choisir le Cloud Computing (et en l'occurrence les <a title="Site de Amazon Web Services" href="http://aws.amazon.com/">Amazon Web Services</a> - AWS) pour mettre en place nos services. Il a finalement fait une synthèse de son expérience de la mise en place de cette infrastructure avec les services d'Amazon (de type IaaS - Infrastructure as a Service), par rapport à ses expériences avec des infrastructures plus classiques (en datacenter) au sein du groupe PagesJaunes.

J'ai repris la seconde partie de la conférence et ai exposé ma vision de l'évolution de l'administration système avec l'utilisation de solutions de type Iaas. Pour finir, j'ai présenté ce que nous avons mis en place pour optimiser le potentiel des services Amazon, notamment via l'automatisation :
<ul>
	<li>avec le développement d'un ordonnanceur Ruby (<em>XTR-Lucid</em>) pour interfacer les APIs proposées par Amazon et gérer les cinématiques de communication (création/suppression d'instances métier EC2 et disque réseaux EBS, déploiement des services, ...) avec les AWS,</li>
	<li>avec l'utilisation d'outils Open Source comme le gestionnaire de configuration centralisé <a title="Site de PuppetLabs" href="http://www.puppetlabs.com/">Puppet</a> ou bien le scripteur/exécuteur de tâches <a title="Site de Capistrano" href="http://www.capify.org/">Capistrano</a>.</li>
</ul>

[...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-2408 alignright" title="Solutions Linux / Open Source 2011" src="http://decrypt.ysance.com/wp-content/uploads/2011/05/SolutionsLinux2011.png" alt="Solutions Linux / Open Source 2011" width="260" height="68" /></p>
<p>De retour du <a title="Solutions Linux / Open Source" href="http://www.solutionslinux.fr/">salon Solutions Linux / Open Source 2011</a> (salon professionnel annuel dédié aux logiciels et solutions libres pour les entreprises), je publie les slides que j&#8217;ai présentés en compagnie d&#8217;Omer SHALA (Mappy) lors d&#8217;une des conférences du salon ayant pour sujet le Cloud Computing. Cette présentation porte sur l&#8217;évolution du métier de l&#8217;Administration Système avec l&#8217;utilisation du Cloud Computing. Nous avons pris comme support notre expérience du projet <a title="UrbanDive" href="http://www.urbandive.com/">UrbanDive</a>, le nouveau service de vue immersive en zone urbaine du groupe PagesJaunes.</p>
<p>Omer SHALA, responsable de l&#8217;infrastructure du projet, a tout d&#8217;abord exposé le contexte du projet, puis a expliqué les éléments de décision qui nous ont amené à choisir le Cloud Computing (et en l&#8217;occurrence les <a title="Site de Amazon Web Services" href="http://aws.amazon.com/">Amazon Web Services</a> &#8211; AWS) pour mettre en place nos services. Il a finalement fait une synthèse de son expérience de la mise en place de cette infrastructure avec les services d&#8217;Amazon (de type IaaS &#8211; Infrastructure as a Service), par rapport à ses expériences avec des infrastructures plus classiques (en datacenter) au sein du groupe PagesJaunes.</p>
<p>J&#8217;ai repris la seconde partie de la conférence et ai exposé ma vision de l&#8217;évolution de l&#8217;administration système avec l&#8217;utilisation de solutions de type Iaas. Pour finir, j&#8217;ai présenté ce que nous avons mis en place pour optimiser le potentiel des services Amazon, notamment via l&#8217;automatisation :</p>
<ul>
<li>avec le développement d&#8217;un ordonnanceur Ruby (<em>XTR-Lucid</em>) pour interfacer les APIs proposées par Amazon et gérer les cinématiques de communication (création/suppression d&#8217;instances métier EC2 et disque réseaux EBS, déploiement des services, &#8230;) avec les AWS,</li>
<li>avec l&#8217;utilisation d&#8217;outils Open Source comme le gestionnaire de configuration centralisé <a title="Site de PuppetLabs" href="http://www.puppetlabs.com/">Puppet</a> ou bien le scripteur/exécuteur de tâches <a title="Site de Capistrano" href="http://www.capify.org/">Capistrano</a>.</li>
</ul>
<p>Je vous laisse visionner cette présentation en dessous !</p>
<p>Nous avons également inclus dans cette présentation la <strong>matrice de décision</strong> sur laquelle nous nous sommes basés <strong>pour décider de l&#8217;adoption du Cloud Computing</strong> pour la mise en place de l&#8217;infrastructure.</p>
<div style="width:595px" id="__ss_7936569"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/fredericfaure/solutions-linux-2011-evolution-mtier-admin-sys-avec-le-cloud-computing" title="Solutions Linux 2011 - Evolution Métier Admin Sys avec le Cloud Computing">Solutions Linux 2011 &#8211; Evolution Métier Admin Sys avec le Cloud Computing</a></strong> <object id="__sse7936569" width="595" height="497"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=solutionslinux2011-evolutionadminsyscloudcomputing-ffa-osh-110512045127-phpapp01&#038;stripped_title=solutions-linux-2011-evolution-mtier-admin-sys-avec-le-cloud-computing&#038;userName=fredericfaure" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse7936569" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=solutionslinux2011-evolutionadminsyscloudcomputing-ffa-osh-110512045127-phpapp01&#038;stripped_title=solutions-linux-2011-evolution-mtier-admin-sys-avec-le-cloud-computing&#038;userName=fredericfaure" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="595" height="497"></embed></object></div>
<p><em><strong>Frédéric FAURE</strong></em> <a title="Frédéric FAURE @Twitter" href="http://twitter.com/fredericfaure">@Twitter</a> <a title="Ysance, Simplifions les projets informatiques" href="http://www.ysance.com/">@Ysance</a></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2011/05/solutions-linux-open-source-2011-le-metier-de-l-administration-systeme-avec-le-cloud-computing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Finalement Cohérent &#8211; Revisité</title>
		<link>http://decrypt.ysance.com/2011/04/finalement-coherent-revisite/</link>
		<comments>http://decrypt.ysance.com/2011/04/finalement-coherent-revisite/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 15:51:52 +0000</pubDate>
		<dc:creator>Werner Vogels</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Haute Disponibilité]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Load Balancing]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Systèmes Distribués]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[Cohérence]]></category>
		<category><![CDATA[Consistance]]></category>
		<category><![CDATA[Dynamo]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=2188</guid>
		<description><![CDATA[<em>J’ai écrit une <a title="All Things Distributed, Eventually Consistent" href="http://www.allthingsdistributed.com/2007/12/eventually_consistent.html">première version de cet article</a> au sujet des modèles de cohérence il y a environ un an, mais je n’en étais jamais très content, car il a été rédigé à la hâte, et le sujet est suffisamment important pour mériter un traitement plus approfondi. <a title="Site de ACM Queue" href="http://queue.acm.org/issuedetail.cfm?issue=1466443">ACM Queue</a> m’a demandé de réviser l’article afin de le publier dans leur revue, et j’ai profité de cette occasion pour l’améliorer. La nouvelle version suit :</em>

<strong>Finalement Cohérent – Construire des systèmes distribués et fiables à l'échelle mondiale exige des compromis entre la cohérence et la disponibilité.</strong>

À la base du Cloud Computing de Amazon se trouvent des services d'infrastructure tels S3 (Simple Storage Service) de Amazon, SimpleDB, et EC2 (Elastic Compute Cloud), qui fournissent des ressources pour la construction de plateformes de calcul à l’échelle d’Internet et d'une large gamme d’applications. Les exigences imposées aux dits services en infrastructure sont très strictes : ils doivent afficher de bonnes notes dans les domaines de la sécurité, la scalabilité, la disponibilité, la performance et la rentabilité, et ils doivent satisfaire ces besoins tout en desservant des millions de clients dans le monde, de façon continue.

Sous les couvertures, ces services sont des systèmes distribués colossaux qui opèrent à l'échelle mondiale. Cette échelle crée des défis supplémentaires, car quand un système traite des trillions et des trillions de requêtes, des évènements qui ont habituellement une probabilité d’occurrence faible sont désormais certains de se produire, ce qu’il faut prendre en compte dès le début lors de la conception et dans l’architecture du système. Etant donné l’étendue mondiale de ces systèmes, nous utilisons des techniques de réplication partout afin de garantir une performance cohérente et une haute disponibilité. Bien que la réplication nous rapproche de nos objectifs, elle ne peut les atteindre de façon parfaitement transparente ; sous plusieurs conditions, les clients de ces services seront confrontés avec les conséquences d’avoir utilisé des techniques de réplication au sein des services.

[...]
]]></description>
			<content:encoded><![CDATA[<p><em>J’ai écrit une <a title="All Things Distributed, Eventually Consistent" href="http://www.allthingsdistributed.com/2007/12/eventually_consistent.html">première version de cet article</a> au sujet des modèles de cohérence il y a environ un an, mais je n’en étais jamais très content, car il a été rédigé à la hâte, et le sujet est suffisamment important pour mériter un traitement plus approfondi. <a title="Site de ACM Queue" href="http://queue.acm.org/issuedetail.cfm?issue=1466443">ACM Queue</a> m’a demandé de réviser l’article afin de le publier dans leur revue, et j’ai profité de cette occasion pour l’améliorer. La nouvelle version suit :</em></p>
<p><strong>Finalement Cohérent – Construire des systèmes distribués et fiables à l&#8217;échelle mondiale exige des compromis entre la cohérence et la disponibilité.</strong></p>
<p>À la base du Cloud Computing de Amazon se trouvent des services d&#8217;infrastructure tels S3 (Simple Storage Service) de Amazon, SimpleDB, et EC2 (Elastic Compute Cloud), qui fournissent des ressources pour la construction de plateformes de calcul à l’échelle d’Internet et d&#8217;une large gamme d’applications. Les exigences imposées aux dits services en infrastructure sont très strictes : ils doivent afficher de bonnes notes dans les domaines de la sécurité, la scalabilité, la disponibilité, la performance et la rentabilité, et ils doivent satisfaire ces besoins tout en desservant des millions de clients dans le monde, de façon continue.</p>
<p>Sous les couvertures, ces services sont des systèmes distribués colossaux qui opèrent à l&#8217;échelle mondiale. Cette échelle crée des défis supplémentaires, car quand un système traite des trillions et des trillions de requêtes, des évènements qui ont habituellement une probabilité d’occurrence faible sont désormais certains de se produire, ce qu’il faut prendre en compte dès le début lors de la conception et dans l’architecture du système. Etant donné l’étendue mondiale de ces systèmes, nous utilisons des techniques de réplication partout afin de garantir une performance cohérente et une haute disponibilité. Bien que la réplication nous rapproche de nos objectifs, elle ne peut les atteindre de façon parfaitement transparente ; sous plusieurs conditions, les clients de ces services seront confrontés avec les conséquences d’avoir utilisé des techniques de réplication au sein des services.</p>
<p>Une des façons par laquelle cela se manifeste est dans le type de cohérence des données fournie, surtout quand le système distribué sous-jacent fournit un modèle de cohérence à terme pour la réplication de données. Lors de la conception de ces systèmes à grande échelle chez Amazon, nous utilisons un jeu de principes et d’abstractions directeurs liés à la réplication de données à grande échelle et nous nous focalisons sur les compromis entre la haute disponibilité et la cohérence des données. Dans cet article je présente une partie du contexte pertinent qui a servi de socle à notre approche pour délivrer des systèmes distribués fiables qui doivent opérer à grande échelle. Une <a title="All Things Distributed, Eventually Consistent" href="http://www.allthingsdistributed.com/2007/12/eventually_consistent.html">version antérieure de ce texte</a> a été publiée sur le blog <em>All Things Distributed</em> en décembre 2007, et a été beaucoup améliorée grâce à l’aide de ses lecteurs.</p>
<p><strong>Une Perspective Historique </strong></p>
<p>Dans un monde idéal, il n’y aurait qu’un modèle de cohérence : à chaque fois qu’une mise à jour est faite, tous les observateurs la verraient. La première fois que ceci s’est avéré difficile était dans les systèmes de bases de données de la fin des années 70. La meilleure &laquo;&nbsp;œuvre historique&nbsp;&raquo; sur ce sujet est &laquo;&nbsp;<em>Notes on Distributed Databases</em>&nbsp;&raquo; , par  <a href="http://acmqueue.com/modules.php?name=Content&amp;pa=showpage&amp;pid=233">Bruce Lindsay et al</a>. <sup>5</sup> Elle expose les principes fondamentaux de la réplication de bases de données et examine un certain nombre de techniques qui traitent de la réalisation de la cohérence. Plusieurs de ces techniques tentent d&#8217;obtenir la transparence de la distribution &#8211; c&#8217;est-à-dire que, pour l’utilisateur du système, il semble qu’il n’y ait qu’un seul système, au lieu d&#8217;un certain nombre de systèmes collaboratifs. Plusieurs systèmes pendant cette époque ont adopté l&#8217;approche qu&#8217;il était préférable de désactiver le système entier plutôt que de rompre cette transparence.<sup>2</sup></p>
<p>Au milieu des années 90, avec l’essor de systèmes d’Internet plus importants, ces pratiques ont été revues. A cette époque, les gens commençaient à considérer l&#8217;idée que la disponibilité était peut-être la propriété la plus importante de ces systèmes, mais ils avaient du mal à décider avec quoi ils pourraient faire le compromis. <a href="http://www.cs.berkeley.edu/~brewer/">Eric Brewer</a>, professeur de systèmes à l’Université de Berkeley en Californie, et à l’époque le directeur de Inktomi, a réuni différents compromis dans son <a href="http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf">discours d’ouverture à la conférence PODC</a> (<em>Principles of Distributed Computing</em>) en 2000.<sup>1</sup> Il a présenté le théorème CAP, qui dit que sur les trois propriétés des systèmes de données partagées – la cohérence des données, la disponibilité du système et la tolérance au partitionnement du réseau – seules deux peuvent être garanties à un moment donné. Une confirmation plus formelle se trouve dans un article publié en 2002 par <a href="http://portal.acm.org/citation.cfm?doid=564585.564601">Seth Gilbert et Nancy Lynch</a>.<sup>4</sup></p>
<p>Un système qui n’est pas tolérant aux partitionnements du réseau peut obtenir la cohérence et la disponibilité des données et le réalise souvent via l’utilisation des protocoles de transaction. Afin d’y parvenir, les systèmes client et de stockage doivent faire partie du même environnement : ils échouent comme un ensemble sous certains scénarios, et à ce titre, les clients ne peuvent observer des partitions. Une observation importante est que dans des systèmes distribués à plus grande échelle, les partitionnements du réseau sont un fait ; ainsi, la cohérence et la disponibilité ne peuvent être obtenues en même temps. Cela veut dire qu’il y a deux choix concernant ce que l’on peut laisser tomber : relâcher la cohérence permettra au système de rester hautement disponible sous les conditions du partitionnement, tandis que privilégier la cohérence veut dire que, sous certaines conditions, le système ne sera pas disponible.</p>
<p>Toutes les deux options exigent que le développeur client soit au courant de ce qu&#8217;offre le système. Si le système accentue la cohérence, le développeur doit tenir compte du fait que le système pourrait ne pas être disponible pour accepter par exemple une écriture. Si cette écriture échoue à cause de l’indisponibilité du système, alors le développeur devra décider ce qu’il faut faire des données qui restent à écrire. Si le système souligne la disponibilité, il pourra toujours accepter l’écriture, mais sous certaines conditions une lecture ne reflétera pas le résultat d’une écriture récemment complétée. Le développeur doit décider alors si le client a besoin d’accéder à la toute dernière mise à jour tout le temps. Il existe une gamme d&#8217;applications qui gèrent bien des données légèrement périmées, et elles sont bien desservies sous ce modèle.</p>
<p>En principe, la propriété de cohérence des systèmes de transactions telle que définie par les propriétés <a href="http://en.wikipedia.org/wiki/ACID">ACID</a> (atomicité, cohérence, isolation, durabilité) est une sorte de garantie de cohérence différente. En ACID, la cohérence se rapporte à la garantie que quand une transaction est terminée, la base de données est dans un état cohérent ; par exemple, lors du transfert d&#8217;argent d&#8217;un compte à un autre, le montant total contenu dans les deux comptes ne devra pas changer. Dans des systèmes basés sur ACID, ce genre de cohérence est souvent la responsabilité du développeur qui écrit la transaction mais elle peut être appuyée par la gestion des contraintes d’intégrité par la base de données.</p>
<p><strong>La Cohérence - Client et Serveur</strong></p>
<p>Il existe deux perspectives sur la cohérence. L’une du point de vue développeur<em>/</em>client : comment ils observent les mises à jour des données. L’autre du côté du serveur : comment les mises à jour circulent dans le système et quelles garanties peuvent donner les systèmes concernant les mises à jour.</p>
<p><strong>La Cohérence Client </strong></p>
<p>La cohérence client comporte les éléments suivants :</p>
<ul>
<li><strong>Un système de stockage.</strong> Pour l’instant on peut le considérer comme une simple      boîte noire, mais on devrait supposer que, sous son couvercle, il y a quelque chose à grande échelle et hautement distribué, et qu’il a été construit afin de garantir la durabilité et la disponibilité.</li>
<li><strong>Le processus A.</strong> C’est un processus qui effectue les écritures sur et les lectures à      partir du système de stockage.</li>
<li><strong>Les processus B et C.</strong> Ces deux processus sont indépendants du processus A, et      ils effectuent des écritures sur et des lectures à partir du système de stockage. C’est sans importance si      ce sont réellement des processus, ou plutôt des threads au sein du même processus ; ce qui compte est qu&#8217;ils sont indépendants et qu’ils doivent communiquer afin de partager des informations.<br />
La cohérence côté client concerne comment et quand des observateurs (en l’occurrence les processus A, B, ou C) voient les mises à jour effectuées sur un objet de données dans les systèmes de stockage. Dans les exemples suivants qui illustrent les différents types de cohérence, le processus A a effectué une mise à jour sur un objet de données :</li>
<li><strong>La cohérence forte.</strong> Après que la mise à jour soit terminée, tout accès suivant      (par A, B, ou C) renverra la valeur actualisée.</li>
<li><strong>La cohérence faible.</strong> Le système ne garantit pas que les accès ultérieurs renverront la valeur actualisée. Un certain nombre de conditions doivent être respectées avant que la valeur ne soit renvoyée. La période entre la mise à jour et l’instant où il est garanti que tout observateur verra toujours la valeur actualisée se nomme <em>la fenêtre d’incohérence.</em></li>
<li><strong>La cohérence à terme.</strong> C’est une forme spécifique de cohérence faible ; le      système de stockage garantit que si aucune nouvelle mise à jour n’est effectuée sur l&#8217;objet, tous les accès finiront par renvoyer la dernière valeur actualisée.  Si aucun échec ne se produit, la taille maximale de la fenêtre d’incohérence peut être établie sur la base d&#8217;éléments tels les délais de communication, la charge sur le système et le nombre de répliques concernés par le schéma de réplication. Le système le plus répandu qui      implémente la cohérence à terme est le DNS (<em>Domain Name System</em>). Les mises à jour d’un nom sont distribuées selon un modèle configuré et en association avec des caches à expiration; à terme, tous les clients finiront par voir la mise à jour.</li>
</ul>
<p>Le modèle de cohérence à terme a un nombre de variations qu’il est important de considérer:</p>
<ul>
<li><strong>La cohérence causale <em>(causal consistency)</em>.</strong> Si le processus A a communiqué au processus B qu’il a mis à jour un objet de données, un accès ultérieur par le processus B renverra la valeur actualisée, et une écriture est garantie de remplacer l&#8217;écriture antérieure. Un accès via le processus C qui n’a pas de relation causale avec le processus A est sujet aux règles de cohérence à terme normales.</li>
<li><strong>La cohérence « lecture de vos écritures » (<em>read-your-writes consistency</em>).</strong> C’est un modèle important où le processus A, après qu’il a mis à jour un objet de données,      accède toujours à la valeur actualisée et ne verra jamais une valeur antérieure. C&#8217;est un cas particulier du modèle de cohérence causale.</li>
<li><strong>La cohérence par session (<em>session consistency</em>).</strong> Ceci est une version pratique du modèle précédent, où un processus accède au système de stockage dans le cadre d’une session. Tant que la session existe, le système garantit la cohérence « lecture de vos écritures ». Si la session se termine à cause d’un scénario d&#8217;échec quelconque, une nouvelle session doit être créée, et les garanties ne recouvrent pas les sessions.</li>
<li><strong>La cohérence monotonique en lecture.</strong> Si un processus a vu une valeur      particulière pour l’objet, tout accès ultérieur ne renverra jamais une valeur antérieure.</li>
<li><strong>La cohérence monotonique en écriture.</strong> Dans ce cas, le système garantit de      sérialiser les écritures par le même processus. Les systèmes qui ne garantissent pas ce niveau de cohérence sont notoirement difficiles à programmer.</li>
</ul>
<p>Un certain nombre de ces propriétés peuvent être associées les unes aux autres. Par exemple, on peut obtenir des lectures monotoniques associées à la cohérence par session. D’un point de vue pratique, ces deux propriétés (lectures monotoniques et « lecture de vos écritures ») sont tout à fait souhaitables dans un système de cohérence à terme, mais pas toujours exigées. Ces deux propriétés rendent plus simple pour les développeurs de construire des applications, tout en permettant au système de stockage de relâcher la cohérence et fournir une haute disponibilité.</p>
<p>Comme vous le voyez dans ces variations, un assez grand nombre de scénarios sont possibles. Tout dépend des applications spécifiques, si l’on peut gérer les conséquences ou non.</p>
<p>La cohérence à terme n’est pas une sorte de propriété ésotérique des systèmes distribués extrêmes. Beaucoup de RDBMSs (relational database management systems &#8211; systèmes de gestion de bases de données relationnelles) modernes qui fournissent de la fiabilité au niveau du backup principal implémentent leurs techniques de réplication tant en mode synchrone qu’asynchrone.  En mode synchrone, la mise à jour de la réplique fait partie de la transaction. En mode asynchrone, les mises à jour arrivent au backup de manière différée, souvent par l’exportation du log. En ce dernier mode, si le principal échoue avant l’exportation des logs, la lecture du backup promu produira des valeurs anciennes et incohérentes. Aussi, afin de supporter une meilleure performance scalable en lecture, les RDBMSs ont commencé à fournir la possibilité de lire à partir du backup, ce qui est un cas classique de fourniture de garanties de cohérence à terme dans lesquelles les fenêtres d’incohérence dépendent de la périodicité de l’exportation des logs.</p>
<p><strong>La Cohérence Serveur </strong></p>
<p>Pour la cohérence serveur, il nous faut regarder de plus près comment les mises à jour circulent dans le système afin de comprendre ce qui pilote les différents modes que peut rencontrer le développeur qui utilise le système. Etablissons d’abord quelques définitions avant de commencer :</p>
<p>N = le nombre de nœuds qui stockent les répliques des données</p>
<p>W = le nombre de répliques qui doivent accuser réception de la mise à jour avant que celle-ci ne soit complétée</p>
<p>R = le nombre de répliques qui sont contactées quand un objet de données est consulté via une opération de lecture</p>
<p>Si W+R &gt; N, alors le jeu d’écritures et le jeu de lectures se recouvrent toujours et l’on peut garantir une cohérence forte. Dans le scénario de backup principal de RDBMS qui implémente de la réplication synchrone, N=2, W=2 et R=1. Qu’importe la réplique à partir de laquelle lit le client, il recevra toujours une réponse cohérente. Dans la réplication asynchrone quand la lecture du backup est activée, N=2, W=1 et R=1. Dans ce cas R+W=N et la cohérence ne peut être garantie.</p>
<p>Le problème de ces configurations, qui sont des protocoles de quorum de base, est que quand le système ne peut écrire sur les W nœuds à cause des échecs, l’opération d’écriture échoue obligatoirement, ce qui marque l’indisponibilité du système. Quand N=3 et W=3 et seulement deux nœuds sont disponibles, le système sera obligé de mettre l&#8217;écriture en échec.</p>
<p>Dans les systèmes de stockage distribué qui doivent fournir de la haute performance ainsi que de la haute disponibilité, le nombre de répliques est en général supérieur à deux. Les systèmes qui se focalisent uniquement sur la tolérance à la panne utilisent souvent N=3 (avec des  configurations W=2 et R=2). Les systèmes qui doivent servir des charges en lecture très élevées répliquent souvent leurs données au-delà de ce qui est requis pour la tolérance à la panne ; N peut être des dizaines, voire des centaines de nœuds, avec R configuré à 1, de telle sorte qu’une seule lecture renverra un résultat. Les systèmes qui s’occupent de la cohérence sont configurés à W=N pour les mises à jour, ce qui peut diminuer la probabilité de la réussite de l’écriture. Une configuration courante pour ces systèmes-là qui sont concernés par la tolérance à la panne mais pas par la cohérence, est d&#8217;utiliser W=1 afin d&#8217;obtenir la durabilité minimale de la mise à jour et ensuite de s’appuyer sur une technique de propagation épidémique dans le but de mettre à jour les autres répliques.</p>
<p>Comment configurer N, W et R dépend de ce qu’est le cas courant et de quel chemin de performance doit d’être optimisé. En R=1 et N=W nous optimisons pour le cas de la lecture, et en W=1 et R=N nous optimisons pour une écriture très rapide. Bien sûr, dans ce dernier, la durabilité n’est pas garantie en la présence d’échecs, et si W &lt; (N+1)/2, il y a la possibilité d’écritures contradictoires quand les jeux d’écritures ne se recouvrent pas.</p>
<p>La cohérence faible/à terme se produit quand W+R &lt;= N, ce qui signifie qu’il y a la possibilité que les jeux en lecture et en écriture ne se recouvriront pas. Si c’est une configuration délibérée et non basée sur un cas d’échec, alors ça n&#8217;a aucun sens de régler R autrement que sur 1.  Il existe deux cas très fréquents où cela se produit : le premier est la réplication à grande échelle pour le scaling en lecture mentionné plus haut ; le second se produit quand l’accès aux données est plus compliqué. Dans un modèle clé-valeur simple, il est facile de comparer des versions afin de déterminer la dernière valeur écrite sur le système, mais dans des systèmes qui renvoient des jeux d’objets, il est plus difficile de déterminer correctement le dernier jeu. Dans la plupart de ces systèmes où le jeu en écriture est plus petit que le jeu de répliques, un mécanisme est en place qui applique les mises à jour aux nœuds restants dans le jeu de répliques via une technique de propagation épidémique (<em>lazy</em>). La période jusqu’à ce que toutes les répliques soient mises à jour s’appelle la fenêtre d’incohérence, comme je l’ai évoquée plus haut. Si W+R &lt;= N, alors le système est vulnérable à la lecture à partir de nœuds qui n&#8217;ont pas encore reçu les mises à jour.</p>
<p>Que les cohérences &laquo;&nbsp;lecture de vos écritures&nbsp;&raquo; (<em>read-your-writes</em>), session et monotonique peuvent être obtenues ou pas, dépend en général de l&#8217;association (<em>stickiness</em>) des clients au serveur qui exécute le protocole distribué pour eux. S’il s’agit du même serveur à chaque fois, il est alors relativement facile de garantir la « lecture de vos écritures » et les lectures monotoniques. Cela rend un peu plus difficile l’équilibrage de charges et la tolérance à la panne, mais c’est une solution simple. L’utilisation de sessions, qui ont de l’affinité (<em>sticky</em>), rend cela explicite et fournit un niveau d’exposition sur lequel les clients peuvent raisonner.</p>
<p>Parfois le client implémente la « lecture de vos écritures » et les lectures monotoniques. En rajoutant des versions aux écritures, le client rejette les lectures de valeurs ayant des versions qui précèdent la version vue en dernier.</p>
<p>Les partitions se produisent quand certains nœuds ne peuvent atteindre d’autres dans le système, mais tous les deux jeux de nœuds sont accessibles par des groupes de clients. Si vous utilisez une approche de type quorum majoritaire classique, alors la partition qui a W nœuds du jeu de répliques peut continuer à prendre des mises à jour pendant que l’autre partition devient indisponible. C&#8217;est également vrai pour le jeu en lecture. Etant donné que ces deux jeux se recouvrent, le jeu minoritaire devient par définition indisponible. Les partitions ne se produisent pas fréquemment, mais ils peuvent s’effectuer entre les datacenters, aussi bien que au sein des datacenters.</p>
<p>Dans certaines applications l’indisponibilité de toute partition est inadmissible, et il est important que les clients qui peuvent accéder à cette partition puissent avancer. Dans ce cas les deux côtés attribuent un nouveau jeu de nœuds de stockage pour recevoir les données, et une opération de fusion est exécutée quand la partition est réparée. Par exemple, chez Amazon, le panier de courses utilise un tel système de <em>write-always</em> (d&#8217;écriture permanente) ; dans le cas d&#8217;une partition, un client peut continuer d’ajouter des articles dans son panier même si le panier d’origine existe toujours dans d’autres partitions. L’application de gestion de panier aide le système de stockage à fusionner les paniers une fois la partition réparée.</p>
<p><strong>Dynamo de Amazon </strong></p>
<p>Un système qui a réuni toutes ces propriétés sous le contrôle explicite de l’architecture de l’application est <a title="All Things Distributed, Amazon's Dynamo" href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html">Dynamo de Amazon</a>, un système de stockage clé-valeur qui est utilisé en interne dans plusieurs services qui constituent la plateforme <em>e-commerce</em> (commerce électronique) d’Amazon, ainsi que dans les Amazon&#8217;s Web Services. Un des objectifs de conception de Dynamo est de permettre au propriétaire du service de l&#8217;application qui crée une instance du système de stockage Dynamo &#8211; qui s’étend fréquemment sur de multiples datacenters &#8211; de faire lui-même le compromis entre la cohérence, la durabilité, la disponibilité et la performance, tout en restant à un certain seuil de coût.<sup>3</sup></p>
<p><strong>Conclusion</strong></p>
<p>Il existe deux raisons de tolérer l’incohérence des données dans des systèmes distribués fiables à grande échelle : l’amélioration de la performance en lecture et en écriture dans des conditions hautement concomitantes, et la gestion des cas de partitionnement où un modèle basé sur la majorité rendrait une partie du système indisponible bien que les nœuds soient opérationnels.</p>
<p>Que les incohérences soient admissibles ou non dépend de l’application client. Dans tous les cas le développeur doit savoir que les garanties de cohérence sont fournies par les systèmes de stockage et doivent être prises en compte lorsqu’on développe les applications. Il y a plusieurs améliorations pratiques que l’on peut faire au modèle de cohérence à terme, comme par exemple la cohérence par session<em> </em>et les lectures monotoniques, qui fournissent de meilleurs outils pour le développeur. Très souvent l’application est capable de gérer les garanties de cohérence à terme du système de stockage sans problème. Un cas précis fréquent est un site Web sur lequel on a la notion de la cohérence perçue par l’utilisateur. Dans ce scénario, la fenêtre d’incohérence doit être inférieure au temps estimé avant le retour du client pour le chargement de la page suivante. Ceci permet aux mises à jour de se propager dans le système avant que la lecture suivante ne soit prévue.</p>
<p>Le but de cet article est de sensibiliser le lecteur à la complexité des systèmes d’ingénierie qui doivent opérer à échelle globale et qui exigent un tuning méticuleux afin d’assurer la durabilité, la disponibilité et la performance exigées par leurs applications. L’un des outils du concepteur de systèmes est la durée de la fenêtre d&#8217;incohérence, pendant laquelle les clients des systèmes sont potentiellement exposés aux réalités de l’ingénierie des systèmes à grande échelle.</p>
<p><strong><em>Werner Vogels</em> <a href="http://www.allthingsdistributed.com/">@allthingsdistributed.com</a></strong></p>
<p><em>Source : <a href="http://www.allthingsdistributed.com/2008/12/eventually_consistent.html">Eventually Consistent &#8211; Revisited</a><br />
Traduction : <a href="http://www.proz.com/profile/1185931">Helen CHAUVEAU</a>, <a href="http://twitter.com/fredericfaure">Frédéric FAURE</a></em></p>
<p><em>References :</em></p>
<ol style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 30px; list-style-type: decimal; list-style-position: outside; list-style-image: initial; background-repeat: no-repeat repeat; padding: 0px;">
<li style="padding: 0px; margin: 0px;">Brewer, E. A. 2000. <a style="text-decoration: underline; outline-style: none; outline-width: initial; outline-color: initial; color: #ab0404;" href="http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf">Towards robust distributed systems (abstract)</a>. In <em>Proceedings of the 19th Annual ACM Symposium on Principles of Distributed Computing</em> (July 16-19, Portland, Oregon): 7</li>
<li style="padding: 0px; margin: 0px;"><a style="text-decoration: underline; outline-style: none; outline-width: initial; outline-color: initial; color: #ab0404;" href="http://acmqueue.com/modules.php?name=Content&amp;pa=showpage&amp;pid=233">A Conversation with Bruce Lindsay.</a> 2004. ACM Queue 2(8): 22-33.</li>
<li style="padding: 0px; margin: 0px;">DeCandia, G., Hastorun, D., Jampani, M., Kakulapati, G., Lakshman, A., Pilchin, A., Sivasubramanian, S., Vosshall, P., Vogels, W. 2007. <a style="text-decoration: underline; outline-style: none; outline-width: initial; outline-color: initial; color: #ab0404;" href="http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html">Dynamo: Amazon&#8217;s highly available key-value store</a>. In Proceedings of the 21st ACM <em>Symposium on Operating Systems Principles</em> (Stevenson, Washington, October).</li>
<li style="padding: 0px; margin: 0px;">Gilbert , S., Lynch, N. 2002. <a style="text-decoration: underline; outline-style: none; outline-width: initial; outline-color: initial; color: #ab0404;" href="http://portal.acm.org/citation.cfm?doid=564585.564601">Brewer&#8217;s conjecture and the feasibility of consistent, available, partition-tolerant Web services</a>. ACM SIGACT News 33(2).</li>
<li style="padding: 0px; margin: 0px;">Lindsay, B. G., Selinger, P. G., et al. 1980. Notes on distributed databases. In <em>Distributed Data Bases, ed. I</em>. W. Draffan and F. Poole, 247-284. Cambridge: Cambridge University Press. Also available as IBM Research Report RJ2517, San Jose, California (July 1979).</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2011/04/finalement-coherent-revisite/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Comparatif outils de monitoring (métrologie et supervision) (2/2) : Zabbix, Centreon, Nagios, Cacti et Munin</title>
		<link>http://decrypt.ysance.com/2011/02/comparatif-outils-monitoring-metrologie-supervision-2-zabbix-centreon-nagios-cacti-munin/</link>
		<comments>http://decrypt.ysance.com/2011/02/comparatif-outils-monitoring-metrologie-supervision-2-zabbix-centreon-nagios-cacti-munin/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 08:26:03 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Monitoring]]></category>
		<category><![CDATA[Cacti]]></category>
		<category><![CDATA[Centreon]]></category>
		<category><![CDATA[Métrologie]]></category>
		<category><![CDATA[Munin]]></category>
		<category><![CDATA[Nagios]]></category>
		<category><![CDATA[Supervision]]></category>
		<category><![CDATA[Zabbix]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=1881</guid>
		<description><![CDATA[Voici la suite de l'<a title="Site de Decrypt, Comparatif outils de monitoring (métrologie et supervision) (1/2) : Zabbix, Centreon, Nagios, Cacti et Munin" href="http://decrypt.ysance.com/2011/02/comparatif-outils-monitoring-metrologie-supervision-1-zabbix-centreon-nagios-cacti-munin/">article</a> présentant les hypothèses de notre comparatif ainsi qu'un bref descriptif de chacun des outils comparés. Je vais maintenant établir une matrice contenant les éléments principaux de décision, selon mon expérience, afin de comparer les outils proposés et d'évaluer la réponse qu'ils apportent sur chacun de ces critères. Pour rappel, les candidats sont des outils opensource gratuits : <a title="Site de Zabbix" href="http://www.zabbix.com/">Zabbix</a>, <a title="Site de Centreon" href="http://www.centreon.com/">Centreon</a>, <a title="Site de Nagios" href="http://www.nagios.org/">Nagios</a>, <a title="Site de Cacti" href="http://www.cacti.net/">Cacti</a> et <a title="Site de Munin" href="http://munin-monitoring.org/">Munin</a>.

[...]
]]></description>
			<content:encoded><![CDATA[<p>Voici la suite de l&#8217;<a title="Site de Decrypt, Comparatif outils de monitoring (métrologie et supervision) (1/2) : Zabbix, Centreon, Nagios, Cacti et Munin" href="http://decrypt.ysance.com/2011/02/comparatif-outils-monitoring-metrologie-supervision-1-zabbix-centreon-nagios-cacti-munin/">article</a> présentant les hypothèses de notre comparatif ainsi qu&#8217;un bref descriptif de chacun des outils comparés. Je vais maintenant établir une matrice contenant les éléments principaux de décision, selon mon expérience, afin de comparer les outils proposés et d&#8217;évaluer la réponse qu&#8217;ils apportent sur chacun de ces critères. Pour rappel, les candidats sont des outils opensource gratuits : <a title="Site de Zabbix" href="http://www.zabbix.com/">Zabbix</a>, <a title="Site de Centreon" href="http://www.centreon.com/">Centreon</a>, <a title="Site de Nagios" href="http://www.nagios.org/">Nagios</a>, <a title="Site de Cacti" href="http://www.cacti.net/">Cacti</a> et <a title="Site de Munin" href="http://munin-monitoring.org/">Munin</a>.</p>
<p><em><strong>Fromage ou Dessert ?</strong></em><br />
Métrologie ou Supervision ? C&#8217;est la grande question. Il faut bien évidemment que les 2 composants du monitoring soient présents pour assurer le bien-être de votre infrastructure. Cependant, il n&#8217;est pas toujours évident de savoir dans quel domaine l&#8217;outil assure le service ou bien si il assure les 2. Le schéma ci-dessous indique à quel(s) groupe(s) appartiennent les outils étudiés.</p>
<div id="attachment_1880" class="wp-caption alignnone" style="width: 696px"><img class="size-full wp-image-1880" title="Supervision ou/et Métrologie ?" src="http://decrypt.ysance.com/wp-content/uploads/2011/01/Supervision-Metrologie.png" alt="Supervision ou/et Métrologie ?" width="686" height="318" /><p class="wp-caption-text">Supervision ou/et Métrologie ?</p></div>
<p><strong><em>La Matrice&#8230; Enfin ! :o)</em></strong><br />
La réponse n&#8217;est pas 42, rassurez-vous. Vous trouverez-ci dessous les éléments de décision qui permettront de choisir tel ou tel outil pour votre infrastructure.</p>
<div id="attachment_1966" class="wp-caption alignnone" style="width: 1138px"><img class="size-full wp-image-1966" title="Matrice - Outils Monitoring" src="http://decrypt.ysance.com/wp-content/uploads/2011/01/Matrice-Outils-Monitoring.png" alt="Matrice - Outils Monitoring" width="1128" height="900" /><p class="wp-caption-text">Matrice - Outils Monitoring</p></div>
<p><strong>Les + / -</strong><br />
Si je devais retenir un point positif et un axe d&#8217;amélioration pour chaque outil qui me feraient pencher pour son utilisation ou non en production, ce seraient ceux là :</p>
<p><span style="text-decoration: underline;"><em>Munin</em></span><br />
<span style="color: #008000;"><strong>+ : </strong></span>Sa configuration très simple sous forme de fichiers de configuration et de liens symboliques, en font un candidat idéal pour un gestionnaire de configuration centralisé comme Puppet et pour de l&#8217;automatisation.<br />
<span style="color: #ff0000;"><strong>- : </strong></span>L&#8217;absence actuelle sur ses graphiques d&#8217;une fonctionnalité de zoom et de time frame glissante rend son utilisation très difficile pour de la production.</p>
<p><em><span style="text-decoration: underline;">Nagios</span></em><br />
<span style="color: #008000;"><strong>+ : </strong></span>Sa configuration sous forme de fichiers, qui peut être assez vite repoussante, en fait cependant un candidat idéal à la &laquo;&nbsp;pupettisation&nbsp;&raquo; et à l&#8217;automatisation. Au delà de cela, c&#8217;est, on peut le dire, un outil complet qui a fait ses preuves.<br />
<span style="color: #ff0000;"><strong>- : </strong></span>L&#8217;IHM&#8230; Il ne faut pas négliger cet aspect, car une information mise en forme &laquo;&nbsp;avec goût&nbsp;&raquo; aide aussi à sa compréhension et son interprétation. La forme est importante au delà de la pertinence de l&#8217;information.</p>
<p><em><span style="text-decoration: underline;">Cacti</span></em><br />
<span style="color: #008000;"><strong>+ : </strong></span>Un outil de métrologie complet avec pas mal de fonctionnalités (Thold, Weathermap, &#8230;) apportées au travers de sa <em>Plugin Architecture</em>. La variété et les possibilités de ses tempates complexes sont aussi un atout non négligeable.<br />
<span style="color: #ff0000;"><strong>- : </strong></span>La création de ses templates peut s&#8217;avérer un peu complexe au premier abord avec les différentes couches (Data Queries, Data Input Method, Data Templates, Graph Templates, Host Templates, &#8230;). Un autre point quelque peu embêtant est le manque d&#8217;homogénéité dans la configuration de ses templates (casse-tête pour l&#8217;automatisation).</p>
<p><em><span style="text-decoration: underline;">Centreon</span></em><br />
<span style="color: #008000;"><strong>+ : </strong></span>Une IHM agréable et intuitive. Les notions proposées permettent une prise en main intuitive et les templates (hosts, services, commandes, &#8230;) sont pratiques et simples à mettre en place.<br />
<span style="color: #ff0000;"><strong>- : </strong></span>Les graphiques se contentent de tracer les données de performance remontées par Nagios sans offrir la possibilité de les mettre en relation et de les travailler afin d&#8217;obtenir des graphes orientés &laquo;&nbsp;logiciel/métier&nbsp;&raquo; comme des graphes résumant l&#8217;utilisation d&#8217;un Apache ou d&#8217;un MySQL (par exemple).</p>
<p><em><span style="text-decoration: underline;">Zabbix</span></em><br />
<span style="color: #008000;"><strong>+ : </strong></span>Un outil complet autant au niveau de la métrologie que de la supervision qui se suffit à lui-même pour monitorer de manière exhaustive une infrastructure. Les fonctionnalités très avancées permettent de gérer pratiquement tous les cas.<br />
<span style="color: #ff0000;"><strong>- : </strong></span>Un manque de lisibilité de certains écrans (comme celui des déclencheurs par exemple) et de leurs enchaînements et des notions qui manquent parfois de prise en main intuitive. L&#8217;interface Web fait également un peu &laquo;&nbsp;vieillote&nbsp;&raquo;.</p>
<p><strong><em>Conclusion</em></strong><br />
Il n&#8217;y a pas de mauvaise solution, certaines seront simplement plus adaptées à ce que vous voulez en faire. Voici quelques possibilités afin d&#8217;obtenir un monitoring complet de votre infrastructure :</p>
<ul>
<li>Si vous voulez privilégier l&#8217;automatisation et la gestion centralisée des configurations de votre infrastructure (Cf. Puppet), pensez <strong>Munin-Nagios</strong> (vous aurez alors accès dans ce cas à 2 IHMs Web pour monitorer votre infrastructure), the &laquo;&nbsp;Double tap&nbsp;&raquo;, the &laquo;&nbsp;Buddy system&nbsp;&raquo; du monitoring ! :o) Pas besoin d&#8217;accéder à des APIs plus ou moins avancées (comme pour leur camarades) pour ajouter/supprimer un host et associer les services à monitorer, tout est sous forme de fichiers de configuration et de symlinks. A noter que Munin n&#8217;exploitera pas les données de performances de Nagios mais celles de ses propres sondes et que la grosse lacune de Munin est l&#8217;absence actuelle sur ses graphiques d&#8217;une fonctionnalité de zoom et de time frame glissante qui rend son utilisation très difficile pour de la production.</li>
<li>Si vous privilégiez une métrologie avancée donnant accès à des possibilités de supervision, pensez <strong>Cacti</strong> avec sa <em>Plugin Architecture</em> (assortie avec <em>Thold</em> par exemple). Prenez un peu de temps pour comprendre les notions utilisées pour créer les templates de graphes et créez vos propres graphes complexes ! Vous pourrez ensuite utilisez leurs métriques et la connaissance que vous aurez acquis dessus pour lever des alertes via <em>Thold</em>.</li>
<li>Si vous privilégiez une supervision complète avec des possibilités de métrologie simple, <strong>Centreon</strong> est fait pour vous ! Surcouche de Nagios proposant un générateur de configuration, l&#8217;exploitation des données de performances de Nagios via RRDTool, du reporting agréable sur le statut de votre infrastructure, la possibilité de gérer une architecture distribuée de Nagios via son daemon CentCore qui se connecte sur les Nagios remote en SSH, &#8230; Centreon propose un pilotage de Nagios via une interface Web agréable et intuitive et une gestion de templates de hosts, services, commandes, &#8230; très pratique.</li>
<li>Si vous êtes sans concessions, <strong>Zabbix</strong> vous offre une interface unifiée vous proposant aussi bien de superviser votre infrastructure avec des notions très avancées (mesures, déclencheurs, actions conditionnelles complexes, escalade, scénarii HTTP, &#8230;) que de travailler la partie métrologie avec la possibilité de créer des graphes complexes avec les mesures récupérées. A noter qu&#8217;au delà de l&#8217;aspect séduisant du &laquo;&nbsp;No Compromis&nbsp;&raquo;, la prise en main est moins intuitive qu&#8217;un Centreon, par exemple, avec une IHM moins agréable et proposant parfois des enchaînements d&#8217;écrans un peu confus à mon sens.</li>
</ul>
<p>Comme précisé dans la première partie de cet article, il est important de noter que je n&#8217;ai pas bien sûr pu tester les dernières versions de chaque outil, puisqu&#8217;il s&#8217;agit de retours d&#8217;expérience (sur plus de 2 ans) sur des environnements de production et qu&#8217;on n&#8217;en met pas un en place toutes les semaines ! ;ob Je suis donc ouvert à vos remarques sur les évolutions que vous aurez constatées sur vos outils favoris ou bien sur les éléments de décision que vous mettriez en plus dans la balance pour effectuer votre choix.</p>
<p><em><strong>Frédéric FAURE</strong></em> <a title="Frédéric FAURE @Twitter" href="http://twitter.com/fredericfaure">@Twitter</a> <a title="Ysance, Simplifions les projets informatiques" href="http://www.ysance.com/">@Ysance</a></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2011/02/comparatif-outils-monitoring-metrologie-supervision-2-zabbix-centreon-nagios-cacti-munin/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Comparatif outils de monitoring (métrologie et supervision) (1/2) : Zabbix, Centreon, Nagios, Cacti et Munin</title>
		<link>http://decrypt.ysance.com/2011/02/comparatif-outils-monitoring-metrologie-supervision-1-zabbix-centreon-nagios-cacti-munin/</link>
		<comments>http://decrypt.ysance.com/2011/02/comparatif-outils-monitoring-metrologie-supervision-1-zabbix-centreon-nagios-cacti-munin/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 08:24:50 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Monitoring]]></category>
		<category><![CDATA[Cacti]]></category>
		<category><![CDATA[Centreon]]></category>
		<category><![CDATA[Métrologie]]></category>
		<category><![CDATA[Munin]]></category>
		<category><![CDATA[Nagios]]></category>
		<category><![CDATA[Supervision]]></category>
		<category><![CDATA[Zabbix]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=1831</guid>
		<description><![CDATA[Cet article a pour objectif de comparer quelques solutions de monitoring (métrologie et supervision) que j'ai eues l'occasion d'intégrer dans des infrastructures de production. Les candidats sont des outils opensource gratuits et de grands classiques : <a title="Site de Zabbix" href="http://www.zabbix.com/">Zabbix</a>, <a title="Site de Centreon" href="http://www.centreon.com/">Centreon</a>, <a title="Site de Nagios" href="http://www.nagios.org/">Nagios</a>, <a title="Site de Cacti" href="http://www.cacti.net/">Cacti</a> et <a title="Site de Munin" href="http://munin-monitoring.org/">Munin</a>. Le but n'est pas de mettre en avant un produit en particulier, car il n'y a pas de mauvais choix dans la liste précitée, mais plutôt de vous fournir les éléments pour choisir celui qui vous conviendra le mieux dans votre cas d'utilisation. Le sujet sera en fait constitué de 2 articles : un premier va poser les hypothèses de cette comparaison et expliquer le fonctionnement de ces outils ou simplement les présenter afin de vous permettre de mieux aborder le comparatif. Le <a title="Site de Decrypt, Comparatif outils de monitoring (métrologie et supervision) (2/2) : Zabbix, Centreon, Nagios, Cacti et Munin" href="http://decrypt.ysance.com/2011/02/comparatif-outils-monitoring-metrologie-supervision-2-zabbix-centreon-nagios-cacti-munin/">second article</a> va synthétiser les éléments principaux de décision, selon mon expérience, dans un tableau afin de comparer les outils proposés et d'évaluer la réponse qu'ils apportent sur chacun de ces critères.

[...]
]]></description>
			<content:encoded><![CDATA[<p>Cet article a pour objectif de comparer quelques solutions de monitoring (métrologie et supervision) que j&#8217;ai eues l&#8217;occasion d&#8217;intégrer dans des infrastructures de production. Les candidats sont des outils opensource gratuits et de grands classiques : <a title="Site de Zabbix" href="http://www.zabbix.com/">Zabbix</a>, <a title="Site de Centreon" href="http://www.centreon.com/">Centreon</a>, <a title="Site de Nagios" href="http://www.nagios.org/">Nagios</a>, <a title="Site de Cacti" href="http://www.cacti.net/">Cacti</a> et <a title="Site de Munin" href="http://munin-monitoring.org/">Munin</a>. Le but n&#8217;est pas de mettre en avant un produit en particulier, car il n&#8217;y a pas de mauvais choix dans la liste précitée, mais plutôt de vous fournir les éléments pour choisir celui qui vous conviendra le mieux dans votre cas d&#8217;utilisation. Le sujet sera en fait constitué de 2 articles : un premier va poser les hypothèses de cette comparaison et expliquer le fonctionnement de ces outils ou simplement les présenter afin de vous permettre de mieux aborder le comparatif. Le <a title="Site de Decrypt, Comparatif outils de monitoring (métrologie et supervision) (2/2) : Zabbix, Centreon, Nagios, Cacti et Munin" href="http://decrypt.ysance.com/2011/02/comparatif-outils-monitoring-metrologie-supervision-2-zabbix-centreon-nagios-cacti-munin/">second article</a> va synthétiser les éléments principaux de décision, selon mon expérience, dans un tableau afin de comparer les outils proposés et d&#8217;évaluer la réponse qu&#8217;ils apportent sur chacun de ces critères.</p>
<p><strong><em>Monitoring = Métrologie + Supervision</em></strong><br />
Tout d&#8217;abord, un éclaircissement sur la sémantique utilisée est nécessaire afin que nous parlions bien tous de la même chose. Le <strong>monitoring</strong> est le terme global que l&#8217;on emploie afin de désigner le ou les outils qui vont nous permettre de suivre (monitorer) la vie de notre infrastructure. Le monitoring se décompose ensuite en 2 disciplines toutes aussi importantes l&#8217;une que l&#8217;autre et qu’il faut identifier :</p>
<ul>
<li>La <strong>supervision </strong>vérifie l’état d’un hôte ou d’un service et remonte une alerte sur la détection d’un comportement anormal (temps de réponse trop long, statut NOK, …) et implique une action immédiate de la part des interlocuteurs concernés. Une alerte doit signifier que l’hôte ou le service est inutilisable (critical) ou risque de l’être (warning) et ne pas renvoyer de « simples informations » qui pollueraient la visibilité des réels incidents.</li>
<li>La <strong>métrologie </strong>permet d’historiser les données, éventuellement d’appliquer un traitement ou filtre dessus, avant de les présenter sous forme de graphiques ou de reporting. Ces données permettent d’apporter un correctif à postériori au niveau développement ou paramétrage des services afin d’apporter une optimisation desdits services et également de définir les ressources à attribuer aux services au plus juste. Cet aspect du monitoring est tout aussi important car il va permettre d’améliorer le service et donc le rendu des utilisateurs (internes ou clients finaux) et également de lisser les coûts. Les résultats issus de la métrologie doivent mettre aisément en valeur les améliorations à apporter en corrélant les valeurs récupérées.</li>
</ul>
<p>Maintenant que cette hypothèse sémantique est posée nous allons pouvoir utiliser ces termes dans la suite de l&#8217;article.</p>
<p><strong><em>De l&#8217;évolution des outils</em></strong><br />
Il est important de préciser que je n&#8217;ai pas bien sûr pu tester les dernières versions de chaque outil, puisqu&#8217;il s&#8217;agit de retours d&#8217;expérience sur des environnements de production et qu&#8217;on n&#8217;en met pas un en place toutes les semaines ! ;ob Je n&#8217;ai pas non plus testé tous les plugins additionnels (par exemple ceux de Cacti) qui permettent d&#8217;ajouter des fonctionnalités à l&#8217;outil. C&#8217;est un retour d&#8217;expérience sur plus de 2 ans et, pour donner un ordre d&#8217;idée, les outils sur lesquels j&#8217;ai travaillé le moins récemment sont Cacti et Nagios, il y a environ 1 an.</p>
<p>Il y aura donc peut-être eu des mises à jours par rapports aux éléments que je cite, donc n&#8217;hésitez pas à me faire un retour sur le sujet via les commentaires si j&#8217;ai omis un nouvelle fonctionnalité importante qui est apparue récemment.</p>
<p><strong><em>Centreon, une interface à Nagios</em></strong><br />
Avant d&#8217;entamer le coeur du sujet, à savoir le comparatif des outils, il est nécessaire de donner une explication sur le fonctionnement de Centreon et de son rapport à Nagios car, ne soyez pas choqués, le coeur de Centreon est basé sur Nagios. Oh le fourbe ! :o)</p>
<p><strong><a title="Site de Nagios" href="http://www.nagios.org/">Nagios</a> </strong>est un ordonnanceur qui va organiser (ordonnancer) les tests de supervision, appelés contrôles, sur les différents hosts et services cibles et agréger les résultats pour les mettre à disposition via une interface web en lecture seule. Nagios permet aussi de remonter des données de performance (via ses plugins) qu&#8217;il stocke dans un énorme fichier plat et qui est, par conséquent, inexploitable en l&#8217;état. Pour préciser la remontée de ces informations, chaque résultat de contrôle renvoyé par un plugin peut être suffixé d&#8217;un | (pipe) derrière lequel les données de performances dans un format &laquo;&nbsp;clé=valeur&nbsp;&raquo; sont ajoutées. Les données &laquo;&nbsp;post pipe&nbsp;&raquo; sont simplement extraites et stockées dans ledit fichier. Voici un exemple de données de performance issues d&#8217;un plugin (<span style="color: #ff0000;">en rouge</span>) :</p>
<blockquote><p>PING ok &#8211; Packet loss = 0%, RTA = 0.80 ms | <span style="color: #ff0000;">percent_packet_loss=0, rta=0.80</span></p></blockquote>
<p>De plus, toute la configuration de Nagios s&#8217;effectue directement dans les fichiers de configuration &laquo;&nbsp;à la main&nbsp;&raquo;, ce qui peut devenir un peu complexe sur des infrastructures de taille respectable.</p>
<p>C&#8217;est sur ce constat que vient se greffer <strong><a title="Site de Centreon" href="http://www.centreon.com/">Centreon</a> </strong>en proposant une interface web différente de celle de Nagios et ajoute ainsi les fonctionnalités suivantes :</p>
<ul>
<li>Génération via IHM de la configuration potentiellement complexe de Nagios en mettant notamment à disposition des notions de templates d&#8217;hosts, de services, de commandes, &#8230; avec des possibilités d&#8217;héritages multiples.</li>
<li>Stockage et exploitation (graphique) des données de performance (métrologie) de Nagios via l’outil open source <a title="Site de RRDtool" href="http://oss.oetiker.ch/rrdtool/">RRDtool</a>.</li>
<li>Reporting plus lisible sur l&#8217;état des hosts et des services de l&#8217;infrastructure sur différentes périodes : pratique pour avoir une visibilité globale de la qualité de son infrastructure dans le temps et pratique pour fournir des rapports visuels dans le cadre de SLAs.</li>
<li>Une interface ergonomique de visualisation de l&#8217;état des hosts et des services (je la trouve plus agréable que celle de Nagios qui fournit de base cette fonctionnalité sur sa propre IHM web).</li>
<li>La possibilité de piloter plusieurs Nagios distribués et d&#8217;agréger leurs données : cela peut être utile sur de grosses infrastructures segmentées. Il est donc à noter qu&#8217;il est possible d&#8217;installer des Nagios autonomes sur des machines différentes de celle du Centreon qui collectera les données (via CentCore).</li>
</ul>
<p>Voici quelques captures d&#8217;écran de Centreon :</p>
<div id="attachment_1842" class="wp-caption alignnone" style="width: 464px"><a href="http://decrypt.ysance.com/wp-content/uploads/2010/12/Centreon-Configuration-Nagios-nagios.cfg-2.jpg"><img class="size-full wp-image-1842  " title="Centreon - Configuration - Nagios - nagios.cfg" src="http://decrypt.ysance.com/wp-content/uploads/2010/12/Centreon-Configuration-Nagios-nagios.cfg-2.jpg" alt="Centreon - Configuration - Nagios - nagios.cfg" width="454" height="212" /></a><p class="wp-caption-text">Centreon - Configuration - Nagios - nagios.cfg</p></div>
<div id="attachment_1843" class="wp-caption alignnone" style="width: 462px"><a href="http://decrypt.ysance.com/wp-content/uploads/2010/12/Centreon-Monitoring-Services-AllServices-2.jpg"><img class="size-full wp-image-1843  " title="Centreon - Monitoring - Services - AllServices" src="http://decrypt.ysance.com/wp-content/uploads/2010/12/Centreon-Monitoring-Services-AllServices-2.jpg" alt="Centreon - Monitoring - Services - AllServices" width="452" height="214" /></a><p class="wp-caption-text">Centreon - Monitoring - Services - AllServices</p></div>
<div id="attachment_1844" class="wp-caption alignnone" style="width: 464px"><a href="http://decrypt.ysance.com/wp-content/uploads/2010/12/Centreon-Reporting-Dashboard-2.jpg"><img class="size-full wp-image-1844  " title="Centreon - Reporting - Dashboard" src="http://decrypt.ysance.com/wp-content/uploads/2010/12/Centreon-Reporting-Dashboard-2.jpg" alt="Centreon - Reporting - Dashboard" width="454" height="213" /></a><p class="wp-caption-text">Centreon - Reporting - Dashboard</p></div>
<div id="attachment_1845" class="wp-caption alignnone" style="width: 462px"><a href="http://decrypt.ysance.com/wp-content/uploads/2010/12/Centreon-Views-Graphs-2.jpg"><img class="size-full wp-image-1845  " title="Centreon - Views - Graphs" src="http://decrypt.ysance.com/wp-content/uploads/2010/12/Centreon-Views-Graphs-2.jpg" alt="Centreon - Views - Graphs" width="452" height="212" /></a><p class="wp-caption-text">Centreon - Views - Graphs</p></div>
<p>Et comme un schéma vaut mieux qu&#8217;un long discours, en voici un expliquant la relation entre les deux outils :</p>
<div id="attachment_1871" class="wp-caption alignnone" style="width: 934px"><img class="size-full wp-image-1871" title="Architecture Centreon-Nagios" src="http://decrypt.ysance.com/wp-content/uploads/2011/01/Centreon-Nagios.png" alt="Architecture Centreon-Nagios" width="924" height="653" /><p class="wp-caption-text">Architecture Centreon-Nagios</p></div>
<p>Je considère Centreon comme un outil à part entière, même si il utilise Nagios comme ordonnanceur, le coeur de la fonctionnalité de supervision.</p>
<p>Pour résumer, Centreon est un outil complet qui vous permettra d&#8217;ajouter une composante métrologique à un solide outil de supervision. Pratique donc pour unifier dans un même outil, une même interface, tout ce qui est nécessaire aux équipes d&#8217;exploitation pour surveiller l&#8217;infrastructure. A noter cependant que l&#8217;exploitation des données de performances ne vous permet pas de mettre en place des graphes aussi complexes que ceux que l&#8217;on peut produire avec des outils de métrologie plus avancés. Par exemple, on ne pourra pas remonter des informations plus orientées services comme celle d&#8217;un serveur Web ou d&#8217;une base de donnée et les mettre en corrélation, comme on peut le voir dans des graphes Cacti, Munin ou Zabbix.</p>
<p><strong><em>Le Corbeau et le Cactus</em></strong><br />
Cela aurait pu être une fable mettant en scène un corbeau malhabile laissant des plumes sur le végétal facétieux. Mais il n&#8217;en n&#8217;ai rien, il s&#8217;agit de 2 outils de métrologie.</p>
<p><a title="Site de Munin" href="http://munin-monitoring.org/"><strong>Munin</strong></a> est un outil très simple basé sur RRDtool qui propose une interface simpliste sans beaucoup de fonctionnalités. Les visualisations sur plusieurs échelles de temps (jour, semaine, mois et année) ne proposent pas de zoom ou de scroll, ce qui est limitant pour une production, c&#8217;est d&#8217;ailleurs à mon sens LE gros manque. Car outre cette limitation, il remplit les fonctionnalités essentielles d&#8217;un outil de métrologie pure et chaque graphique correspond à un unique script qui gère aussi bien la récupération des informations que leur mise en forme via RRDtool selon un template très bien pensé. Munin utilisant un agent sur la cible, il suffit de déployer l&#8217;agent avec la liste des graphiques de notre infrastructure et de n&#8217;activer ceux que nous souhaitons voir pour la cible via lien symbolique (comme les <em>sites-enabled</em> et les <em>sites-available</em> sous Apache par exemple). L&#8217;architecture est très pratique et la combo est très performante en utilisant <a title="Site de Puppet" href="http://reductivelabs.com/">Puppet</a> (gestionnaire de configuration centralisé) pour les déploiements automatisés de machine et conserver homogènes les configurations de vos pools de machines. Cette combo m&#8217;a vraiment séduit. Surtout que qu&#8217;elle fonctionne très bien en corrélation avec un Nagios pur qui fonctionne également sur une configuration purement sous forme de fichiers. The &laquo;&nbsp;Double tap&nbsp;&raquo; ! C&#8217;est un peu le &laquo;&nbsp;Buddy system&nbsp;&raquo; du monitoring ! :o)</p>
<p>Si vous voulez en savoir plus sur les possibilités offertes par Puppet dans ce cadre, vous pouvez lire <a title="Site de Decrypt, Scaler une infrastructure AWS 1/2 : les outils" href="http://decrypt.ysance.com/2010/06/scaler-une-infrastructure-aws-1-les-outils/">cet article</a> si vous voulez en savoir plus sur un cas d&#8217;utilisation de Puppet ou bien <a title="Puppet et Capistrano : la clé de l’automatisation" href="http://decrypt.ysance.com/2009/07/automatisation-puppet-capistrano/">celui-ci</a> pour regarder une vidéo expliquant plus le fonctionnement interne de l&#8217;outil et sa configuration. Pour finir, cette citation :</p>
<blockquote><p>En ce qui concerne la gestion et le suivi de la ferme web de FarmVille, nous exploitons quelques outils de gestion et de monitoring Open Source. Nous utilisons Nagios pour les alertes (supervision), Munin pour le monitoring et Puppet pour la configuration.</p></blockquote>
<p>(précision sémantique Munin =&gt; métrologie) tirée d&#8217;une interview de Luke Rajlich (FarmVille). Pour l&#8217;interview complète, lisez <a title="Site de Decrypt, Comment FarmVille scale pour récolter 75 millions de joueurs par mois" href="http://decrypt.ysance.com/2010/03/comment-farmville-scale-pour-recolter-75-millions-de-joueurs-par-mois/">Comment FarmVille scale pour récolter 75 millions de joueurs par mois</a> si vous voulez vous convaincre de l&#8217;intérêt de cette solution. :o)</p>
<p>Voici quelques images de l&#8217;interface Munin pour vous faire une idée :</p>
<div id="attachment_1888" class="wp-caption alignnone" style="width: 537px"><a href="http://decrypt.ysance.com/wp-content/uploads/2011/01/Munin-Overview.jpg"><img class="size-full wp-image-1888  " title="Munin - Overview" src="http://decrypt.ysance.com/wp-content/uploads/2011/01/Munin-Overview.jpg" alt="Munin - Overview" width="527" height="110" /></a><p class="wp-caption-text">Munin - Overview</p></div>
<div id="attachment_1889" class="wp-caption alignnone" style="width: 512px"><a href="http://decrypt.ysance.com/wp-content/uploads/2011/01/Munin-Overview-Machine.jpg"><img class="size-full wp-image-1889  " title="Munin - Overview Machine" src="http://decrypt.ysance.com/wp-content/uploads/2011/01/Munin-Overview-Machine.jpg" alt="Munin - Overview Machine" width="502" height="284" /></a><p class="wp-caption-text">Munin - Overview Machine</p></div>
<div id="attachment_1885" class="wp-caption alignnone" style="width: 505px"><img class="size-full wp-image-1885" title="Munin - CPU by day" src="http://decrypt.ysance.com/wp-content/uploads/2011/01/frontal001-cpu-day.png" alt="Munin - CPU by day" width="495" height="343" /><p class="wp-caption-text">Munin - CPU by day</p></div>
<div id="attachment_1886" class="wp-caption alignnone" style="width: 505px"><img class="size-full wp-image-1886" title="Munin - Mysql Queries by day" src="http://decrypt.ysance.com/wp-content/uploads/2011/01/frontal001-mysql_queries-day.png" alt="Munin - Mysql Queries by day" width="495" height="343" /><p class="wp-caption-text">Munin - Mysql Queries by day</p></div>
<p><a title="Site de Cacti" href="http://www.cacti.net/"><strong>Cacti</strong></a><strong> </strong>est lui aussi un outil de métrologie, plus complet que le précédent, et qui a la particularité d&#8217;avoir une &laquo;&nbsp;Plugin Architecture&nbsp;&raquo; qui va permettre de lui ajouter pas mal de fonctionnalités en important des plugins et en les configurant via l&#8217;interface web. On note parmi les plugins disponibles <em>Thold</em>, qui permet de mettre en place un système de remontée d&#8217;alertes mail sur des évènements liés aux graphes mis en place, comme sur le dépassement d&#8217;une valeur absolue, sur un pourcentage d&#8217;augmentation/diminution, &#8230; Cela permet de capitaliser sur l&#8217;expérience tirée de l&#8217;analyse des graphes de son infrastructure et de prévenir en cas de fonctionnement anormal. Cependant, l&#8217;aspect supervision proposé ici ne sera pas aussi développé que ceux que l&#8217;on peut trouver sur des outils plus spécialisés et gérant des escalades, un panel de mesures/déclencheurs/actions extrêmement fins et modulables, des plages horaires et des groupes d&#8217;utilisateurs, &#8230; Tout ce qui fait un outil de supervision complet. Donc Cacti est avant tout un outil de métrologie avec pas mal de plugins intéressants et avec la possibilité de mettre à disposition une supervision simple qui peut convenir dans certains cas&#8230; simples. ;ob</p>
<p>Le point fort de Cacti réside dans les possibilités de customisation des graphes que l&#8217;on crée ou bien que l&#8217;on importe depuis les templates variés mis à disposition par la communauté. Il est parfois un peu compliqué, je trouve, de créer ses graphes : il faut bien comprendre le mécanisme ! Rien d&#8217;insurmontable en tout cas.</p>
<p>Voici quelques captures d&#8217;écran, afin de vous donner une idée de l&#8217;outil :</p>
<div id="attachment_1899" class="wp-caption alignnone" style="width: 442px"><a href="http://decrypt.ysance.com/wp-content/uploads/2011/01/Cacti-Settings.jpg"><img class="size-full wp-image-1899 " title="Cacti - Settings (from www.cacti.net)" src="http://decrypt.ysance.com/wp-content/uploads/2011/01/Cacti-Settings.jpg" alt="Cacti - Settings (from www.cacti.net)" width="432" height="460" /></a><p class="wp-caption-text">Cacti - Settings (from www.cacti.net)</p></div>
<div id="attachment_1900" class="wp-caption alignnone" style="width: 458px"><a href="http://decrypt.ysance.com/wp-content/uploads/2011/01/Cacti-Tree-View.jpg"><img class="size-full wp-image-1900 " title="Cacti - Tree View (from www.cacti.net)" src="http://decrypt.ysance.com/wp-content/uploads/2011/01/Cacti-Tree-View.jpg" alt="Cacti - Tree View (from www.cacti.net)" width="448" height="398" /></a><p class="wp-caption-text">Cacti - Tree View (from www.cacti.net)</p></div>
<div id="attachment_162" class="wp-caption alignnone" style="width: 463px"><img class="size-full wp-image-162" title="Cacti - Apache Statistics - Thread scoreboard" src="http://decrypt.ysance.com/wp-content/uploads/2009/05/apache-statistics-thread-scoreboard-tiny.png" alt="Cacti - Apache Statistics - Thread scoreboard" width="453" height="309" /><p class="wp-caption-text">Cacti - Apache Statistics - Thread scoreboard</p></div>
<p>Il est à noter que Cacti, contrairement aux autres outils présentés ici, ne fonctionne pas avec un système d&#8217;agents mais attaque directement un serveur SNMP sur la cible pour récupérer les informations système et, de la même manière, impose que les services monitorés (Apache, MySQL, &#8230;) laisse Cacti les interroger via le réseau. C&#8217;est une autre façon de concevoir les choses. Au choix.</p>
<p><strong><em>Zabbix</em></strong><br />
<a title="Site de Zabbix" href="http://www.zabbix.com/"><strong>Zabbix</strong></a><strong> </strong>est un outil de supervision qui propose un palette de fonctionnalités complète de métrologie. Cela en fait un outil qui peut à lui seul monitorer une infrastructure sans faire de concession. C&#8217;est un point très important quand on veut unifier les différents aspects du monitoring (métrologie et supervision) de son infrastructure dans un même outil, une même interface, à disposition de ses équipes d&#8217;exploitation.</p>
<p>C&#8217;est un outils complet qui permet de gérer toutes les notions relatives à la supervision (escalade, alerting, plages horaires, mesures/déclencheurs/actions sur conditions, &#8230;) et également un outil de métrologie complet permettant de tracer des graphes mettant en corrélation toutes les mesures que l&#8217;on remonte. Il est à noter que contrairement aux autres outils mettant à disposition des fonctionnalités de métrologie, il est le seul à ne pas utiliser RRDtool, mais une base de données. Aucune contre-indication, c&#8217;est à titre informatif.</p>
<p>Il utilise un agent comme la plupart de ses camarades afin de monitorer les machines cibles (agent qui peut fonctionner en mode passif ou bien actif, genre j&#8217;attends que le serveur me demande ou bien je suis autonome et je lui envoie directement). Il est également possible pour les métriques non système d&#8217;utiliser des connexions directes : l&#8217;intérêt est d&#8217;utiliser la fonction <em>zabbix_sender</em> qui va remonter un ensemble de métriques en une seule fois. Explications : par défaut, Zabbix va établir autant de connexions que de couples &laquo;&nbsp;clé-valeur&nbsp;&raquo; à remonter&#8230; Pourquoi pas, mais quand je veux monitorer des services un peu complexes ou quand je veux récupérer beaucoup de métriques, ça devient un peu consommateur. Il est alors possible de positionner des scripts (comme les plugins Nagios, Cacti, Munin, &#8230;), dans la crontab du serveur Zabbix, qui vont récupérer une liste de couples &laquo;&nbsp;clé-valeur&nbsp;&raquo; (en se connectant directement via le réseau sur les services distants et sans passer par l&#8217;agent Zabbix), les stocker dans un fichier (temporaire) sur le serveur Zabbix lui-même et les envoyer en une seule fois à Zabbix via la commande&#8230; <em>zabbix_sender</em> !</p>
<p>A noter également la possibilité de construire des écrans, à partir de multiples éléments, qu&#8217;il en ensuite possible de faire défiler&#8230; sur un grand écran plat pour votre équipe d&#8217;exploitation préférée (ceci n&#8217;est pas un message personnel ;ob). Il y a également la possibilité de définir des cartes (dans le style de celles que l&#8217;on trouve dans Nagios ou bien dans le plugin Weathermap de Cacti) afin de visualiser l&#8217;état macro de votre système.</p>
<p>Voici quelques quelques captures d&#8217;écran de Zabbix :</p>
<div id="attachment_1906" class="wp-caption alignnone" style="width: 522px"><img class="size-full wp-image-1906" title="Zabbix - Dashboard (from www.zabbix.com)" src="http://decrypt.ysance.com/wp-content/uploads/2011/01/Zabbix-Dashboard.png" alt="Zabbix - Dashboard (from www.zabbix.com)" width="512" height="371" /><p class="wp-caption-text">Zabbix - Dashboard (from www.zabbix.com)</p></div>
<div id="attachment_1905" class="wp-caption alignnone" style="width: 548px"><a href="http://decrypt.ysance.com/wp-content/uploads/2011/01/Zabbix-Apache-Thread-Scoreboard.jpg"><img class="size-full wp-image-1905  " title="Zabbix - Apache - Thread Scoreboard (from www.zabbix.com)" src="http://decrypt.ysance.com/wp-content/uploads/2011/01/Zabbix-Apache-Thread-Scoreboard.jpg" alt="Zabbix - Apache - Thread Scoreboard (from www.zabbix.com)" width="538" height="212" /></a><p class="wp-caption-text">Zabbix - Apache - Thread Scoreboard (from www.zabbix.com)</p></div>
<div id="attachment_1907" class="wp-caption alignnone" style="width: 520px"><img class="size-full wp-image-1907" title="Zabbix - Ecrans (from www.zabbix.com)" src="http://decrypt.ysance.com/wp-content/uploads/2011/01/Zabbix-Ecrans.jpg" alt="Zabbix - Ecrans (from www.zabbix.com)" width="510" height="368" /><p class="wp-caption-text">Zabbix - Ecrans (from www.zabbix.com)</p></div>
<div id="attachment_1908" class="wp-caption alignnone" style="width: 519px"><img class="size-full wp-image-1908" title="Zabbix - Graphes - Zoom In (from www.zabbix.com)" src="http://decrypt.ysance.com/wp-content/uploads/2011/01/Zabbix-Graphes-Zoom-In.jpg" alt="Zabbix - Graphes - Zoom In (from www.zabbix.com)" width="509" height="367" /><p class="wp-caption-text">Zabbix - Graphes - Zoom In (from www.zabbix.com)</p></div>
<p><em><strong>La suite&#8230;</strong></em><br />
Voilà pour la présentation des différents outils et la pose des hypothèses à partir desquelles je vais établir un comparatif entre ces différents outils. Le <a title="Site de Decrypt, Comparatif outils de monitoring (métrologie et supervision) (2/2) : Zabbix, Centreon, Nagios, Cacti et Munin" href="http://decrypt.ysance.com/2011/02/comparatif-outils-monitoring-metrologie-supervision-2-zabbix-centreon-nagios-cacti-munin/">second article</a> va synthétiser les éléments principaux de décision dans une matrice afin de comparer les outils proposés et d&#8217;évaluer leur correspondance sur chacun de ces critères.</p>
<p><em><strong>Frédéric FAURE</strong></em> <a title="Frédéric FAURE @Twitter" href="http://twitter.com/fredericfaure">@Twitter</a> <a title="Ysance, Simplifions les projets informatiques" href="http://www.ysance.com/">@Ysance</a></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2011/02/comparatif-outils-monitoring-metrologie-supervision-1-zabbix-centreon-nagios-cacti-munin/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Benchmark CPU sur Amazon EC2</title>
		<link>http://decrypt.ysance.com/2010/11/benchmark-cpu-sur-amazon-ec2/</link>
		<comments>http://decrypt.ysance.com/2010/11/benchmark-cpu-sur-amazon-ec2/#comments</comments>
		<pubDate>Fri, 26 Nov 2010 18:02:33 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Benchmark]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[EC2]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=1643</guid>
		<description><![CDATA[<img class="size-medium wp-image-1645 alignleft" title="Bench CPU" src="http://decrypt.ysance.com/wp-content/uploads/2010/11/cpu-001-231x300.jpg" alt="Bench CPU" width="162" height="210" />

Cet article constitue un retour d'expérience sur un benchmark CPU sur différents types (tailles) d'instances <a title="Site de Amazon Web Services, Rubrique Elastic Compute Cloud" href="http://aws.amazon.com/ec2/">EC2</a> sur AWS. L'objectif était de constater le comportement, au niveau des ressources CPU, desdites instances lors d'une montée en charge sur un traitement multi-threadé et de les comparer par rapport à un étalon plus récent (choisi arbitrairement, comme un portable) que celui proposé par AWS : l'ECU ou EC2 Compute Unit.

Tout d'abord, je tiens à remercier <a title="Blog de Sylvain Terret" href="http://www.tme520.net/golbbew/">Sylvain Terret</a> qui a effectué le test "en ressortant un vieux bout de code du placard" et qui a aussi écrit un billet sur son blog sur le sujet. Ensuite, je fais également écho à un <a title="SmugMug's Don MacAskill, EC2 isn't 50% slower" href="http://don.blogs.smugmug.com/2008/02/27/ec2-isnt-50-slower/">article intéressant (EC2 isn't 50% slower)</a> qui répond à quelques controverses sur la réalité des ressources CPU mises à disposition lors du lancement d'une instance EC2. Je vous invite à lire cet article synthétique et instructif, ainsi que les commentaires associés.

Pour commencer, le bench a été effectué sur un Ubuntu Lucid Lynx. Le code ci-dessous a été utilisé pour charger les différents types d'instances EC2 : il s'agit d'une multiplication de matrices basée sur l'API <a title="Site de OpenMP, The OpenMP API specification for parallel programming" href="http://openmp.org/wp/">OpenMP</a>.

[...]
]]></description>
			<content:encoded><![CDATA[<p><img class="size-medium wp-image-1645 alignleft" title="Bench CPU" src="http://decrypt.ysance.com/wp-content/uploads/2010/11/cpu-001-231x300.jpg" alt="Bench CPU" width="162" height="210" /></p>
<p>Cet article constitue un retour d&#8217;expérience sur un benchmark CPU sur différents types (tailles) d&#8217;instances <a title="Site de Amazon Web Services, Rubrique Elastic Compute Cloud" href="http://aws.amazon.com/ec2/">EC2</a> sur AWS. L&#8217;objectif était de constater le comportement, au niveau des ressources CPU, desdites instances lors d&#8217;une montée en charge sur un traitement multi-threadé et de les comparer par rapport à un étalon plus récent (choisi arbitrairement, comme un portable) que celui proposé par AWS : l&#8217;ECU ou EC2 Compute Unit.</p>
<p>Tout d&#8217;abord, je tiens à remercier <a title="Blog de Sylvain Terret" href="http://www.tme520.net/golbbew/">Sylvain Terret</a> qui a effectué le test &laquo;&nbsp;en ressortant un vieux bout de code du placard&nbsp;&raquo; et qui a aussi écrit un billet sur son blog sur le sujet. Ensuite, je fais également écho à un <a title="SmugMug's Don MacAskill, EC2 isn't 50% slower" href="http://don.blogs.smugmug.com/2008/02/27/ec2-isnt-50-slower/">article intéressant (EC2 isn&#8217;t 50% slower)</a> qui répond à quelques controverses sur la réalité des ressources CPU mises à disposition lors du lancement d&#8217;une instance EC2. Je vous invite à lire cet article synthétique et instructif, ainsi que les commentaires associés.</p>
<p>Pour commencer, le bench a été effectué sur un Ubuntu Lucid Lynx. Le code ci-dessous a été utilisé pour charger les différents types d&#8217;instances EC2 : il s&#8217;agit d&#8217;une multiplication de matrices basée sur l&#8217;API <a title="Site de OpenMP, The OpenMP API specification for parallel programming" href="http://openmp.org/wp/">OpenMP</a>.</p>
<p>Ce calcul matriciel va être exécuté plusieurs fois en incrémentant à chaque fois le nombre de threads qui vont se partager (parallélisation) le calcul. Ainsi, nous avons pu comparer un même traitement lorsqu&#8217;il est exécuté par 1, 2, &#8230; 12 threads et constater l&#8217;évolution du temps d&#8217;exécution en fonction du type d&#8217;instance EC2, c&#8217;est à dire, dans le cas qui nous intéresse, en fonction du nombre de CPUs disponibles sur chaque type d&#8217;instance. Il est à noter que chaque CPU affecté au traitement d&#8217;un thread donné est monopolisé à 100% lors de l&#8217;exécution du calcul.</p>
<p>Le code source est le suivant :</p>
<blockquote><p>#include<br />
#include<br />
#include<br />
#include</p>
<p>#define SIZE 2000</p>
<p>double get_time() {<br />
struct timeval tv;<br />
gettimeofday(&amp;tv, (void *)0);<br />
return (double) tv.tv_sec + tv.tv_usec*1e-6;<br />
}</p>
<p>int main(int argc, char const *argv[]) {<br />
int nb, i, j, k;<br />
double t, start, stop;<br />
double* matrice_A;<br />
double* matrice_B;<br />
double* matrice_res;</p>
<p>// Allocations<br />
matrice_A = (double*) malloc(SIZE*SIZE*sizeof(double));<br />
matrice_B = (double*) malloc(SIZE*SIZE*sizeof(double));<br />
matrice_res = (double*) malloc(SIZE*SIZE*sizeof(double));</p>
<p>for(i=0; i   for(j=0; j   matrice_A[i*SIZE+j] = (double)rand()/(double)RAND_MAX;<br />
matrice_B[i*SIZE+j] = (double)rand()/(double)RAND_MAX;<br />
}<br />
}<br />
printf(&laquo;&nbsp;Nb.threads\tTps.\n&nbsp;&raquo;);</p>
<p>for(nb=1; nb&lt;=12; nb++){<br />
start = get_time();<br />
#pragma omp parallel for num_threads(nb) private(j,k)<br />
for(i=0; i   for(j=0; j   matrice_res[i*SIZE+j] = 0.0;<br />
for(k=0; k   matrice_res[i*SIZE+j] += (matrice_A[i*SIZE+k] * matrice_B[i*SIZE+j]);<br />
}<br />
}<br />
}<br />
stop = get_time();<br />
t = stop &#8211; start;<br />
printf(&laquo;&nbsp;%d\t%f\n&nbsp;&raquo;, nb, t);<br />
}<br />
// Libérations<br />
free(matrice_A);<br />
free(matrice_B);<br />
free(matrice_res);<br />
return EXIT_SUCCESS;<br />
}</p></blockquote>
<p>Les instances benchées sont les suivantes :</p>
<ul>
<li>Standard Instances &#8211; Large Instance (M1.LARGE) 7.5 GB of memory, <strong><em>4 EC2 Compute Units</em></strong> (<strong><em>2 virtual cores with 2 EC2 Compute Units each</em></strong>), 850 GB of local instance storage, 64-bit platform</li>
<li>Standard Instances &#8211; Extra Large Instance (M1.XLARGE) 15 GB of memory, <strong><em>8 EC2 Compute Units</em></strong> (<strong><em>4 virtual cores with 2 EC2 Compute Units each</em></strong>), 1690 GB of local instance storage, 64-bit platform</li>
<li>High-CPU Instances &#8211; High-CPU Extra Large Instance (C1.XLARGE) 7 GB of memory, <strong><em>20 EC2 Compute Units</em></strong> (<strong><em>8 virtual cores with 2.5 EC2 Compute Units each</em></strong>), 1690 GB of local instance storage, 64-bit platform</li>
</ul>
<p>A noter, la définition de l&#8217;ECU (rien à voir avec une nouvelle-ancienne monnaie unique) qui est l&#8217;étalon AWS en termes de puissance CPU et qui correspond à :</p>
<blockquote><p>EC2 Compute Unit (ECU) – One EC2 Compute Unit (ECU) provides the equivalent CPU capacity of a 1.0-1.2 GHz 2007 Opteron or 2007 Xeon processor.</p></blockquote>
<p>Cela, disons-le, ne représente pas grand chose, mais j&#8217;y reviendrai plus tard.</p>
<p>A noter également notre étalon qui est constitué d&#8217;un portable posé sur le bureau et équipé d&#8217;un Core 2 Quad Q8400 @ 2.66 GHz x 1 (4 cores).</p>
<p><strong><em>Synthèse graphique</em></strong></p>
<div id="attachment_1650" class="wp-caption aligncenter" style="width: 793px"><img class="size-full wp-image-1650" title="CPU benchmark on EC2" src="http://decrypt.ysance.com/wp-content/uploads/2010/11/benchmark-cpu-ec2.png" alt="CPU benchmark on EC2" width="783" height="417" /><p class="wp-caption-text">CPU benchmark on EC2</p></div>
<p><strong><em>Analyse des résultats</em></strong></p>
<ul>
<li>Tout d&#8217;abord de manière macro, il est rassurant de voir que <strong>doubler le nombre de &laquo;&nbsp;virtual cores&nbsp;&raquo;</strong> (2 =&gt; 4 =&gt; 8) <strong>double les performances</strong> pour des &laquo;&nbsp;virtual cores&nbsp;&raquo; sensiblement identiques (2 virtual cores de 2 ECUs chacun =&gt; 4 virtual cores de 2 ECUs chacun =&gt; 8 virtual cores de <strong><em>2.5</em></strong> ECUs chacun). Comme le dit Sylvain : &laquo;&nbsp;Ca sent un peu le Captain Obvious, mais à bien y réfléchir, ce n&#8217;est pas une règle d&#8217;or dans l&#8217;informatique.&nbsp;&raquo;</li>
<li>Le <strong>Core 2 Quad</strong> posé sur le bureau est plus efficace à nombre de coeurs équivalent que les instances EC2 (une M1.XLARGE avec 4 coeurs de 2 ECUs chacun dans notre cas).</li>
<li>Ensuite, il est intéressant de noter que nous n&#8217;avons obtenu sur le lancement des instances que des <strong>processeurs Xeon (Intel)</strong> : E5430 @ 2.66 GHz pour les M1.LARGE et M1.XLARGE et E5410 @ 2.33 GHz pour les C1.XLARGE. Quelles auraient été les résultats si nous avions eu des Opteron (AMD) ? Il faut savoir que l&#8217;on ne choisit pas son type de processeur au lancement d&#8217;une instance. Cependant, cela fait quelques temps que je n&#8217;ai plus vu d&#8217;Opteron au lancement d&#8217;instances EC2 : il faut dire que je travaille depuis quelques temps quasi exclusivement sur la région européenne d&#8217;Amazon (par opposition aux EU, voire à l&#8217;APAC). Je n&#8217;ai pas investigué sur ce sujet beaucoup plus au delà.</li>
<li>Une <strong>anomalie </strong>est à noter concernant les tests sur les M1.XLARGE : la différence de performance sur les 3 premiers calculs (de 1 à 3 threads) entre les deux instances M1.XLARGE (4 virtual cores) : une des 2 instances a donné des performances moins bonnes sur le même bench qui a tourné deux fois sur chaque machine (les résultats ont été constants). Je n&#8217;ai pas trouvé d&#8217;explication sur cette différence entre les 2 instances.</li>
<li>Ce qui n’apparaît pas sur le graphique et que l&#8217;on constate, en se connectant directement sur les instances, via top ou htop : on voit à chaque nouveau calcul exécuté et distribué sur un thread supplémentaire un nouveau CPU passer à 100% (calcul sur 2 threads = 2 CPUs à 100%, &#8230;) et lorsque l&#8217;on atteint <em>&laquo;&nbsp;nombre de threads &gt;= nombre de CPUs de l&#8217;instance&nbsp;&raquo;</em>, on voit apparaître un pourcentage de <strong>steal </strong>sur les CPUs de l&#8217;instance.</li>
</ul>
<p><strong><em>Le % steal</em></strong><br />
Pour analyser un peu plus en détail la présence de steal, nous avons effectué un autre test de performance (merci à <a title="Profil de Yann Le Van" href="http://fr.linkedin.com/pub/yann-le-van/6/545/51B">Yann Le Van</a> pour le graphe !) en monitorant un MongoDB (toujours sur Ubuntu Lucid Lynx) que nous avons maltraité en y injectant par palier de nombreuses requêtes de géolocalisation non bornées avec des critères de recherche sur des attributs supplémentaires (Cf. <a title="Site de MongoDB, Geospatial Indexing" href="http://www.mongodb.org/display/DOCS/Geospatial+Indexing">requêtes géospatiales et indexation composée</a>). Il apparaît de nouveau clairement qu&#8217;un pourcentage non négligeable de steal progresse avec l&#8217;utilisation des CPUs de l&#8217;instance (les 8 coeurs d&#8217;une C1.XLARGE dans ce test).</p>
<div id="attachment_1665" class="wp-caption aligncenter" style="width: 788px"><img class="size-full wp-image-1665" title="CPU Benchmark MongoDB" src="http://decrypt.ysance.com/wp-content/uploads/2010/11/CPU-Benchmark-MongoDB.png" alt="CPU Benchmark MongoDB" width="778" height="390" /><p class="wp-caption-text">CPU Benchmark MongoDB</p></div>
<div id="attachment_1666" class="wp-caption aligncenter" style="width: 788px"><img class="size-full wp-image-1666" title="CPU Benchmark MongoDB - Legende" src="http://decrypt.ysance.com/wp-content/uploads/2010/11/CPU-Benchmark-MongoDB-Legend.png" alt="CPU Benchmark MongoDB - Legende" width="778" height="80" /><p class="wp-caption-text">CPU Benchmark MongoDB - Legende</p></div>
<p>Il ne s&#8217;agit pas de puissance CPU que l&#8217;on nous dérobe honteusement (ce que j&#8217;ai lu dans plusieurs articles concernant ce sujet), mais d&#8217;une puissance de calcul utilisé par l&#8217;hyperviseur qui gère la virtualisation sur laquelle repose notre OS. Ce test le prouve car le % steal progresse (ou décroit) proportionnellement à notre propre sollicitation de l&#8217;instance. Si il s&#8217;agissait de la sollicitation de &laquo;&nbsp;notre&nbsp;&raquo; puissance CPU par une autre instance d&#8217;un autre utilisateur sur le même hardware, l&#8217;évolution de la valeur du % steal ne serait pas directement reliée à notre utilisation (elle pourrait être constante par exemple).</p>
<p>La valeur du % steal n&#8217;est cependant pas négligeable et l&#8217;hyperviseur est quelque peu gourmand sur une sollicitation importante des ressources CPU de notre instance.</p>
<p><strong><em>Conclusion</em></strong><br />
Comme je disais précédemment concernant l&#8217;étalon Amazon, l&#8217;ECU, il donne une idée de la puissance comparative des instances EC2 entre elles : si vous faites fonctionner une application multi-threadée sur une instances EC2 et que vous avez besoin de plus de puissance CPU, prendre une instance 2 fois plus puissante en termes d&#8217;ECUs vous permettra d&#8217;aller 2 fois plus vite (à noter qu&#8217;en fonction du type d&#8217;instance, un coeur à une puissance de 2 à 3.25 ECUs, si on fait abstraction de la <em>Small Instance</em> et de la <em>Micro Instance</em> qui sont moins puissantes).</p>
<p>Sorti du paradigme AWS, l&#8217;ECU ne signifie plus rien car la valeur du GHz dépend de l&#8217;architecture, de la génération et du fabricant (Intel, AMD, &#8230;) du processeur. Un &laquo;&nbsp;1.0-1.2 GHz 2007 Opteron or 2007 Xeon&nbsp;&raquo; ne vous donnera pas une indication très précise sur la puissance réelle dont vous allez disposer, à part le fait qu&#8217;à GHz égal, votre ordinateur de bureau équipé de la dernière génération de processeurs vous donnera de meilleurs résultats.</p>
<p>La meilleure (et probablement la seule valable) solution afin de constituer votre choix d&#8217;instances à déployer pour votre application est de mettre en place quelques tests de performances afin de constater réellement les ressources utilisées dans le paradigme AWS et de sélectionner les instances et de choisir leur nombre (scale-out) en fonction du résultat obtenu.</p>
<p><em><strong>Frédéric FAURE</strong></em> <a title="Frédéric FAURE @Twitter" href="http://twitter.com/fredericfaure">@Twitter</a> <a title="Ysance, Simplifions les projets informatiques" href="http://www.ysance.com/">@Ysance</a></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2010/11/benchmark-cpu-sur-amazon-ec2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Scaling an AWS infrastructure 2/2 : the pattern</title>
		<link>http://decrypt.ysance.com/2010/08/scaling-an-aws-infrastructure-2-the-pattern/</link>
		<comments>http://decrypt.ysance.com/2010/08/scaling-an-aws-infrastructure-2-the-pattern/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 16:43:48 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Sharding / Partitionnement]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[Casual Gaming]]></category>
		<category><![CDATA[LVM]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[RAID]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Tokyo Cabinet]]></category>
		<category><![CDATA[Tokyo Tyrant]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=1525</guid>
		<description><![CDATA[<img class="size-medium wp-image-1411 alignleft" title="Scale-Out in the Matrix" src="http://decrypt.ysance.com/wp-content/uploads/2010/06/MatrixScaleOut-300x123.png" alt="Scale-Out in the Matrix" width="204" height="82" />

How do you scale an <a title="Site de Amazon Web  Services" href="http://aws.amazon.com/">AWS</a> (Amazon Web Services) infrastructure? In Part Two of the article, I describe the architecture model and the underlying technical components you should use in order to implement a scalable infrastructure. We will look in particular at the optimisation of data access in scale-out-type architectures suitable for implementation as a distributed system, as much at the data model level as the lower layers for I/O optimisation. We will also examine the recommended development concepts such as Stateless, in the finest REST tradition. I will end the article with some tips and tricks. My aim is to help you set up and optimise your infrastructure by understanding how Amazon tools operate and to get the most benefit from them.

[...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-medium wp-image-1411 alignleft" title="Scale-Out in the Matrix" src="http://decrypt.ysance.com/wp-content/uploads/2010/06/MatrixScaleOut-300x123.png" alt="Scale-Out in the Matrix" width="204" height="82" /></p>
<p>How do you scale an <a title="Site de Amazon Web  Services" href="http://aws.amazon.com/">AWS</a> (Amazon Web Services) infrastructure? In Part Two of the article, I describe the architecture model and the underlying technical components you should use in order to implement a scalable infrastructure. We will look in particular at the optimisation of data access in scale-out-type architectures suitable for implementation as a distributed system, as much at the data model level as the lower layers for I/O optimisation. We will also examine the recommended development concepts such as Stateless, in the finest REST tradition. I will end the article with some tips and tricks. My aim is to help you set up and optimise your infrastructure by understanding how Amazon tools operate and to get the most benefit from them.</p>
<p><em><strong>Scale-out</strong></em><br />
<img class="size-full wp-image-1424 alignright" title="Scale-Up in Ghost Buster" src="http://decrypt.ysance.com/wp-content/uploads/2010/06/GhostBusterScaleUp.jpg" alt="Scale-Up in Ghost Buster" width="116" height="170" />Scale-out is the opposite of scale-up: the latter means the dynamic expansion on the fly of a given server’s resources (addition of RAM or CPU). Thus, the application continues running on a single machine whose capacity has been increased. Scale-out (the AWS way), on the other hand, offers to increase the number of servers in order to respond to the increased load of an application. Ultimately, the global potential of the infrastructure increases too, but is divided among several servers. This implies that the application supported on the server had been thought out in terms of distribution, that is, it can be executed in parallel on several servers without the risk of corrupting the business logic (think to shared session management or no session, for example) or creating a problem of access to the resources (which must then be available via the network and not locally on any given server, for example).</p>
<p>Scale-out can be likened to Agent Smith in <em>Matrix</em>. As for scale-up, think more along the lines of the Stay Puft Marshmallow Man in <em>Ghostbusters</em>!</p>
<p><strong><em>Stateless</em></strong><br />
The best way to obtain an application that is both easy to distribute and high performing, is to plan for it in stateless mode. This means that it’s the client request which must contain all the information enabling the request to be processed by the server, either via a cookie, or else via the URL parameters. Whenever possible you should choose this approach at any price, compared to the stateful mode in which the server must keep a context for each client to be able to respond to the request. The stateless concept is one of the great REST concepts. While we’re on the subject, I strongly recommend you read this <a title="REST, un style d'architecture universel" href="http://www.figer.com/publications/REST.htm">excellent article on REST</a> (in French) by Jean-Paul Figer to appreciate the style in all its simplicity and power.</p>
<p>If you have to manage stateful, you will need to use a network cache such as <a title="Site de Memcached" href="http://memcached.org/">Memcached</a>, to share the contexts among your different servers. Don’t even consider the local cache and sticky session package, as you will have trouble getting even distribution of the load balancing. It’s not a good idea to use a cluster which communicates in multicast either, because the Amazon network does not allow that … Or all the servers could communicate in unicast with a gateway which takes care of redistributing the communications… Are you sure you don’t prefer stateless? ;ob</p>
<p>The implementation of stateless applications did not arrive with Cloud Computing and AWS: on the other hand, if you don’t think along these lines, you won’t be able to make the most of all the energy and flexibility they provide.</p>
<p><strong><em>Optimisation of data</em></strong> <strong><em>access</em></strong><br />
Optimising data access requires two elements:</p>
<ul>
<li>The data model and software architecture that are found in scalable architecture, whether you are on an AWS infrastructure or not.</li>
<li>I/O management, which can be optimised in particular by thoroughly exploiting AWS.</li>
</ul>
<p><em><span style="text-decoration: underline;">The scalable model </span></em><br />
This subject deserves an entire article of its own, but the scalable model is in keeping with a rather classic model within the casual gaming-type applications, or more generally linked to applications based on the social graphs, or centred on a distinct business concept in particular.</p>
<p>To summarize, two methods of data storage are:</p>
<ul>
<li>Storage of what we’ll call the meta-model, which is not intended for distribution, built on a structured, indexed relational base (even though essentially used in the form of a key-value access), containing the general information of each user (in the case of a social application the following: <em>name</em>, <em>top score</em>, <em>previous day’s wins</em>, etc.), primarily accessed in read and for which it is possible to alleviate the load via a Memcached in front of it. You can therefore carry out SQL-type set-based requests (ensemblist) and thus recover information by using clauses (<em>WHERE</em>). This base can be a MySQL or a PgSQL for example. I suggest you read this <a title="Dotdeb, MySQL et Amazon : RDS vs EC2" href="http://www.dotdeb.org/2010/05/04/mysql-on-amazon-benchmarks-rds-vs-ec2/">very interesting report</a> by Guillaume Plessis, comparing MySQL installed on an <a title="Site de Amazon Web Services, Rubrique EC2" href="http://aws.amazon.com/ec2/">EC2</a> with the Amazon <a title="Site de Amazon Web Services, Rubrique RDS" href="http://aws.amazon.com/rds/">RDS</a> (Relational Database Service). I don’t risk ruining the suspense by telling you that databases are a real bearded geek affair! :o)</li>
<li>Storage for more volatile data (such as game data etc.), with a heavy write:read ratio, difficult to cache, and for which you must choose a real, structured, non-relational storage solution of a key-value-type (NoSQL / Not only SQL, some would say), thus enabling easy distribution of the data on X servers. I can mention a few names: <a title="Site de Redis" href="http://code.google.com/p/redis/">Redis</a>, <a title="Site de  Tokyo Tyrant" href="http://1978th.net/tokyotyrant/">Tokyo Tyrant</a>/<a title="Site de Tokyo Cabinet" href="http://1978th.net/tokyocabinet/">Tokyo Cabinet</a>, <a title="Site de MemcacheDB" href="http://memcachedb.org/">MemcacheDB</a>.  And also the new peer to peer models such as <a title="Site de Cassandra" href="http://cassandra.apache.org/">Cassandra</a>.</li>
</ul>
<div id="attachment_1353" class="wp-caption alignright" style="width: 291px"><img class="size-full wp-image-1353" title="Tokyo Cabinet" src="http://decrypt.ysance.com/wp-content/uploads/2010/06/TokyoCabinet.png" alt="Tokyo Cabinet" width="281" height="183" /><p class="wp-caption-text">Tokyo Cabinet</p></div>
<p>In this case, Tokyo Tyrant / Tokyo Cabinet is a solution that I have implemented, which I find satisfactory (note that a new tool <a title="Site de Kyoto Cabinet" href="http://1978th.net/kyotocabinet/">Kyoto Cabinet</a> has come and one of his worthy features is to optimize the management of multi threading and thread concurrency compared to Tokyo Cabinet). Tokyo Tyrant / Tokyo Cabinet is a twosome, managing the requests from distant servers (network interface) and access to the storage system respectively. Six APIs are available for storing the data:</p>
<ol>
<li>On memory Hash,</li>
<li>On memory B+tree,</li>
<li>File Hash,</li>
<li>File B+tree,</li>
<li>Fixed-length Array,</li>
<li>Table.</li>
</ol>
<p>Each of them has its own characteristics and responds to particular requirements in terms of performance and practicality.</p>
<p>Regarding performance: apart from its natural capabilities, it has the notable advantage of not managing authentication (which is usual in key-value storage systems &#8211; there are exceptions like <a title="Site de Amazon Web Services, Rubrique SimpleDB" href="http://aws.amazon.com/simpledb/">SimpleDB</a>, for example &#8211; ; security is supposed to be guaranteed at the network level for accessing the storage system and at the applications level for access to data – so that you can only retrieve that which concerns you). This reduces the access rate (no need for authentication requests) compared to a classic database. Furthermore, no reconstruction of onerous index management is required (possible however on the Tokyo Team’s API ‘Table’) … It goes without saying that what’s really time-consuming about data access via the network (between the web or application server and Tokyo Tyrant) is… the network! So in all cases, at the client (API) level you should use ‘mget’ (multi get), for example, by positioning a array of keys that you wish to recover in the parameters rather than performing a ‘get’ N times from the client, therefore creating N network accesses. ‘mget’ will be resolved at the Tokyo Tyrant level.</p>
<p>The arguments concerning this tool should be applied to all key-value-type storage.</p>
<p><em><span style="text-decoration: underline;">I/O management</span></em><br />
Now we come to the specific characteristics of AWS in terms of storage: <a title="Site de Amazon Web Services, Rubrique EBS" href="http://aws.amazon.com/ebs/">EBS</a> (Elastic Block Stores). EBS volumes are network disks optimised for I/Os, easy to use, ensuring the survival of crucial data during an EC2 (volatile) shutdown. On a purely practical note, I did however notice latency variances: not enormous, but on an application that is much in demand, it does get noticed. This is not insurmountable, it’s simply something to bear in mind. If your servers’ Load Average increases, it’s not necessarily the CPU which is to blame … Think I/Os! ;ob</p>
<p>Firstly think striping, therefore RAID0. No need for mirroring (RAID1), as the data safety in EBS is already guaranteed by Amazon, transparently, by network replication: let’s make the most of this service and concentrate on striping. Remember too to spread the writes of the different physical files (data, update logs, etc.) among different disks (for tools using update logs &#8211; and this is the case for MySQL and Tokyo Tyrant for example &#8211; do remember to set their capacity parameters). This is what allows you the best optimisations. Next, choose your filesystem carefully with regard to the tool (EXT3, XFS, etc.) and consider the mounting options (noatime, nodiratime, etc.) Finally, check the default scheduler on the EC2 instances that you are starting up: it’s the NOOP scheduler by default (I/O requests in a simple FIFO file). Consider something more efficient, such as CFQ (Completely Fair Queuing). Well, I say that, but it always depends on the top software layer, and if and how it manages the priorities: <a title="MySQL Performance Blog, Linux  schedulers in tpcc like benchmark" href="http://www.mysqlperformanceblog.com/2009/01/30/linux-schedulers-in-tpcc-like-benchmark/">in this example</a> (which is not on EBS) on the MySQL Performance Blog, it appears that the NOOP and DEADLINE schedulers are the best for improving the InnoDB I/O. It just goes to show, it’s always better to test first for your own particular case! ;ob</p>
<div id="attachment_1177" class="wp-caption alignleft" style="width: 310px"><img class="size-medium wp-image-1177" title="Logical Volume Management" src="http://decrypt.ysance.com/wp-content/uploads/2010/06/Archi_LVM-300x280.png" alt="Logical Volume Management" width="300" height="280" /><p class="wp-caption-text">Logical Volume Management</p></div>
<p>Another tool I have used with the EBS and which works very well is LVM2 (Logical Volume Management, version 2). I haven’t used it with an architecture with a high number of IOPS (I/O Operations Per Second) and have therefore not tested the striping possibilities (RAID0) offered by the tool. On the other hand, I have used it with an infrastructure which had to be able to tolerate considerable increases in data volume but without interruptions in service. The snapshot and volume re-creation operations of an EBS are too long. LVM provides the solution, because this abstraction layer enables the management of software volumes independent of physical resources: you only need to raise a new EBS resource (a command line), associate it with the EC2 instance (another command line) and add this resource to the LVM resource pool. All that’s needed is to increase the logical volume (still transparent, without service interruption), then extend the file system. That last operation (which is a joint operation with the re-creation of the EBS volume) can necessitate shutting down the service for a few moments (around ten seconds). Note that it is possible to hot-extend your file system with EXT3, personally, I prefer a service interruption of a few seconds on this type of very short but crucial operation. ;ob  And what’s more, it is easy to perform backups on an LVM system offering a snapshot differential option, which you can mount like an independent logical volume: when there is a modification to the origin volume, the initial value is copied in the snapshot volume, so you can snapshot large volumes on a limited space because only the frequency of modification is what counts. You can find further information on LVM2 and EBS by consulting this <a title="Decrypt,  EBS et LVM2 ou comment optimiser l’élasticité des AWS" href="../2010/06/ebs-et-lvm2-ou-comment-optimiser-elasticite-des-aws/">very good article</a> (in French) by Laurent Roux.</p>
<p>All these examples demonstrate that EBS are a very useful resource: you have to consider them firstly as a means of ensuring the durability of important resources before taking into account the performance aspect. In fact, performance is not necessarily better on an EBS than on the local disks of an EC2 instance (Cf. <a title="Ma petite présentation au Amazon web service french user group  2010" href="http://www.karlesnine.com/post/2010/05/07/Amazon-web-service-french-user-group-2010">a simple and interesting test</a> (in French) by Charles-Christian Croix. Or, to see some slightly more complex tests, Google <em>“performance ephemeral disk ebs volume raid”</em>. There are quite a few very interesting cases, and I must confess I find it hard to choose between them ;ob). Nevertheless, when you are committed to ensuring the safety of your data and thus using EBS (which, for those in the know, is comparable to a LUN on a SAN), there are several ways of maximising their performance.</p>
<p>It should be noted that, for a pure performance solution, use them to spread the files (and thus the I/Os) among several EBS disks.</p>
<p>Note however that the EC2 bandwidth is inevitably limiting, once you reach a certain threshold: adding EBS is helpful for smoothing out the variance differentials (in RAID0) or for optimising the throughput, but the fact remains that if you add several EBS to your EC2 instance and they are in great demand… it&#8217;s the EC2 bandwidth that jams. You will have to add a new EC2 (scale-out to increase the resources &#8211; in this case the bandwidth), attach new EBS to it (don’t forget that an EBS may be attached only to a single EC2 at a time) and partition the data onto it (sharding).</p>
<p>In all cases, handling the EBS is easy and this flexibility is a plus.</p>
<p><strong><em>Tips &amp; tricks</em></strong><br />
This last section contains some useful hints.</p>
<p><em><span style="text-decoration: underline;">Aliases &amp; IPs</span></em><br />
Remember, on an AWS infrastructure, to position aliases corresponding to your instances’ private IPs in the ‘hosts’ file, which you then deploy via <a title="Site de Puppet" href="http://www.puppetlabs.com/">Puppet</a> for greater reactivity, given that the IPs are ‘variable’ (when you shut down one instance and start up another straight away, you will not keep the same IP). By using the the ‘hosts’ file you will avoid provoking internal DNS resolutions for Amazon.</p>
<p><em><span style="text-decoration: underline;">CDN &amp; S3 Headers</span></em><br />
For the CDNs (Content Delivery Networks) that you will have to use in a scalable architecture, remember to use S3 in order to provide images and other static content. It’s useless to keep a Web server only for that purpose: that’s what S3 is for, and at minimal cost.</p>
<p>Remember also that in certain cases where your traffic is more moderate and you don’t wish to change over to a CDN (for reasons of cost, for example ;ob), you can always optimise the management of your resources on S3 by using the metadata attributed to the said resources on S3, by positioning, for example, <em>Cache-Control</em> or <em>Expires-</em><em>type</em> headers. You may visualise the metadata via the new <a title="Site de Amazon Web Services, Console AWS, Onglet S3" href="https://console.aws.amazon.com/s3/home">S3 tab</a> of the Amazon management console.</p>
<p><em><span style="text-decoration: underline;">Backups… What else?</span></em><br />
S3 is also the solution for backups. I have not found any integrated tools satisfactory for this task: I simply use a command line tool “<a title="Site de s3tools, s3cmd" href="http://s3tools.org/s3cmd">s3cmd</a>” in order to store my backups. I integrated this tool into <a title="Site de Capistrano" href="http://www.capify.org/">Capistrano</a> tasks called by cron. s3cmd is very simple to operate, enables the use of S3 services and offers the possibility of transferring data in HTTPS, and also to store it in encrypted format.</p>
<p><strong><em>Conclusion</em></strong><br />
There are many more things to be said on this subject, but the abovementioned points are, in my opinion, the essential ones, in any case with regard to using the services provided by AWS. To sum up:</p>
<ul>
<li>Stateless and REST are, generally      speaking, better adapted to AWS, since they enable easy sharing of the load on an infrastructure which      can adapt to the increased load on a scale-out model.</li>
<li>Data access always creates a bottleneck in      distributed scaling applications. At this level it’s a matter of      working on the data model and making good use of the adequate storage      systems:
<ul>
<li>SQL technologies for metadata able to       necessitate set-based querying (ensemblist) and relational things, while making maximum use of a       network cache for information with a high read:write ratio.</li>
<li>NoSQL / Not only SQL / key-value       technologies for information which can be accessed with a single key, and       thereby benefit from the distribution inherent in scale-out.</li>
</ul>
</li>
<li>Finally, remember the lower layers by      selecting an appropriate filesystem and scheduler. You should also      consider RAID (striping) and LVM (volume extension and snapshot      differential) to get the most out of the EBS’ versatility and allocation      of the I/Os on different devices (always being careful with your EC2      bandwidth, which can become restrictive: in that case add one or more EC2      instances to gain bandwidth and partition – shard – the data on new EBS).</li>
</ul>
<p>I hope you enjoyed this second part of my report on the scalability of AWS infrastructures.</p>
<p><em><strong>Frédéric FAURE</strong></em> <a title="Frédéric FAURE @Twitter" href="http://twitter.com/fredericfaure">@Twitter</a> <a title="Ysance, Simplifions les projets informatiques" href="http://www.ysance.com/">@Ysance</a></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2010/08/scaling-an-aws-infrastructure-2-the-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

