<?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; Amazon Web Services</title>
	<atom:link href="http://decrypt.ysance.com/tag/amazon-web-services/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>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>Formation AWS : nouvelle session le 8 Septembre 2011</title>
		<link>http://decrypt.ysance.com/2011/05/formation-aws-nouvelle-session-le-8-septembre-2011/</link>
		<comments>http://decrypt.ysance.com/2011/05/formation-aws-nouvelle-session-le-8-septembre-2011/#comments</comments>
		<pubDate>Thu, 12 May 2011 16:46:11 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[Formation]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=2443</guid>
		<description><![CDATA[<img class="size-full wp-image-510 alignleft" title="Logo AWS" src="http://decrypt.ysance.com/wp-content/uploads/2009/08/logo_aws.gif" alt="Logo AWS" width="164" height="60" />

Après quelques formations intra-entreprise, une <strong>nouvelle session inter-entreprises est ouverte</strong> ! Je vous annonce donc que je donnerai une formation sur les <a title="Site de Amazon Web Services" href="http://aws.amazon.com/">AWS</a> (Amazon Web Services) destinée aux professionnels le <strong>Jeudi 8 Septembre 2011</strong>. Elle se déroulera à <strong>Paris </strong>en <strong>une journée</strong>. Cette formation est éligible au financement par les OPCA (Agefos, FAFIEC  …), peut être intégrée à une période de professionnalisation ou à un  DIF.

Le but de la formation est de donner une vue d'ensemble des différentes  offres (AWS, GAE &#38; Azure) et de leur positionnement et d'expliquer  ce qu'est le Cloud Computing (modèle économique et services), puis de se  concentrer sur l'offre d'Amazon (architecture, services, résilience,  support, sécurité, ...) et de la mettre en pratique (EC2, EBS et S3). La  dernière partie est une ouverture sur les outils à mettre en place afin  d'optimiser l'utilisation de ces ressources (gestionnaire de  configuration centralisée, serveur de logs, métrologie, ...).

[...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-510 alignleft" title="Logo AWS" src="http://decrypt.ysance.com/wp-content/uploads/2009/08/logo_aws.gif" alt="Logo AWS" width="164" height="60" /></p>
<p>Après quelques formations intra-entreprise, une <strong>nouvelle session inter-entreprises est ouverte</strong> ! Je vous annonce donc que je donnerai une formation sur les <a title="Site de Amazon Web Services" href="http://aws.amazon.com/">AWS</a> (Amazon Web Services) destinée aux professionnels le <strong>Jeudi 8 Septembre 2011</strong>. Elle se déroulera à <strong>Paris </strong>en <strong>une journée</strong>. Cette formation est éligible au financement par les OPCA (Agefos, FAFIEC  …), peut être intégrée à une période de professionnalisation ou à un  DIF.</p>
<p>Le but de la formation est de donner une vue d&#8217;ensemble des différentes  offres (AWS, GAE &amp; Azure) et de leur positionnement et d&#8217;expliquer  ce qu&#8217;est le Cloud Computing (modèle économique et services), puis de se  concentrer sur l&#8217;offre d&#8217;Amazon (architecture, services, résilience,  support, sécurité, &#8230;) et de la mettre en pratique (EC2, EBS et S3). La  dernière partie est une ouverture sur les outils à mettre en place afin  d&#8217;optimiser l&#8217;utilisation de ces ressources (gestionnaire de  configuration centralisée, serveur de logs, métrologie, &#8230;).</p>
<p>La formation sera axée à la fois sur une approche théorique et pratique, avec 30% du temps de formation passé à réaliser des travaux pratiques (sur les composants principaux que sont EC2, EBS et S3, ainsi que manipulation des outils et gestion de compte AWS), et sur une forte interactivité afin de répondre à toutes vos interrogations.</p>
<p><em><strong>Qui peut y participer ? </strong></em><br />
Des chefs de projet, architectes techniques et fonctionnels, administrateurs système, responsables d’équipes de développement, directeur/responsable informatique.</p>
<p><em><strong>Quel est le programme proposé ?</strong></em></p>
<p><span style="color: #800000;"><strong><em><span style="text-decoration: underline;">1ère Demi-journée </span></em></strong><br />
<span style="text-decoration: underline;">Le Cloud Computing</span></span></p>
<ul>
<li><span style="color: #800000;"> De quoi s’agit-il ?</span></li>
<li><span style="color: #800000;"> Les acteurs du marché et leurs différentes approches (Amazon, Microsoft, Google, &#8230;)</span></li>
</ul>
<p><span style="color: #800000;"><span style="text-decoration: underline;">Le cas Amazon</span></span></p>
<ul>
<li><span style="color: #800000;"> De quoi s’agit-il ?</span></li>
<li><span style="color: #800000;"> Comparaison d&#8217;une infrastructure Cloud AWS avec une infrastructure physique classique</span></li>
<li><span style="color: #800000;"> Les cas d&#8217;utilisation</span></li>
<li><span style="color: #800000;"> Les coûts</span></li>
</ul>
<p><span style="color: #800000;"><span style="text-decoration: underline;">Les outils</span></span></p>
<ul>
<li><span style="color: #800000;"> Gestion de son compte (clés, certificats, facturation, support, &#8230;)</span></li>
<li><span style="color: #800000;"> Les consoles d&#8217;administration (Console AWS, ElasticFox, S3 Organiser)</span></li>
<li><span style="color: #800000;"> Les APIs</span></li>
</ul>
<p><span style="color: #800000;"><strong><span style="text-decoration: underline;"><em>2ème Demi-journée </em></span></strong><br />
<span style="text-decoration: underline;"> Les services infrastructure AWS</span></span></p>
<ul>
<li><span style="color: #800000;"> Elastic Compute Cloud (EC2)</span></li>
<li><span style="color: #800000;"> Elastic Block Storage (EBS)</span></li>
<li><span style="color: #800000;"> Simple Storage Service (S3)</span></li>
<li><span style="color: #800000;"> Séance de TP sur EC2, EBS et S3</span></li>
</ul>
<p><span style="color: #800000;"><span style="text-decoration: underline;">AWS&#8230; Encore un peu plus loin</span></span></p>
<ul>
<li><span style="color: #800000;"> Overview automatisation &amp; dynamisme : gestion de la configuration centralisée avec Puppet, déploiement automatisé avec Capistrano, monitoring avec Cacti &amp; Centreon/Nagios, gestion des logs avec Syslog-NG, auto-scalability, LVM, &#8230;</span></li>
</ul>
<p><span style="color: #800000;"><span style="text-decoration: underline;">Les informations utiles</span></span></p>
<ul>
<li><span style="color: #800000;"> Forums, sites, liens, livres blancs (sécurité, extension SI, &#8230;)</span></li>
</ul>
<p><em><strong>Quelles sont les modalités pratiques ?</strong></em><br />
<span style="text-decoration: underline;">Lieu :</span> <em>A venir</em><br />
<span style="text-decoration: underline;">Date :</span> Jeudi 8 Septembre 2011<br />
<span style="text-decoration: underline;">Heure :</span> <em>A venir</em></p>
<p><span style="text-decoration: underline;">Durée :</span> 1 journée<br />
<span style="text-decoration: underline;">Tarif :</span> 800 euros HT<br />
Toutes les sessions se déroulent dans le centre de Paris. Cette formation est éligible au financement par les OPCA (Agefos, FAFIEC …), peut être intégrée à une période de professionnalisation ou à un DIF. Nous pouvons vous aider à monter votre dossier.</p>
<h2><span style="color: #ff6600;"><strong>Pour vous inscrire</strong>, cliquez <a href="mailto:frederic.faure@ysance.com?cc=olivier.leal@ysance.com&amp;subject=Decrypt-ExpertYse-FormationCloud-8Septembre2011">ICI</a>.</span></h2>
<p><strong>En espérant que vous viendrez nombreux. :o)</strong></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/05/formation-aws-nouvelle-session-le-8-septembre-2011/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>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>
		<item>
		<title>Scaling an AWS infrastructure 1/2 : the tools</title>
		<link>http://decrypt.ysance.com/2010/08/scaling-an-aws-infrastructure-1-the-tools/</link>
		<comments>http://decrypt.ysance.com/2010/08/scaling-an-aws-infrastructure-1-the-tools/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 11:52:53 +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[Monitoring]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[Capistrano]]></category>
		<category><![CDATA[Métrologie]]></category>
		<category><![CDATA[Puppet]]></category>
		<category><![CDATA[Supervision]]></category>
		<category><![CDATA[Syslog-NG]]></category>
		<category><![CDATA[Webistrano]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=1488</guid>
		<description><![CDATA[<img class="size-full wp-image-510 alignleft" title="Logo AWS" src="http://decrypt.ysance.com/wp-content/uploads/2009/08/logo_aws.gif" alt="Logo AWS" width="164" height="60" />

How do you scale an <a title="Site de Amazon Web Services" href="http://aws.amazon.com/">AWS</a> (Amazon Web Services) infrastructure? This article will give you a detailed reply in two parts: the tools you can use to make the most of Amazon’s dynamic approach, and the architectural model you should adopt for a scalable infrastructure. I base my report on my experience gained in several AWS production projects in casual gaming (Facebook), e-commerce infrastructures and within the mainstream GIS (Geographic Information System). It’s true that my experience in gaming (<a title="IsCool, The Game" href="http://apps.facebook.com/is_cool/">IsCool, The Game</a>) is currently the most representative in terms of scalability, due to the number of users (over 800 thousand DAU - daily active users - at peak usage and over 20 million page views every day), however my experiences in e-commerce and GIS (currently underway :o)) provide a different view of scalability, taking into account the various problems of availability and data management. I will therefore attempt to provide a detailed overview of the factors to take into account in order to optimise the dynamic nature of an infrastructure constructed in a Cloud Computing environment, and in this case, in the AWS environment.

[...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-510 alignleft" title="Logo AWS" src="http://decrypt.ysance.com/wp-content/uploads/2009/08/logo_aws.gif" alt="Logo AWS" width="164" height="60" /></p>
<p>How do you scale an <a title="Site de Amazon Web Services" href="http://aws.amazon.com/">AWS</a> (Amazon Web Services) infrastructure? This article will give you a detailed reply in two parts: the tools you can use to make the most of Amazon’s dynamic approach, and the architectural model you should adopt for a scalable infrastructure. I base my report on my experience gained in several AWS production projects in casual gaming (Facebook), e-commerce infrastructures and within the mainstream GIS (Geographic Information System). It’s true that my experience in gaming (<a title="IsCool, The Game" href="http://apps.facebook.com/is_cool/">IsCool, The Game</a>) is currently the most representative in terms of scalability, due to the number of users (over 800 thousand DAU &#8211; daily active users &#8211; at peak usage and over 20 million page views every day), however my experiences in e-commerce and GIS (currently underway :o)) provide a different view of scalability, taking into account the various problems of availability and data management. I will therefore attempt to provide a detailed overview of the factors to take into account in order to optimise the dynamic nature of an infrastructure constructed in a Cloud Computing environment, and in this case, in the AWS environment.</p>
<p><strong><em>The tools</em></strong><br />
I will provide examples of tools I used in my various production experiments and which won me over with their efficiency. However, it’s not so much the tools themselves which are emphasised, rather the underlying features that must be installed to fully exploit the AWS.</p>
<p><em><strong>What is the difference between an AWS and a standard infrastructure?</strong></em><br />
There are two replies:</p>
<ul>
<li>Firstly, the AWS enable the Hardware and Infrastructure components to be handled via the code (through the APIs): this gives them momentum which needs to be intensified by correctly selecting your tools. Amazon also offers a certain number of technical guarantees with their services, which should be used to full advantage in order to concentrate on what is essential.</li>
<li>The second answer should be: ‘None!’ However, it must be acknowledged that often the cosy aspects of &#8216;home’-hosted infrastructure can lead to a certain lack of rigor on many issues. The fact that Amazon, with its AWS, offers a dynamic and volatile solution for the EC2s, compels you to install mechanisms which should be standard.</li>
</ul>
<p><em><strong>Centralised configuration management</strong></em><strong><em><br />
</em></strong>In order to instantiate multiple servers (EC2) on the fly to counter a load peak or perform occasional procedures, we have to use a centralised configuration management tool. This has multiple uses:</p>
<ul>
<li>Rapid instantiation of a machine corresponding to a pre-defined type: Web server, cache server, etc.</li>
<li>Ensuring uniform configuration of the entire set of instances of the same type at all times.</li>
<li>Capitalising on the expertise: packages, configurations, services etc. for each type of instance are contained within a descriptor. This enables new users (and others) to learn the composition of the servers simply by reading the associated descriptor(s.)</li>
</ul>
<p><img class="size-full wp-image-890 alignright" title="Logo Puppet - Reductive Labs" src="http://decrypt.ysance.com/wp-content/uploads/2010/02/puppet-short.png" alt="Logo Puppet - Reductive Labs" width="151" height="44" /></p>
<p><a title="Site de Puppet" href="http://reductivelabs.com/">Puppet</a> is a very attractive solution for this task. Puppet architecture comprises:</p>
<ul>
<li>A Puppet Master, guardian of configurations. It contains the descriptors of the packages to be      installed, configuration files to be pushed and services to be started up for a new EC2 instance in order to prepare it according to the type of node or nodes with which you have associated it, or simply to keep an existing instance updated.</li>
<li>Multiple Puppet clients installed on EC2 instances. The client regularly polls the master to check that his configuration is up to date. It is also possible to trigger the clients from the master to initiate an urgent update.</li>
</ul>
<p>It is thus very simple to mount a new instance of a given type, and to be sure that from one server to another, the configuration is identical in every way. It should be noted that the Puppet Master descriptors run on a node system, and a server may reference more than one node. You will therefore obtain a very modular configuration.</p>
<div id="attachment_1310" class="wp-caption alignleft" style="width: 306px"><img class="size-medium wp-image-1310 " title="Puppet Module Descriptor" src="http://decrypt.ysance.com/wp-content/uploads/2010/06/puppet_type_node_def-296x300.png" alt="Puppet Module Descriptor" width="296" height="300" /><p class="wp-caption-text">Puppet Module Descriptor</p></div>
<p>The centralised configuration manager is indispensable on a scalable infrastructure, which can have a large number of instances, some of which should be mounted rapidly, in order to reply to user requests during load peak.</p>
<p>‘But’, you may say, ‘you <em>do</em> have to install the client on the new instance, don’t you?’ Oh yes, all the more so as there is a system of certificate request/acceptation between the client and the master, so that not just anybody can access the configurations. ‘There’s nothing simpler!’ I reply. Instead of using an HMI (Human Machine Interface) such as ElasticFox to connect to the Amazon services APIs, you need simply to connect with command lines via a script which instantiates an EC2, creates if necessary an EBS volume and associates it, connects with SSH on the new instance and installs the client, connects on the master and accepts the certificate request, reboots the client and ‘Bingo!’ The instance installs and configures itself. In general, the reactive and dynamic capacities inherent in EC2 and AWS require it, otherwise it would be an under-exploitation, or even a misuse of the tool.</p>
<p>And what about the AMIs (instance-store root devices) or the EBS root devices (note that for the latter there is not yet a great choice of templates)? It is however possible to build an AMI or even an EBS root device with the Puppet client installed on it (and to use, if necessary, the user-data at the launch of the instance in order to set the parameters if a ‘static’ configuration on the AMI is not sufficient). However, in a production environment, the AMI and the EBS root device do not allow you to replace a Puppet: if you have to modify the AMI every time you change the parameters and redeploy the EC2… you’ll never finish. The AMI is a good tool for instantiating a basic template, but not for maintaining a production infrastructure in good working order.</p>
<p>To sum up, it is even possible to envisage auto-scalability (a more complete service than the one offered by Amazon’s <a title="Site de  Amazon Web Services, Rubrique Auto Scaling" href="http://aws.amazon.com/autoscaling/">Auto Scaling</a>, based on <a title="Site de Amazon Web Services, Rubrique Amazon CloudWatch" href="http://aws.amazon.com/cloudwatch/">CloudWatch</a>), which would amount to starting up this script when a value on a monitoring graph (metrology) exceeds a threshold, thereby instantiating a new instance to weather the peak period, an instance which would be ‘terminated’ after dipping below another threshold on the aforementioned graph. The possibilities are enormous. However, the cost of the final elements to be installed on a large production infrastructure to access the auto-scalability function is considerable (exponential complexity). If you get the chance, it’s an excellent handiwork, otherwise you’ll have to ‘settle’ for an easily scalable solution whereby you simply launch a script manually (or else at a fixed time based on the study of the metrics produced by the metrology, which is a satisfactory alternative). If necessary, manually adding one or two references in a file is a perfectly reasonable alternative.</p>
<p><em><strong>Execution of automated tasks in parallel</strong></em><strong><em><br />
</em></strong>Because of the variation in the number of instances according to the load of a scalable infrastructure, and particularly in the potentially large number of these instances, you cannot envisage carrying out maintenance and deployment operations on an individual basis for each machine (or manually, which is even worse!). This would not only be too time-consuming, but would also lead to errors. It is therefore essential to use tools specialising in automation and parallel task execution, such as <a title="Site de Capistrano" href="http://www.capify.org/">Capistrano</a>, which has numerous advantages:</p>
<ul>
<li>Scripting a certain number of tasks,      whether complex or not (deliveries, backups, site publication/maintenance,      etc.) executing them rapidly in parallel on X instances with a single      command.</li>
<li>Ensuring the reproducibility of a task.</li>
<li>Capitalise on know-how (Cf. Puppet).</li>
</ul>
<div id="attachment_1311" class="wp-caption alignnone" style="width: 654px"><img class="size-full wp-image-1311" title="Capistrano Task Descriptor" src="http://decrypt.ysance.com/wp-content/uploads/2010/06/cap_task.png" alt="Capistrano Task Descriptor" width="644" height="46" /><p class="wp-caption-text">Capistrano Task Descriptor</p></div>
<p><img class="size-medium wp-image-429 alignright" title="Logo Capistrano" src="http://decrypt.ysance.com/wp-content/uploads/2009/07/capistrano-logo-big-300x114.png" alt="Logo Capistrano" width="300" height="114" /></p>
<p>This tool is very practical and easy to use. It executes tasks in parallel (by connecting with SSH – don’t use the ‘root’ key of your EC2 instances in the tool, it’s classier to use a dedicated key…) on one or a group of servers defined by roles.</p>
<p>This tool should be used as a supplement to Puppet and not a replacement, as they do not have the same targets:</p>
<p><em><span style="text-decoration: underline;">Objective</span></em><br />
<span style="color: #339966;"><em>Puppet </em></span>- Uniform configuration of the server pool.<br />
<span style="color: #800080;"><em>Capistrano </em></span>– Task reproducibility and in-parallel execution.</p>
<p><em><span style="text-decoration: underline;">Operating mode</span></em><br />
<span style="color: #339966;"><em>Puppet </em></span>– Regular pull requests by clients (or even push from the master).<br />
<span style="color: #800080;"><em>Capistrano </em></span>- Occasional tasks (manual request or by cron).</p>
<p><em><span style="text-decoration: underline;">Orientation</span></em><br />
<span style="color: #339966;"><em>Puppet </em></span>- Pre-defined objects / notions such as ‘Package’, ‘Service’, ‘File’, etc.<br />
<span style="color: #800080;"><em>Capistrano </em></span>– Generic commands such as ‘upload’, ‘download’, ‘system’, ‘run’, etc.</p>
<p><em><span style="text-decoration: underline;">Target</span></em><br />
<span style="color: #339966;"><em>Puppet </em></span>- Infrastructure and services.<br />
<span style="color: #800080;"><em>Capistrano </em></span>- Services and applications.</p>
<p>Note that <a title="Site de Webistrano" href="http://labs.peritor.com/webistrano">Webistrano</a> is an HMI enabling access to the Capistrano features and introducing the notion of project management by managing access to the tasks according to profile, to trace who deployed what on which server and to send email signals in response to certain actions. I find this joint operation with project management very interesting.</p>
<p><strong><em>Monitoring</em></strong><br />
This is one of the crucial elements of a scalable architecture, if not the main one. It is essential to have the metrics to hand, precisely so you know when to scale. This enables you to identify the clogged points of the infrastructure, to analyse your site traffic and to make deductions about user behaviour. It also enables signals to be triggered.</p>
<p>The provision of metrics is more representative of metrology than of supervision. We will see that, in the context of an AWS infrastructure, metrology has greater added value than supervision (even if the latter remains indispensable). Speaking of which, there follows a clarification of the two monitoring disciplines that you need to recognise:</p>
<ul>
<li><strong>Supervision </strong>verifies the state of a host or a service and sends out an alarm upon detecting any abnormal behaviour (over-long response time, status NOK, etc.) and requires immediate action on the part of the interface partner concerned. An alarm must signify that the host or the service is unusable (critical) or may soon be (warning) and must not send back ‘simple information’ which would obstruct the visibility of real incidents.</li>
<li><strong>Metrology </strong>enables data to be archived, and if necessary, processed or filtered, before it is presented in the form of graphs or reports. This data enables corrections to service development or configuration to be carried out after the event, in order to optimise the aforementioned services, and equally to define the resources to be attributed to them in the most effective way. This aspect of monitoring is just as important, for it will enable the service to be improved (and thereby the users feedback) and also to reduce costs. The metrology results should clearly highlight the improvements to be made by correlating the values recovered.</li>
</ul>
<p>Quite a number of monitoring tools are available on the market, each with its pros and cons, some more supervision-oriented, others more towards metrology. Among them: <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 Zabbix" href="http://www.zabbix.com/">Zabbix</a>, <a title="Site de Cacti" href="http://www.cacti.net/">Cacti </a>and <a title="Site de  Munin" href="http://munin.projects.linpro.no/">Munin</a>. Personally I use Centreon/Nagios mainly for supervision and Cacti for software-oriented metrology with pre-packaged graphs such as for Apache, MySQL, Memcached, etc. I tried Munin, it lacks some of the useful features of Cacti but it is really easy to use and it matchs very well with Puppet (configuration based on descriptors and symlinks). I’ve also heard many good things about Zabbix (comprehensive range of features).</p>
<div id="attachment_388" class="wp-caption alignright" style="width: 414px"><img class="size-full wp-image-388 " title="Thread Scoreboard Apache - Yearly - 1 Day Average" src="http://decrypt.ysance.com/wp-content/uploads/2009/07/Thread-Scoreboard-Apache-Yearly-1-Day-Average.png" alt="Thread Scoreboard Apache - Yearly - 1 Day Average" width="404" height="262" /><p class="wp-caption-text">Thread Scoreboard Apache - Yearly - 1 Day Average</p></div>
<p>It should be noted that these tools operate mostly (Centreon, Cacti and Munin) on <a title="Site de RRDtool" href="http://oss.oetiker.ch/rrdtool/">RRDtool</a> (Round-Robin Database), a database management tool which also enables a graphic representation of the data contained in the base. The big advantage stems from the fact that the stored data volume is minimal, whether for storage of several months, or even years. This is made possible by calculating the averages of the time periods (from 1 minute to 1 day): the recent data is exact, whereas the older data is approximate.  This is very practical, as you have both the recent exact metrics and you keep the historic, a representation of the evolution of your architecture.  This is excellent for visualising the evolution of the key metrics and understanding the impact of the evolution of the components of the aforementioned infrastructure, or the applications supported as and when the different releases are delivered.</p>
<p>As for Cloud Computing-type infrastructures, metrology is the discipline with the highest added value, as it will enable feedback to your automation tools.</p>
<p>Keep in mind also that it’s interesting to be able to integrate dynamically the new instances installed and configured by Puppet in the monitoring tool. Give priority therefore to monitoring tools with modular configuration or simple access via APIs.</p>
<p><strong><em>Managing centralised logs </em></strong><br />
It’s undeniable: the more instances you have, the more scattered logs there’ll be on the various instances. Moreover, sending all the logs to the syslog daemon becomes difficult, as the infrastructure components do not necessarily manage it very well (redirection, respecting the syslog protocol, etc.), not to mention the application(s) / functional block(s) which can log in the various files on the server.</p>
<p><img class="size-full wp-image-1082 alignleft" title="Logo Syslog-NG" src="http://decrypt.ysance.com/wp-content/uploads/2010/03/syslog-ng.gif" alt="Logo Syslog-NG" width="200" height="47" /></p>
<p>Consider trying a tool such as <a title="Site de Syslog-NG" href="http://www.balabit.com/network-security/syslog-ng/">Syslog-NG</a>: it comprises a server and several clients, in fact it’s the same tool but with different configurations. What’s more, it is capable of regularly checking the log files (of business applications for example) and transmitting only the differential, even if it doesn’t respect the syslog protocol:</p>
<ul>
<li>The client recovers the files/pipe/unix-dgram/etc. logs and sends the information to the network (TCP/UDP).</li>
<li>The server recovers the information from the network (TCP/UDP) and registers it in files, databases, etc.</li>
</ul>
<div id="attachment_1314" class="wp-caption alignleft" style="width: 432px"><img class="size-full wp-image-1314 " title="Syslog-NG Architecture" src="http://decrypt.ysance.com/wp-content/uploads/2010/06/syslog-ng-archi.png" alt="Syslog-NG Architecture" width="422" height="255" /><p class="wp-caption-text">Syslog-NG Architecture</p></div>
<p>We’re talking about only minimal differences in terms of configuration. The component can also act as a relay on more complex infrastructures by receiving the network logs from diverse clients and sending them back to the network for a server.</p>
<p>It is possible to apply filters before sending the logs to the network in order to send only the essential ones. Next, filters can also be applied at the server level in order to manage differently the logs coming from clients, according to their urgency, sender program, source host, etc.</p>
<p>It’s a simple and non-intrusive tool able to take into account the logs of scattered applications on a server (even if these logs do not respect the syslog protocol format – there is however an advantage to respecting this protocol: greater accuracy of the facilities and priorities).</p>
<p>Keep in mind, the same as for monitoring, that it is interesting to be able to integrate (and withdraw) dynamically the new instances to be managed at the logs system level.</p>
<p><strong><em>Conclusion</em></strong><br />
Over and above the tools presented here, it is the underlying functions and capacities which are important. What stands out are the following:</p>
<ul>
<li>Tools such as centralised configuration managers, tools for the execution in parallel of automated tasks and also log managers, will become even more important. Working without them on such infrastructures is no longer conceivable.</li>
<li>Monitoring is still and will remain a key value, but metrology allows you, with the analysis of key defined metrics in your infrastructure, to sustain the automation tools.</li>
<li>Automation is indeed the key word promoted by AWS: the accessibility of the Hardware and Infrastructure resources via code allows us to move towards ever more autonomous architectures. However you must always position the cursor correctly, in the knowledge that the final stages of complete automation are the most expensive.</li>
</ul>
<p>I hope that this technical feedback will interest you as much as I enjoyed working on these infrastructures. I will continue in the second part of this article: Choosing the correct architecture model for scalable 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-1-the-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scaler une infrastructure AWS 2/2 : le modèle</title>
		<link>http://decrypt.ysance.com/2010/07/scaler-une-infrastructure-aws-2-le-modele/</link>
		<comments>http://decrypt.ysance.com/2010/07/scaler-une-infrastructure-aws-2-le-modele/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 14:41:53 +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=1304</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" />

Comment scaler une infrastructure <a title="Site de Amazon Web Services" href="http://aws.amazon.com/">AWS</a> (Amazon Web Services) ? Je vais décrire dans cette deuxième partie de l'article le modèle de l'architecture et les composants techniques sous-jacents à adopter afin de mettre en place une infrastructure scalable. Nous aborderons tout particulièrement le sujet de l'optimisation de l'accès aux données dans les architectures de type scale-out propices à la distribution, autant au niveau du modèle de données que des couches basses pour l'optimisation des I/O. Nous verrons également les concepts de développement à privilégier tel que le stateless dans la plus pure tradition REST. Je terminerai par quelques trucs et astuces en fin d'article. Le but est de vous permettre de constituer et d'optimiser votre infrastructure en comprenant le fonctionnement des outils proposés par Amazon pour en tirer le meilleur parti.

[...]]]></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>Comment scaler une infrastructure <a title="Site de Amazon Web Services" href="http://aws.amazon.com/">AWS</a> (Amazon Web Services) ? Je vais décrire dans cette deuxième partie de l&#8217;article le modèle de l&#8217;architecture et les composants techniques sous-jacents à adopter afin de mettre en place une infrastructure scalable. Nous aborderons tout particulièrement le sujet de l&#8217;optimisation de l&#8217;accès aux données dans les architectures de type scale-out propices à la distribution, autant au niveau du modèle de données que des couches basses pour l&#8217;optimisation des I/O. Nous verrons également les concepts de développement à privilégier tel que le stateless dans la plus pure tradition REST. Je terminerai par quelques trucs et astuces en fin d&#8217;article. Le but est de vous permettre de constituer et d&#8217;optimiser votre infrastructure en comprenant le fonctionnement des outils proposés par Amazon pour en tirer le meilleur parti.</p>
<p><strong><em>Le scale-out</em></strong><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" />Le scale-out est à opposer au scale-up : ce dernier correspond à l&#8217;augmentation dynamique des ressources d&#8217;un serveur donné (ajout de RAM ou de CPU) à la volée. Ainsi l&#8217;application continue à s&#8217;exécuter sur une même machine dont le potentiel à augmenté. Le scale-out, lui, pour répondre à la montée en charge d&#8217;une application propose d&#8217;augmenter le nombre de serveurs. Au final, le potentiel global de l&#8217;infrastructure augmente aussi, mais est réparti entre plusieurs serveurs. Cela implique que l&#8217;application supportée sur le serveur ait été pensée en termes de distribution, c&#8217;est à dire qu&#8217;elle puisse s&#8217;exécuter en parallèle sur plusieurs serveurs sans que cela n&#8217;en corrompe la logique métier ou ne pose des problèmes d&#8217;accès aux ressources (qui doivent alors être disponibles via le réseau et non en local sur un serveur donné par exemple).</p>
<p>Le scale-out, c&#8217;est un peu l&#8217;agent Smith de Matrix. Pour le scale-up, pensez plutôt au gentil bibendum de Ghost Buster !</p>
<p><em><strong>Stateless</strong></em><br />
Le meilleur moyen d&#8217;obtenir une application facilement distribuable et performante est de la penser en mode stateless. C&#8217;est à dire que c&#8217;est la requête du client qui doit contenir l&#8217;ensemble des informations qui vont permettre le traitement de ladite requête côté serveur, soit via un cookie ou bien via les paramètres de l&#8217;URL. Quand cela est possible il faut privilégier cette approche à tout prix par rapport au mode stateful dans lequel la partie serveur doit maintenir un contexte pour chaque client afin de pouvoir résoudre sa requête. La conception stateless fait partie des grands concepts du REST. A ce sujet, je ne peux que vous conseiller de lire cet <a title="REST, un style d'architecture universel" href="http://www.figer.com/publications/REST.htm">excellent article sur REST</a> de Jean-Paul Figer dans lequel vous pourrez comprendre toute la simplicité et la puissance du style.</p>
<p>Si vous êtes obligés de gérer du stateful, il vous faudra utiliser un cache réseau, tel que <a title="Site de Memcached" href="http://memcached.org/">Memcached</a>, pour partager les contextes entre vos différents serveurs. N&#8217;envisagez pas la formule cache local et sticky session, car vous aurez du mal à bénéficier d&#8217;une répartition fluide au niveau de votre load balancing. N&#8217;envisagez pas non plus un cluster qui communique en multicast car le réseau Amazon ne permet pas d&#8217;en faire&#8230; Ou bien alors il faudrait que tous les serveurs communiquent en unicast avec une gateway qui s&#8217;occupe de la redistribution des communications&#8230; Vous êtes sûr que vous ne préférez pas du stateless ? ;ob</p>
<p>La mise en place d&#8217;applications stateless n&#8217;est pas arrivée avec le Cloud Computing et les AWS, en revanche ne pas penser dans ce sens, vous empêcherait de bénéficier de tout le dynamisme et la souplesse proposés par ces services.</p>
<p><em><strong>Optimisation de l&#8217;accès aux données</strong></em><br />
L&#8217;optimisation de l&#8217;accès aux données passe par 2 éléments :</p>
<ul>
<li>Le modèle de données et l&#8217;architecture logicielle que l&#8217;on retrouve  dans les architectures scalables, que l&#8217;on soit sur une infrastructure  AWS ou non.</li>
<li>La gestion des I/O que l&#8217;on peut optimiser, notamment via une utilisation approfondie des AWS.</li>
</ul>
<p><em><span style="text-decoration: underline;">Le modèle scalable</span></em><br />
Cela pourrait faire l&#8217;objet d&#8217;un article à part entière, mais correspond  à un modèle assez classique au sein des applications de type casual  gaming ou bien plus généralement liées à des applications basées sur les  graphes sociaux ou bien centrées sur une notion métier forte en particulier.</p>
<p>Pour résumer, 2 méthodes de stockage de données :</p>
<ul>
<li>Un stockage de ce que l&#8217;on peut appeler le méta-modèle, qui n&#8217;a pas  vocation à être distribué, basé sur une base relationnelle (même si  essentiellement utilisée sous forme d&#8217;accès clé-valeur) structurée,  indexée, contenant les informations générales de chaque utilisateur  (dans la cas d&#8217;une application sociale, avec les informations <em>nom</em>, <em>top score</em>, <em>gains de la veille</em>, &#8230;), essentiellement accédées en  lecture et dont il est possible d&#8217;alléger la charge via un Memcached en frontal. Il est donc possible d&#8217;effectuer des requêtes ensemblistes de type SQL et ainsi de récupérer des informations via l&#8217;utilisation de clauses (<em>WHERE</em>). Cette base peut être un MySQL ou un PgSQL par exemple. Je vous invite à lire ce <a title="Dotdeb, MySQL et Amazon : RDS vs EC2" href="http://www.dotdeb.org/2010/05/04/mysql-on-amazon-benchmarks-rds-vs-ec2/">comparatif très intéressant</a> de Guillaume Plessis entre l&#8217;utilisation de MySQL installé sur un <a title="Site de Amazon Web Services, Rubrique EC2" href="http://aws.amazon.com/ec2/">EC2</a> et l&#8217;utilisation du service <a title="Site de Amazon Web Services, Rubrique RDS" href="http://aws.amazon.com/rds/">RDS</a> (Relational Database Service) d&#8217;Amazon. Je ne trahirai en rien le suspens en vous disant que la base de données c&#8217;est une histoire de barbus ! :o)</li>
<li>Un stockage pour les données plus volatiles (comme les données de jeu, &#8230;), avec un fort rapport  écriture/lecture, difficilement cachables, et pour lesquelles il faut  opter pour une réelle solution de stockage structurée non relationnelle  de type clé-valeur (NoSQL / Not only SQL diront certains), permettant  ainsi de distribuer facilement les données sur X serveurs. On peut citer un nombre  certain de candidats : <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>, &#8230; Et également les nouveaux modèles peer to peer tels que <a title="Site de Cassandra" href="http://cassandra.apache.org/">Cassandra</a>, &#8230;</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>En l&#8217;occurrence, Tokyo Tyrant / Tokyo Cabinet est une solution que j&#8217;ai mise en place et qui me semble bonne. C&#8217;est un couple gérant respectivement les requêtes à partir de  serveurs distants (interface réseau) et les accès au système de  stockage. 6 APIs sont disponibles afin de stocker les données :</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>Chacune d’entre elles a ses propres spécificités et répond à des  besoins particuliers en termes de performances et de fonctionnalités.</p>
<p>Au niveau performances, outre ses performances naturelles, il a  l&#8217;avantage, notamment, de ne pas gérer l&#8217;authentification (standard chez les  systèmes de stockage clé-valeur, la sécurité est censée être assurée au niveau réseau pour les accès au système de stockage et au niveau applicatif pour les accès à la donnée &#8211; pour ne récupérer que ce qui vous concerne), ce qui allège le nombre d&#8217;accès (pas besoin de  requêtes d&#8217;authentification) par rapport à une base de données classique.  De plus, pas de gestion d&#8217;index lourds à reconstruire (possible  cependant sur l&#8217;API &laquo;&nbsp;Table&nbsp;&raquo; de la Tokyo Team), &#8230; Est-il nécessaire de préciser que ce  qui vous prendra du temps sur l’accès à la donnée via le réseau (entre  le serveur web ou applicatif et Tokyo Tyrant) c’est… Le réseau ! Donc  dans tous les cas, préférez l’utilisation au niveau client (API) de  « mget » (multi get), par exemple, en positionnant en paramètre le  tableau de clés que vous souhaitez récupérer, plutôt que d’effectuer N  fois un « get » à partir du client, donc N accès réseau. « mget » se  résoudra, lui, au niveau de Tokyo Tyrant.</p>
<p>Ces raisonnements appliqués sur cet outil doivent être appliqués à tout stockage de type clé-valeur.</p>
<p><span style="text-decoration: underline;"><em>La gestion des I/O</em></span><br />
Venons-en à la spécificité des AWS en termes de stockage : les <a title="Site de Amazon Web Services, Rubrique EBS" href="http://aws.amazon.com/ebs/">EBS</a> (Elastic Block Store). Les EBS sont des disques réseau optimisés en I/O, faciles à  manipuler, permettant d&#8217;assurer la durabilité des données qui ne doivent  pas être perdues lors de l&#8217;arrêt d&#8217;un EC2 (volatile). J&#8217;ai cependant  constaté de manière empirique des écarts de latence : pas énormes, mais  sur une application réellement sollicitée, il y a un ressenti.  Ce n&#8217;est pas rédhibitoire, il faut juste en tenir compte. Si le Load  Average de vos serveurs augmente, ce n&#8217;est pas forcément le CPU en  cause&#8230; Pensez I/O ! ;ob</p>
<p>Tout d&#8217;abord penser striping, donc RAID0. Pas besoin de mirroring (RAID1), la  durabilité des EBS est déjà assurée par Amazon, de manière transparente, par réplication réseau :  tirons parti de ce service et concentrons nous sur le striping. Pensez  également à répartir les écritures des différents fichiers physiques  (données, updates logs, …) sur différents disques (dans le cas d&#8217;outils  utilisant des update logs, et c&#8217;est le cas pour MySQL et Tokyo Tyrant  par exemple, pensez à bien paramétrer leur taille). C&#8217;est ce qui permet  d&#8217;avoir les meilleures optimisations. Ensuite, choisissez bien votre  système de fichier par rapport à votre outil (EXT3, XFS, …) et pensez  aux options de montage (noatime, nodiratime, &#8230;). Finalement vérifiez  bien le scheduler/ordonnanceur par défaut sur les instances EC2 que vous  démarrez : par défaut, il s&#8217;agit de l&#8217;ordonnanceur NOOP (requêtes I/O  dans une simple file FIFO). Envisagez quelque chose de plus performant  comme CFQ (Completely Fair Queuing) par exemple&#8230; Enfin je dis ça, mais cela dépend toujours de la couche logiciel au-dessus et si et comment elle gère les priorités : <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/">dans cet exemple</a> (qui n&#8217;est pas sur EBS) sur MySQL Performance Blog, il apparaît que les ordonnanceurs NOOP et DEADLINE peuvent être de meilleure facture pour améliorer les I/O InnoDB. Comme quoi, il faut quand même mieux tester dans son propre cas ! ;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>Un autre outil que j&#8217;ai utilisé avec les EBS et qui fonctionne très  bien est LVM2 (Logical Volume Management, version 2). Je ne l&#8217;ai pas  utilisé dans le cadre d&#8217;une architecture avec un nombre élevé d&#8217;IOPS (I/O operations Per Second) et n&#8217;ai donc pas  testé les possibilités de striping (RAID0) offertes par l&#8217;outil. En revanche, je l&#8217;ai utilisé dans  le cadre d&#8217;une infrastructure nécessitant de pouvoir supporter des  augmentations conséquentes du volume de données et ceci sans  interruption de service. L&#8217;opération de snapshot d&#8217;un EBS et de  recréation du volume est trop longue. LVM est la solution, puisque cette couche d&#8217;abstraction permet de gérer des volumes logiques de manière indépendante  des ressources physiques : il suffit de lever une nouvelle ressource EBS  (une ligne de commande), de l&#8217;associer à l&#8217;instance EC2 (une autre  ligne de commande) et d&#8217;ajouter cette ressource au pool de ressources  LVM. Il suffit alors d&#8217;agrandir le volume logique (toujours transparent et sans arrêt du service), puis  d&#8217;étendre le système de fichiers. C&#8217;est la dernière  opération (qui est commune avec celle de la recréation du volume EBS) qui peut nécessiter d&#8217;arrêter le service quelques instants (une dizaine de secondes). A noter qu&#8217;il est possible d&#8217;étendre son système de fichiers à chaud avec EXT3, personnellement, je préfère une interruption de service de quelques secondes sur ce genre d&#8217;opérations très courtes mais cruciales. ;ob En  prime, il est facile de d&#8217;effectuer des backups sur un système LVM qui  propose une option de snapshot différentiel que l&#8217;on peut monter comme  un volume logique indépendant : lorsqu&#8217;il y a une modification sur le  volume origine, la valeur initiale est copiée dans le volume snapshoté,  donc on peut snapshoter des volumes importants sur un espace réduit car  seule la fréquence de modification est importante. Vous pourrez trouver de plus amples informations sur LVM2 et EBS en consultant ce <a title="Decrypt, EBS et LVM2 ou comment optimiser l’élasticité des AWS" href="http://decrypt.ysance.com/2010/06/ebs-et-lvm2-ou-comment-optimiser-elasticite-des-aws/">très bon article</a> de Laurent Roux.</p>
<p>Tous ces exemples, pour montrer que les EBS sont une ressource très  intéressante : il faut les considérer tout d&#8217;abord comme un moyen d&#8217;assurer la durabilité des ressources importantes avant de considérer l&#8217;aspect performance. En effet, la performance n&#8217;est pas forcément meilleure sur un EBS que sur les disques locaux d&#8217;une instance EC2 (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">un test simple et intéressant</a> de Charles-Christian Croix ou bien encore des tests un peu plus complexes que vous pourrez retrouver en tapant <em>&laquo;&nbsp;performance ephemeral disk ebs volume raid&nbsp;&raquo;</em> dans Google, il y en a un certain nombre de très intéressants et je dois avouer que j&#8217;ai du mal à faire mon choix ;ob). Cependant, quand on prend le parti d&#8217;assurer la durabilité de ses données et donc d&#8217;utiliser un EBS (qui, pour ceux qui connaissent, est comparable à un LUN sur un SAN), il y a divers moyens d&#8217;optimiser leur performance.</p>
<p>Il est à noter que les utiliser pour répartir les fichiers (et donc les I/O) sur plusieurs disques EBS peut être une solution de performance pure.</p>
<p>A noter tout de même que la bande passante de l&#8217;EC2 est forcément limitant arrivée à un certain seuil : ajouter des EBS est intéressant pour lisser les écarts de variance (en RAID0) ou bien pour optimiser le débit, mais il n&#8217;en reste pas moins que si vous ajoutez plusieurs EBS à votre instance EC2 et qu&#8217;ils sont tous sollicités fortement&#8230; C&#8217;est la bande passante de l&#8217;EC2 qui bloque. Il va falloir ajouter un nouvel EC2 (scale-out pour augmenter les ressources, en l&#8217;occurrence la bande passante), lui attacher de nouveaux EBS (n&#8217;oubliez pas qu&#8217;un EBS ne peut être attaché qu&#8217;à un et un seul EC2) et distribuer la donnée dessus (sharding).</p>
<p>Dans tous les cas, la manipulation des EBS est aisée et cette souplesse est un  atout.</p>
<p><em><strong>Tips &amp; tricks</strong></em><br />
Cette dernière partie regroupe quelques trucs et astuces.</p>
<p><em><span style="text-decoration: underline;">Alias &amp; IPs</span></em><br />
Pensez sur une infrastructure AWS à positionner des alias  correspondant aux IPs privées de vos instances dans le fichier des &laquo;&nbsp;hosts&nbsp;&raquo;, que vous pouvez déployer ensuite via <a title="Site de Puppet" href="http://www.puppetlabs.com/">Puppet</a> pour plus de réactivité vu que les IPs sont &laquo;&nbsp;variables&nbsp;&raquo; (lorsque vous arrêtez une instance et que vous en redémarrez une juste après, vous ne conservez pas la même IP). L&#8217;utilisation du  fichier &laquo;&nbsp;hosts&nbsp;&raquo; évite des résolutions DNS internes chez Amazon.</p>
<p><em><span style="text-decoration: underline;">CDN &amp; S3 Headers</span></em><br />
Pour les CDN (Content Delivery Network) que vous utilisez  obligatoirement dans une architecture scalable, pensez à utiliser S3 afin  de mettre à disposition les images et autres contenus statiques.  Inutile de maintenir un serveur Web à cette seule fin, S3 est là pour ça  pour un coût minime.</p>
<p>Pensez également dans certains cas, où votre trafic est plus modéré et où vous ne souhaitez pas passer par un CDN (pour des questions de coût par exemple ;ob), que vous pouvez toujours optimiser la gestion de vos ressources sur S3 en utilisant les méta-données attribuées aux dites ressources sur S3, en positionnant, par exemple, les headers de type <em>Cache-Control</em> ou <em>Expires</em>. Vous pouvez visualiser ces méta-données via le nouvel <a title="Site de Amazon Web Services, Console AWS, Onglet S3" href="https://console.aws.amazon.com/s3/home">onglet S3</a> de la console d&#8217;administration Amazon.</p>
<p><span style="text-decoration: underline;"><em>Backups&#8230;</em><em> What else ?</em></span><br />
S3 est également la solution pour les backups. Je n&#8217;ai pas trouvé  d&#8217;outils intégrés satisfaisants pour cette tâche : j&#8217;utilise simplement un  outil en ligne de commande &laquo;&nbsp;<a title="Site de s3tools, s3cmd" href="http://s3tools.org/s3cmd">s3cmd</a>&nbsp;&raquo; afin de stocker mes backups. J&#8217;ai intégré cet  outil dans des tâches <a title="Site de Capistrano" href="http://www.capify.org/">Capistrano</a> appelées par cron. Très  simple d’utilisation, s3cmd permet de consommer les services de S3 et offre la  possibilité de transférer les données en HTTPS et également de les  stocker sous un format crypté.</p>
<p><em><strong>Conclusion</strong></em><br />
Il y aurait encore beaucoup de choses à dire sur ce sujet, mais ce  sont à mon avis les principales, en tout cas par rapport à l&#8217;utilisation des services mis à disposition par les AWS. Ce qu&#8217;il en ressort, c&#8217;est :</p>
<ul>
<li>Le stateless et REST de manière générale, sont d&#8217;autant plus adaptés aux AWS qu&#8217;ils permettent de distribuer aisément la charge sur une infrastructure s&#8217;adaptant à la montée en charge sur un modèle scale-out.</li>
<li>L&#8217;accès aux données est toujours le goulet d&#8217;étranglement des applications distribuées devant scaler. Il s&#8217;agit de travailler à ce niveau le modèle de données et de tirer parti des systèmes de stockage adéquates :
<ul>
<li>Technologies SQL pour les méta-données pouvant nécessiter du requêtage ensembliste et de la mise en  relation, tout en utilisant au maximum un cache réseau pour les informations avec un fort ratio lecture sur écriture.</li>
<li>Technologies NoSQL / Not only SQL / clé-valeur pour les informations pouvant être accédées par une clé unique, et ainsi bénéficier de la distribution inhérente au scale-out.</li>
</ul>
</li>
<li>Penser finalement aux couches basses en sélectionnant convenablement le système de fichiers et l&#8217;ordonnanceur. Pensez également RAID (striping) et LVM (extension de volume et snapshot différentiel) pour tirer parti de la souplesse d&#8217;utilisation des EBS et répartition des I/O sur différents devices (en prenant toujours garde à votre bande passante, au niveau EC2, qui peut devenir limitant : dans ce cas ajouter une ou plusieurs instances EC2 pour gagner en bande passante et distribuer &#8211; sharder &#8211; la donnée sur de nouveaux EBS).</li>
</ul>
<p>J&#8217;espère que ce deuxième volet de mon retour d&#8217;expérience sur la scalabilité des infrastructures AWS vous aura intéressé.</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/07/scaler-une-infrastructure-aws-2-le-modele/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

