<?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; Puppet</title>
	<atom:link href="http://decrypt.ysance.com/tag/puppet/feed/" rel="self" type="application/rss+xml" />
	<link>http://decrypt.ysance.com</link>
	<description>Le site de decryptage des technologies de l&#039;informatique</description>
	<lastBuildDate>Thu, 12 Aug 2010 20:40:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>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 1/2 : les outils</title>
		<link>http://decrypt.ysance.com/2010/06/scaler-une-infrastructure-aws-1-les-outils/</link>
		<comments>http://decrypt.ysance.com/2010/06/scaler-une-infrastructure-aws-1-les-outils/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 15:03:56 +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=1056</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" />

Comment scaler une infrastructure <a title="Site de Amazon Web Services" href="http://aws.amazon.com/">AWS</a> (Amazon Web Services) ? C'est une réponse détaillée que va apporter cet article en 2 parties : les outils à utiliser pour tirer parti du dynamisme des services Amazon et le modèle d'architecture à adopter pour une infrastructure scalable. Je me base sur mes expériences tirées de plusieurs projets de production sur les AWS, à la fois dans le domaine du casual gaming (sur Facebook), dans celui des infrastructures e-commerce ou bien encore dans le cadre du SIG (Système d'Information Géographique) grand public. Il est vrai que l'expérience dans le domaine du jeu est celle qui est actuellement la plus représentative en termes de scalabilité, du fait du nombre d'utilisateurs (&#62; 800K DAU - Daily Active User - et plus de 20M de pages vues par jour), cependant les expériences dans le e-commerce et le SIG (expérience en cours :o)) offrent également une autre vision de la scalabilité, prenant en compte des problématiques différentes de disponibilité et de gestion des données. Je vais donc tenter de brosser un tableau exhaustif des éléments à prendre en compte afin d'optimiser le dynamisme d'une infrastructure montée dans un environnement de Cloud Computing et en l'occurrence dans celui des AWS.

[...]]]></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>Comment scaler une infrastructure <a title="Site de Amazon Web Services" href="http://aws.amazon.com/">AWS</a> (Amazon Web Services) ? C&#8217;est une réponse détaillée que va apporter cet article en 2 parties : les outils à utiliser pour tirer parti du dynamisme des services Amazon et le modèle d&#8217;architecture à adopter pour une infrastructure scalable. Je me base sur mes expériences tirées de plusieurs projets de production sur les AWS, à la fois dans le domaine du casual gaming (sur Facebook), dans celui des infrastructures e-commerce ou bien encore dans le cadre du SIG (Système d&#8217;Information Géographique) grand public. Il est vrai que l&#8217;expérience dans le domaine du jeu est celle qui est actuellement la plus représentative en termes de scalabilité, du fait du nombre d&#8217;utilisateurs (&gt; 800K DAU &#8211; Daily Active User &#8211; et plus de 20M de pages vues par jour), cependant les expériences dans le e-commerce et le SIG (expérience en cours :o)) offrent également une autre vision de la scalabilité, prenant en compte des problématiques différentes de disponibilité et de gestion des données. Je vais donc tenter de brosser un tableau exhaustif des éléments à prendre en compte afin d&#8217;optimiser le dynamisme d&#8217;une infrastructure montée dans un environnement de Cloud Computing et en l&#8217;occurrence dans celui des AWS.</p>
<p><em><strong>Les outils</strong></em><br />
Je propose des exemples d&#8217;outils que j&#8217;ai utilisés dans mes différentes expériences de production et qui m&#8217;ont convaincu par leur efficacité. Cependant, ce n&#8217;est pas tant l&#8217;outil qui est mis en valeur que la  fonctionnalité sous-jacente qu&#8217;il va falloir implémenter pour tirer parti au mieux des AWS.</p>
<p><strong><em>Différence entre une infra AWS et une infra standard</em></strong><br />
Il y a 2 éléments de réponse :</p>
<ul>
<li> Tout d&#8217;abord, les AWS permettent de manipuler les composants  Hardware et d&#8217;Infrastructure via la code (en passant par des APIs), cela  permet un dynamisme qu&#8217;il va falloir exacerber en sélectionnant  convenablement ses outils. Amazon propose de plus un certain nombre de  garanties techniques sur leurs services, il conviendra d&#8217;en tirer parti  afin de se concentrer sur l&#8217;essentiel.</li>
<li> Ensuite, une seconde partie de la réponse devrait être : « aucune !  ». Cependant, force est de constater que bien souvent le côté plus  douillet de l’infrastructure hébergée « à la maison » pousse à une  certaine forme de laxisme sur un certain nombre de points. Le fait que  Amazon, avec ses AWS, propose une solution volatile, au niveau des EC2  notamment, oblige à mettre en place des mécanismes qui devraient être  standards.</li>
</ul>
<p><strong><em>Gestion de configuration centralisée<br />
</em></strong>La possibilité d&#8217;instancier de multiples serveurs (EC2) à la volée pour répondre à un pic de charge ou des traitements ponctuels, nous oblige à utiliser un outil de gestion de configuration centralisée. L’utilité est multiple :</p>
<ul>
<li>Instancier rapidement une machine correspondant à un type prédéfini : serveur Web, serveur de cache, …</li>
<li>Assurer l’homogénéité de la configuration de l&#8217;ensemble des instances d’un même type à tout instant.</li>
<li>Capitaliser un savoir faire : les packages, configurations, services, &#8230; de chaque type d&#8217;instance est contenu dans un descripteur. Cela permet aux nouveaux venus (et aux autres) de connaitre la composition des serveurs sur la simple lecture du ou des descripteurs associé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> est une solution très intéressante pour cette tâche. L&#8217;architecture Puppet est constituée de:</p>
<ul>
<li>Un Puppet Master, gardien des configurations, il contient les descripteurs des packages à installer, fichiers de configuration à déposer et services à démarrer pour une nouvelle instance EC2 afin de la préparer suivant le type du ou des nœuds auxquels on l’a associée ou tout simplement pour maintenir à jour une instance existante.</li>
<li>De multiples clients Puppet installés sur les instances EC2. Régulièrement, le client poll (interroge) le master afin de vérifier que sa configuration est à jour. Il est également possible de faire du push sur les clients à partir du master pour déclencher une mise à jour urgente.</li>
</ul>
<p>Il est ainsi très simple de monter une nouvelle instance d’un type donné et d’être sûr que, d’un serveur à un autre, la configuration est complètement identique. Il est à noter que les descripteurs du Puppet Master fonctionnent sur un système de nœuds et un serveur peut faire référence à plusieurs nœuds. On obtient donc une configuration très modulaire.</p>
<div id="attachment_1310" class="wp-caption alignleft" style="width: 306px"><img class="size-medium wp-image-1310 " title="Descripteur Module Puppet" src="http://decrypt.ysance.com/wp-content/uploads/2010/06/puppet_type_node_def-296x300.png" alt="Descripteur Module Puppet" width="296" height="300" /><p class="wp-caption-text">Descripteur Module Puppet</p></div>
<p>Le gestionnaire de configuration centralisée est indispensable sur une infrastructure scalable qui est amenée à avoir un grand nombre d&#8217;instances dont certaines devront être montées rapidement afin de répondre aux sollicitations des utilisateurs lors des pics de charge.</p>
<p>« Mais… », me direz-vous, « il faut bien installer le client sur la nouvelle machine ? ». Et oui, d’autant plus qu’il y a un système de requête/acceptation de certificat entre le client et le master afin que n’importe qui ne puisse accéder aux configurations. « Très simple ! », vous répondrais-je, au lieu d’utiliser une IHM, comme Elastic Fox, afin de se connecter aux APIs des services Amazon, il suffit de s’y connecter en lignes de commande via un script qui instancie un EC2, éventuellement crée un volume EBS et l’associe, se connecte en SSH sur la nouvelle machine et installe le client, se connecte sur le master et accepte la requête de certificat, redémarre le client et « hop ! ». L&#8217;instance s&#8217;installe et se configure toute seule. Les possibilités de réactivité et de dynamisme inhérentes aux EC2 et aux AWS de manière générale nous impose cela, sinon ce serait sous exploiter l’outil, voire le més-exploiter.</p>
<p>Et les AMIs (instance-store root devices) ou les EBS root devices (à noter que pour ces dernier, il n&#8217;y a pas encore beaucoup de choix en termes de templates) ? Il est cependant possible de se constituer une AMI ou bien un EBS root device avec le client Puppet installé dessus (et d&#8217;utiliser éventuellement les user-data au lancement de l&#8217;instance afin de le paramétrer si une configuration &laquo;&nbsp;statique&nbsp;&raquo; sur l&#8217;AMI n&#8217;est pas suffisante). Cependant, dans un environnement de production, l&#8217;AMI ou l&#8217;EBS root device ne permettent pas de remplacer un Puppet : si il faut modifier l’AMI à chaque modification de paramétrage et redéployer les EC2… On n’a pas fini. L’AMI est un bon outil pour instancier un template de base (au sens basique), pas pour conserver une infrastructure de production en bon ordre de fonctionnement.</p>
<p>Pour conclure, il est même possible d&#8217;envisager une auto-scalabilité (plus complète que celle proposée par le service <a title="Site de Amazon Web Services, Rubrique Auto Scaling" href="http://aws.amazon.com/autoscaling/">Auto Scaling</a> d&#8217;Amazon basé sur <a title="Site de Amazon Web Services, Rubrique Amazon CloudWatch" href="http://aws.amazon.com/cloudwatch/">CloudWatch</a>) qui reviendrait à déclencher ce script sur le dépassement d’une valeur d’un graphe de monitoring (métrologie), instanciant donc une nouvelle machine pour supporter la période de pic, instance qui serait « terminée » suite au passage en dessous d&#8217;un autre seuil sur ledit graphe. Les possibilités sont énormes. Cependant, le coût des derniers éléments à mettre en place sur une infrastructure importante de production pour accéder à l&#8217;auto-scalabilité est conséquent (complexité exponentielle). Si on a l&#8217;opportunité, c&#8217;est un bel ouvrage, sinon se &laquo;&nbsp;contenter&nbsp;&raquo; d&#8217;une solution aisément scalable où il suffit de lancer un script manuellement (ou bien à heure fixe basé sur l&#8217;étude des métriques remontés par la métrologie, ce qui est une bonne alternative) et éventuellement d&#8217;ajouter manuellement une ou deux références dans un fichier est une alternative tout à fait respectable.</p>
<p><strong><em>Exécution de tâches automatisées en parallèle</em></strong><br />
Du fait de la variation du nombre d’instances en fonction de la charge d&#8217;une infrastructure scalable et surtout du nombre potentiellement important desdites instances, il n’est pas envisageable d’effectuer les opérations de maintenance et de déploiement unitairement sur chaque machine (et encore pire à la main !), ce qui non seulement serait chronophage, mais de surcroît source d’erreurs. Il est alors indispensable d’utiliser des outils spécialisés dans l’automatisation et l’exécution parallèle de tâches, tel que <a title="Site de Capistrano" href="http://www.capify.org/">Capistrano</a>, dont les bénéfices sont multiples :</p>
<ul>
<li>Scripter un certain nombre de tâches, complexes ou non, (livraisons, backups, publication/maintenance du site, …) et de les exécuter rapidement en parallèle sur X machines en une seule commande.</li>
<li>Assurer la reproductibilité d’une tâche.</li>
<li>Capitaliser un savoir faire (Cf. Puppet).</li>
</ul>
<div id="attachment_1311" class="wp-caption alignnone" style="width: 654px"><img class="size-full wp-image-1311" title="Descripteur Tache Capistrano" src="http://decrypt.ysance.com/wp-content/uploads/2010/06/cap_task.png" alt="Descripteur Tache Capistrano" width="644" height="46" /><p class="wp-caption-text">Descripteur Tache Capistrano</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>Cet outil est très simple d’utilisation et très pratique. Il exécute des tâches en parallèle (en se connectant en SSH &#8211; n&#8217;utilisez pas la clé &laquo;&nbsp;root&nbsp;&raquo; de vos instances EC2 dans l&#8217;outil, mais une autre dédiée, c&#8217;est plus classe&#8230;) sur un ou des groupes de serveurs définis par des rôles.</p>
<p>C&#8217;est un complément à Puppet et non un doublon car ils n&#8217;ont pas la même cible :</p>
<p><span style="text-decoration: underline;"><em>Objectif</em></span><br />
<span style="color: #339966;"><em>Puppet </em></span>- Homogénéité de la configuration du parc de serveurs.<br />
<span style="color: #800080;"><em>Capistrano </em></span>- Reproductibilité des tâches et exécution en parallèle.</p>
<p><span style="text-decoration: underline;"><em>Mode de fonctionnement</em></span><br />
<em><span style="color: #339966;">Puppet </span></em>- Pull régulier des clients (voire push du master).<br />
<span style="color: #800080;"><em>Capistrano </em></span>- Tâches ponctuelles (appel manuel ou par cron).</p>
<p><span style="text-decoration: underline;"><em>Orientation</em></span><br />
<span style="color: #339966;"><em>Puppet </em></span>- Objets / notions prédéfinis tels que « Package », « Service », « File », …<br />
<em><span style="color: #800080;">Capistrano </span></em>- Des commandes génériques comme « upload », « download », « system », « run », …</p>
<p><span style="text-decoration: underline;"><em>Cible</em></span><br />
<span style="color: #339966;"><em>Puppet </em></span>- Infrastructure et services.<br />
<span style="color: #800080;"><em>Capistrano </em></span>- Services et applicatif.</p>
<p>A noter, <a title="Site de Webistrano" href="http://labs.peritor.com/webistrano">Webistrano</a> est une IHM  permettant d’accéder aux fonctionnalités de Capistrano et introduisant  une notion de gestion de projet par la possibilité de gérer les accès  aux tâches en fonction de son profil, de tracer qui a déployé quoi sur  quel serveur et d’envoyer des alertes mails sur certaines actions. Je trouve cette jointure avec la gestion de  projet intéressante.</p>
<p><em><strong>Monitoring</strong></em><br />
C&#8217;est un des éléments cruciaux d&#8217;une architecture scalable, si ce n&#8217;est le principal. Il est indispensable d’avoir à disposition des métriques afin de savoir justement quand scaler. Il permet d’identifier les points d’engorgement de l’infrastructure, d&#8217;analyser l’évolution du trafic sur votre site et d&#8217;en déduire les comportements des utilisateurs et permet également de déclencher des alertes.</p>
<p>Cet apport de métriques est plus représentatif de la métrologie que de la supervision. On verra que, dans le cadre d&#8217;une infrastructure sur AWS, la métrologie a une valeur ajoutée plus importante que celle de la supervision (même si cette dernière reste indispensable). A ce propos, voici un éclaircissement sur les 2 disciplines du monitoring qu&#8217;il faut identifier :</p>
<ul>
<li>La <strong>supervision </strong>vérifie l’état d’un hôte ou d’un service et remonte une alerte sur la détection d’un comportement anormal (temps de réponse trop long, statut NOK, …) et implique une action immédiate de la part des interlocuteurs concernés. Une alerte doit signifier que l’hôte ou le service est inutilisable (critical) ou risque de l’être (warning) et ne pas renvoyer de « simples informations » qui pollueraient la visibilité des réels incidents.</li>
<li>La <strong>métrologie </strong>permet d’historiser les données, éventuellement d’appliquer un traitement ou filtre dessus, avant de les présenter sous forme de graphiques ou de reporting. Ces données permettent d’apporter un correctif à postériori au niveau développement ou paramétrage des services afin d’apporter une optimisation desdits services et également de définir les ressources à attribuer aux services au plus  juste. Cet aspect du monitoring est tout aussi important car il va permettre d’améliorer le service et donc le rendu des utilisateurs (internes ou clients finaux) et également de lisser les coûts. Les résultats issus de la métrologie doivent mettre aisément en valeur les améliorations à apporter en corrélant les valeurs récupérées.</li>
</ul>
<p>Un certain nombre existent sur le marché avec leurs avantages et inconvénients, certains plus orientés supervision, d&#8217;autres plus métrologie. On citera <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>ou encore <a title="Site de Munin" href="http://munin.projects.linpro.no/">Munin</a>. Personnellement, j&#8217;utilise Centreon/Nagios essentiellement pour la  supervision et Cacti pour la métrologie orientée logicielle avec des  graphes pré-packagés comme pour Apache, MySQL, Memcached, &#8230; Mais j&#8217;ai  eu de nombreux bons écho sur Zabbix pour son exhaustivité de  fonctionnalités et Munin pour sa simplicité d&#8217;utilisation.</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>Il est à noter que ces outils fonctionnent pour la plupart (Centreon, Cacti et Munin) sur <a title="Site de RRDtool" href="http://oss.oetiker.ch/rrdtool/">RRDtool</a> (Round-Robin Database), un outil de gestion de base de données permettant également de représenter graphiquement les données contenues dans la base. Le gros avantage tient dans le fait que le volume de données stockées est minimal même pour la conservation de plusieurs mois, voire années de données. Cela est rendu possible par le calcul de moyennes sur des périodes (de 1 minute à 1 jour) : les données récentes sont exactes, alors que les plus anciennes sont approximées. Très pratique car nous avons à la fois des métriques récentes exactes et conservons un historique, une représentation de l&#8217;évolution de notre architecture, ce qui est capital afin de visualiser l&#8217;évolution des métriques clés et de comprendre les impacts de l’évolution des composants de ladite infrastructure ou bien des applications supportées au fur et à mesure des livraisons des différentes releases.</p>
<p>Concernant les infrastructures de type Cloud Computing, la discipline  ayant la plus forte valeur ajoutée est la métrologie, car c&#8217;est elle qui  va permettre d&#8217;apporter un feed back à vos outils d&#8217;automatisation.</p>
<p>Gardez à l&#8217;esprit également qu&#8217;il est intéressant de pouvoir intégrer dynamiquement les nouvelles machines installées et configurées par Puppet dans l&#8217;outil de monitoring. Privilégiez donc les outils de monitoring avec une configuration modulaire, ou simple d&#8217;accès via APIs.</p>
<p><em><strong>Gestion des logs centralisée</strong></em><br />
C&#8217;est indéniable, plus vous aurez d&#8217;instances, plus vous aurez de logs éparses sur les diverses instances. De plus, diriger tous les logs vers le daemon syslog devient problématique car tous les composants de l&#8217;infrastructure ne gèrent pas forcément bien cela (redirection, respect du protocole syslog, &#8230;), sans parler de la ou des applications/briques fonctionnelles qui peuvent loguer dans des fichiers disparates sur le serveur.</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>Pensez à des outils comme <a title="Site de Syslog-NG" href="http://www.balabit.com/network-security/syslog-ng/">Syslog-NG</a> : il est composé d&#8217;un serveur et de plusieurs clients, en fait le même outil mais avec des configurations différentes. En plus, il est capable de vérifier régulièrement des fichiers de logs (d&#8217;applications métier par exemple) et de transmettre uniquement le différentiel, même si celui-ci ne respecte pas le protocole syslog :</p>
<ul>
<li>Le client récupère les logs de files(fichiers)/pipe/unix-dgram/&#8230; et envoie les infos sur le réseau (tcp/udp).</li>
<li>Le serveur récupère les infos du réseau (tcp/udp) et les enregistre dans des fichiers, bases de données, &#8230;</li>
</ul>
<div id="attachment_1314" class="wp-caption alignleft" style="width: 432px"><img class="size-full wp-image-1314 " title="Architecture Syslog-NG" src="http://decrypt.ysance.com/wp-content/uploads/2010/06/syslog-ng-archi.png" alt="Architecture Syslog-NG" width="422" height="255" /><p class="wp-caption-text">Architecture Syslog-NG</p></div>
<p>Il s&#8217;agit juste de différences minimes en termes de configuration. Le composant peut également servir de relai sur des infrastructures plus complexes en recevant les logs du réseau à partir de divers clients et en les envoyant à nouveau sur le réseau à destination d’un serveur.</p>
<p>Il est possible d’appliquer des filtres avant d’envoyer les logs sur le réseau pour ne faire transiter que le nécessaire et ensuite il est également possible d’en appliquer au niveau du serveur pour gérer différemment les logs en provenance des clients en fonction de leur criticité, programme émetteur, hôte d’origine, …</p>
<p>C’est un outil simple et non intrusif pouvant prendre en compte les logs des applications éparses sur un serveur (même si ces logs ne respectent pas le format du protocole « syslog » &#8211; il y a cependant un plus à respecter ce protocole pour avoir une meilleure précision au niveau des « facilities » et « priorities »).</p>
<p>De même que pour le monitoring, gardez à l&#8217;esprit qu&#8217;il est intéressant de pouvoir intégrer (et retirer) dynamiquement les nouvelles instances à gérer au niveau du système de logs.</p>
<p><em><strong>Conclusion</strong></em><br />
Au delà des outils présentés, ce sont les fonctionnalités sous-jacentes qui sont importantes. Ce qu&#8217;il  en ressort, c&#8217;est :</p>
<ul>
<li>Les outils comme  les gestionnaires de configuration centralisée, les  outils d&#8217;exécution  de tâches automatisées en parallèle ou bien les gestionnaires  de logs vont  prendre encore plus d&#8217;importance. Il n&#8217;est plus  envisageable de  travailler sans sur de telles infrastructures.</li>
<li>Le monitoring est  toujours une valeur clé et le restera, mais la métrologie  permet avec l&#8217;analyse des métriques clés définis dans son infrastructure d&#8217;alimenter les outils d&#8217;automatisation.</li>
<li>L&#8217;automatisation est bien le mot clé mis en  avant par les AWS :  l&#8217;accessibilité des ressources Hardware ou  d&#8217;Infrastructure via du code  permet d&#8217;aller vers des architectures de  plus en plus autonomes. Il faut  cependant positionner le curseur  convenablement, sachant que les  dernières étapes d&#8217;une automatisation  complète seront les plus  coûteuses.</li>
</ul>
<p>J&#8217;espère que ce retour  d&#8217;expérience vous aura intéressé autant que  j&#8217;ai eu de plaisir à  travailler sur ces infrastructures. Je continuerai cet article dans une deuxième partie consacrée au modèle d&#8217;architecture à appliquer pour des infrastructures scalables.</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/06/scaler-une-infrastructure-aws-1-les-outils/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Comment FarmVille scale pour récolter 75 millions de joueurs par mois</title>
		<link>http://decrypt.ysance.com/2010/03/comment-farmville-scale-pour-recolter-75-millions-de-joueurs-par-mois/</link>
		<comments>http://decrypt.ysance.com/2010/03/comment-farmville-scale-pour-recolter-75-millions-de-joueurs-par-mois/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 16:29:57 +0000</pubDate>
		<dc:creator>Todd Hoff</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Casual Gaming]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Munin]]></category>
		<category><![CDATA[Nagios]]></category>
		<category><![CDATA[Puppet]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=1024</guid>
		<description><![CDATA[<img class="size-full wp-image-870 alignright" title="Farm Ville" src="http://decrypt.ysance.com/wp-content/uploads/2010/02/farmville.jpg" alt="Farm Ville" width="183" height="139" />

Si la vie des vrais agriculteurs était aussi douillette que dans <a title="FarmVille" href="http://www.farmville.com/">FarmVille</a>, le jeu phare de chez Zynga, alors ma famille n’aurait probablement jamais quitté les hivers rudes du North Dakota. A FarmVille, aucun des contes atroces que me racontait ma grand-mère n’est véridique. Les agriculteurs y prospèrent, les cultures fleurissent, et les animaux ne partent jamais au «  <a title="Murder In The Red Barn By Tom Waits" href="http://www.youtube.com/watch?v=eUJz3137EQ8">red barn</a> » (abattoir). A mon avis, c’est justement ce charme rustique d’un univers où l’on ne salit même pas ses souliers, qui a contribué à rendre FarmVille « le jeu le plus important au monde » dans un délai étonnamment court.

Comment FarmVille a-t-il réussi le scaling d’une application web pour accueillir 75 millions de joueurs par mois ? Luke Rajlich de FarmVille nous a gracieusement révélé quelques uns de leurs défis et de leurs secrets. Je passe la parole à Luke. [...]
]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-870 alignright" title="Farm Ville" src="http://decrypt.ysance.com/wp-content/uploads/2010/02/farmville.jpg" alt="Farm Ville" width="240" height="182" /></p>
<p>Si la vie des vrais agriculteurs était aussi douillette que dans <a title="FarmVille" href="http://www.farmville.com/">FarmVille</a>, le jeu phare de chez Zynga, alors ma famille n’aurait probablement jamais quitté les hivers rudes du North Dakota. A FarmVille, aucun des contes atroces que me racontait ma grand-mère n’est véridique. Les agriculteurs y prospèrent, les cultures fleurissent, et les animaux ne partent jamais au «  <a title="Murder In The Red Barn By Tom Waits" href="http://www.youtube.com/watch?v=eUJz3137EQ8">red barn</a> » (abattoir). A mon avis, c’est justement ce charme rustique d’un univers où l’on ne salit même pas ses souliers, qui a contribué à rendre FarmVille « le jeu le plus important au monde » dans un délai étonnamment court.</p>
<p>Comment FarmVille a-t-il réussi le scaling d’une application web pour accueillir 75 millions de joueurs par mois ? Luke Rajlich de FarmVille nous a gracieusement révélé quelques uns de leurs défis et de leurs secrets. Je passe la parole à Luke.</p>
<p>L’entretien comprenait quelques questions que je lui ai adressées, auxquelles il a répondu ainsi :</p>
<p style="padding-left: 30px;"><em>FarmVille a rencontré des défis de scaling rares, qui sont uniques à cette application. Le jeu a dû scaler très rapidement et très loin. Après seulement 4 jours, le jeu avait attiré un million de joueurs quotidiens, et 10 millions après 60 jours. Lors du lancement, le jeu social le plus important du web avait 5 millions de joueurs quotidiens. Actuellement FarmVille détient 28 millions de joueurs quotidiens, et 75 millions de joueurs mensuels, neuf mois après le lancement. Cela veut dire que le fond de joueurs mensuels FarmVille est plus important que la population totale de la France. Il y a deux éléments fondamentaux qui rendent FarmVille unique au niveau du défi évolutif : premièrement, c’est le jeu le plus répandu au monde, et deuxièmement, c’est l’application la plus importante sur une plate-forme web. Ces deux facteurs représentent un ensemble unique de défis évolutifs que FarmVille a dû surmonter. En termes d’investissement de technologie, FarmVille utilise principalement des composants Open Source, et ses fondements reposent sur la pile LAMP.</em></p>
<p style="padding-left: 30px;"><em>Afin de faire prospérer FarmVille en tant que jeu, nous devons nous accommoder des besoins en charge de traitement d’un jeu. L’état de chaque joueur contient une grosse quantité de données, qui sont liées entre elles de façon subtile et complexe. Par exemple, les objets à la ferme ne doivent pas se percuter, donc si un utilisateur installe une maison sur sa ferme, le Backend doit vérifier qu’il n’y aucun autre objet déjà installé qui risque de chevaucher sur l’espace prévu. La plupart des sites web connus, comme Google ou Facebook, servent surtout à être lus, mais FarmVille a une charge de travail en écriture extrêmement lourde. Le ratio de données en lecture par rapport aux données en écriture est de 3:1 (3 pour 1), ce qui implique un taux d’écriture très élevé. La majorité des demandes pour FarmVille adressées au Backend modifient en quelque sorte l’état de l’utilisateur qui joue. Pour que ce soit scalable, nous faisons dialoguer notre application principalement avec des composants de type cache. En plus, le lancement d&#8217;un nouveau contenu ou de nouvelles fonctions a tendance à provoquer des pics d’utilisation, car cela revient à une extension du jeu. Les pics de téléchargement peuvent atteindre les 50% le jour du lancement d’une nouvelle fonction. Il nous faut pouvoir accueillir ces pics de trafic.</em></p>
<p style="padding-left: 30px;"><em>Le deuxième point est de faire scaler FarmVille comme l’application la plus importante sur une plate-forme web, et elle a autant d’envergure que certains des sites web les plus gros du monde. Du fait que le jeu est exécuté au sein de la plate-forme Facebook, nous sommes très sensibles aux écarts de latence (temps d’attente) et de performance de la plate-forme. En conséquence, nous avons fait des efforts pour mitiger cette variance de la latence : nous entreposons en cache beaucoup de données Facebook, et nous limitons gentiment l’utilisation de la plate-forme quand nous nous apercevons d’une dégradation de la performance. FarmVille a déployé tout un cluster (une grappe) de serveurs cache pour la plate-forme Facebook. Le volume de trafic entre FarmVille et la plate-forme Facebook est vaste : aux heures de pointe environ 3 Gigabits/sec passent entre FarmVille et Facebook, et en même temps notre cluster de caching fournit 1.5 Gigabits/sec de plus à l’application. En plus, étant donné que la performance est variable, l’application est capable de stopper dynamiquement les appels en retour vers la plate-forme. Nous avons un &laquo;&nbsp;bouton de réglage&nbsp;&raquo; qui nous permet de réduire de manière incrémentale de plus en plus d&#8217;appels en retour. Nous faisons en sorte que tous les appels qui reviennent à la plate-forme n’empêchent pas le chargement de l’application même. L’intérêt de cette manipulation est que, quoiqu’il advienne, les joueurs peuvent au moins continuer leur partie.</em></p>
<p style="padding-left: 30px;"><em>Pour toute application web, un temps d’attente élevé est fatal, et une latence hautement variable lui sera fatale tôt ou tard. Afin de résoudre la latence élevée, FarmVille a installé beaucoup de caches devant les composants à latence élevée. La latence hautement variable représente une épreuve de plus, car elle nous oblige à trouver une approche différente : l’application dépend des éléments de son architecture qui ont habituellement une latence correcte. Pratiquement tous les composants sont susceptibles de latence variable, certains plus que d&#8217;autres. Vu la nature de FarmVille, qui a une charge de travail très importante en termes d&#8217;écritures et de transactions, la variabilité de latence affecte l&#8217;expérience de jeu des utilisateurs de façon exacerbée, par rapport à une application web traditionnelle. La solution, chez nous à FarmVille, pour gérer ces scénarii est de considérer chaque composant comme un service dégradable. Memcache, base de données, APIs REST, etc. sont maniés comme des services dégradables. Afin de gérer la dégradation des services, nous attribuons des seuils en termes de nombre d&#8217;erreurs et utilisons des régulateurs d’usage desdits services. Les principes clés sont d&#8217;isoler les services problématiques et hautement latents et de les empêcher, par le biais de régulateurs d’erreurs et de timeout, d’entraîner des problèmes similaires ailleurs et, si besoin, désactiver la fonctionnalité de l’application avec des interrupteurs On/Off et des régulateurs de fonctionnalité.</em></p>
<p style="padding-left: 30px;"><em>En ce qui concerne la gestion et le suivi de la ferme web de FarmVille, nous exploitons quelques outils de gestion et de monitoring Open Source. Nous utilisons Nagios pour les alertes (supervision), Munin pour le monitoring et Puppet pour la configuration. Nous nous appuyons fortement sur des systèmes de statistiques internes afin de surveiller la performance des services utilisés par l’application, tels Facebook, DB et Memcache. En outre, dès que nous constatons une dégradation de performance, nous profilons les événements I/O d’une demande, sur une base échantillonnée.</em></p>
<h2>Leçons retenues</h2>
<p>Il manque un peu de détails à mon goût, mais il y a quand même beaucoup de points intéressants qui pourront servir :</p>
<ol>
<li><strong>Les jeux interactifs sont lourds en écriture</strong>. Les applications web typiques lisent plus qu’elles n’écrivent, donc il se peut que plusieurs architectures courantes ne suffisent pas. Des applications lourdes en lecture peuvent souvent s’en sortir à l’aide d’une couche de cache devant une seule base de données. Les applications lourdes en écriture auront besoin de partitionner, les écritures sont donc réparties et/ou utilisent une architecture en mémoire.</li>
<li><strong>Chaque composant      doit être conçu comme un service dégradable</strong>. Isolez les      composants de manière que les latences élevées dans une zone particulière ne      puissent pas impacter une autre. Régulez l’usage afin de réduire les      problèmes. Désactivez les fonctions quand c’est nécessaire.</li>
<li><strong>Mettez les données      Facebook en cache</strong>. Quand vous dépendez fortement d’un composant      externe, pensez à mettre en cache les données du composant afin      d’améliorer les temps de latence.</li>
<li><strong>Prévoyez à l’avance      des pics de trafic liés aux nouveaux lancements</strong>.</li>
<li><strong>Echantillonnez</strong>. En analysant des flux      abondants de données, à la recherche de problèmes par exemple, il n’est pas      nécessaire de traiter chaque donnée. Echantillonner rendra les mêmes      résultats pour beaucoup moins d’effort.</li>
</ol>
<p>J’aimerais remercier Zynga et Luke Rajlich de nous avoir accordé cette interview. Si des lecteurs ont une architecture qu’ils voudraient présenter ici, n’hésitez pas à me contacter.</p>
<p><em><strong>Todd HOFF <a href="http://highscalability.com/">@highscalability.com</a></strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2010/03/comment-farmville-scale-pour-recolter-75-millions-de-joueurs-par-mois/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Puppet et FarmVille</title>
		<link>http://decrypt.ysance.com/2010/02/puppet-et-farmville/</link>
		<comments>http://decrypt.ysance.com/2010/02/puppet-et-farmville/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 16:03:22 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Automatisation]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Puppet]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=869</guid>
		<description><![CDATA[<img class="size-full wp-image-870 alignleft" title="Farm Ville" src="http://decrypt.ysance.com/wp-content/uploads/2010/02/farmville.jpg" alt="Farm Ville" width="183" height="139" />
&#160;
Pour ceux qui doutaient encore de l'efficacité de <a title="Site de Puppet" href="http://reductivelabs.com/">Puppet</a>, voilà encore un bel exemple de réalisation utilisant cet outil ! Allez consulter cet article de High Scalability : <a title="High Scalability, How FarmVille Scales to Harvest 75 Million Players a Month" href="http://highscalability.com/blog/2010/2/8/how-farmville-scales-to-harvest-75-million-players-a-month.html">How FarmVille Scales to Harvest 75 Million Players a Month</a> ! [...]

<img class="size-full wp-image-890" 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" />]]></description>
			<content:encoded><![CDATA[<p>Pour ceux qui doutaient encore de l&#8217;efficacité de <a title="Site de Puppet" href="http://reductivelabs.com/">Puppet</a>, voilà encore un bel exemple de réalisation utilisant cet outil ! Allez consulter cet article de High Scalability : <a title="High Scalability, How FarmVille Scales to Harvest 75 Million Players a Month" href="http://highscalability.com/blog/2010/2/8/how-farmville-scales-to-harvest-75-million-players-a-month.html">How FarmVille Scales to Harvest 75 Million Players a Month</a> !</p>
<p><img class="size-full wp-image-870 alignnone" title="Farm Ville" src="http://decrypt.ysance.com/wp-content/uploads/2010/02/farmville.jpg" alt="Farm Ville" width="183" height="139" /></p>
<p>Merci qui ?</p>
<p><img class="size-full wp-image-430" title="Logo Puppet" src="http://decrypt.ysance.com/wp-content/uploads/2009/07/puppet2.png" alt="Logo Puppet" width="96" height="108" /><img class="size-full wp-image-890" 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>Merci Puppet !</p>
<p>Pour <span style="text-decoration: underline;">plus d&#8217;informations sur Puppet</span>, vous pouvez également consulter cette <a title="Site de Decrypt, Rubrique Puppet" href="http://decrypt.ysance.com/tag/puppet/">rubrique</a> sur Decrypt.</p>
<p><em><strong>Frédéric FAURE</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2010/02/puppet-et-farmville/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Puppet et Capistrano : la clé de l&#8217;automatisation</title>
		<link>http://decrypt.ysance.com/2009/07/automatisation-puppet-capistrano/</link>
		<comments>http://decrypt.ysance.com/2009/07/automatisation-puppet-capistrano/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 16:02:49 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Automatisation]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Capistrano]]></category>
		<category><![CDATA[Puppet]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://decrypt.ysance.com/?p=425</guid>
		<description><![CDATA[<a href="http://reductivelabs.com/" title="Site de Puppet">Puppet</a> est un produit open source qui permet de gérer à moindre frais une infrastructure importante en centralisant la gestion de la configuration des machines : il permet de maintenir la configuration des différents types de machines d’une infrastructure iso entre elles et de démarrer rapidement une instance en l’associant à un type de nœud Puppet. Il capitalise également les connaissances sur les composants/paramétrages de chaque type de machines via ses descripteurs.

<a href="http://www.capify.org/" title="Site de Capistrano">Capistrano</a> est produit open source qui permet d’associer des machines à des rôles (exemple : role :web, « frontal1 », « frontal2 ») et d’exécuter une tâche donnée en parallèle sur toutes les machines d’un ou plusieurs rôles. Il permet également de capitaliser les connaissances sur les différentes tâches de l’infrastructure et les rend reproductibles et centralisées, donc fiables. il se connecte en SSH et donc assure un niveau de sécurité minimum.

[...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://reductivelabs.com/" title="Site de Puppet">Puppet</a> est un produit open source qui permet de gérer à moindre frais une infrastructure importante en centralisant la gestion de la configuration des machines : il permet de maintenir la configuration des différents types de machines d’une infrastructure iso entre elles et de démarrer rapidement une instance en l’associant à un type de nœud Puppet. Il capitalise également les connaissances sur les composants/paramétrages de chaque type de machines via ses descripteurs.</p>
<p><a href="http://www.capify.org/" title="Site de Capistrano">Capistrano</a> est un produit open source qui permet d’associer des machines à des rôles (exemple : role :web, « frontal1 », « frontal2 ») et d’exécuter une tâche donnée en parallèle sur toutes les machines d’un ou plusieurs rôles. Il permet également de capitaliser les connaissances sur les différentes tâches de l’infrastructure et les rend reproductibles et centralisées, donc fiables. Il se connecte en SSH et donc assure un niveau de sécurité minimum.</p>
<div id="media"><object id="csSWF" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="498" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.labdecisionnel.fr/decrypt-content/Web/Ysance-Automatisation-Puppet-Capistrano.swf" /><param name="bgcolor" value="#1a1a1a" /><param name="quality" value="best" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /><param name="scale" value="showall" /><param name="flashVars" value="autostart=false" /><param name="name" value="csSWF" /><param name="flashvars" value="autostart=false" /><param name="allowfullscreen" value="true" /><embed id="csSWF" type="application/x-shockwave-flash" width="640" height="498" src="http://www.labdecisionnel.fr/decrypt-content/Web/Ysance-Automatisation-Puppet-Capistrano.swf" flashvars="autostart=false" allowfullscreen="true" allowscriptaccess="always" scale="showall" quality="best" bgcolor="#1a1a1a" name="csSWF"></embed></object></div>
<div> </div>
<div><img class="size-full wp-image-430" title="Logo Puppet" src="http://decrypt.ysance.com/wp-content/uploads/2009/07/puppet2.png" alt="Logo Puppet" width="96" height="108" /> <img class="size-medium wp-image-429" 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" /></div>
<div> </div>
<div class="mceTemp">Vous pouvez également accéder aux versions <strong>IPhone</strong> et <strong>IPod</strong> de ce webcast :</div>
<p><a href="http://www.labdecisionnel.fr/decrypt-content/IPhone/Ysance-Automatisation-Puppet-Capistrano.m4v">Version IPhone</a><br />
<a href="http://www.labdecisionnel.fr/decrypt-content/IPod/Ysance-Automatisation-Puppet-Capistrano.m4v">Version IPod</a></p>
<p> </p>
<p>Puppet et Capistrano sont 2 outils ayant pour but de capitaliser les connaissances sur le fonctionnement d’une infrastructure et de l’automatiser de façon à l’homogénéiser et la fiabiliser.</p>
<p>Chacun des outils à son propre rôle et utiliser les 2 est une très bonne solution, Puppet étant attaché au maintient d’une configuration iso à tout moment entre chaque machine d’un même type et Capistrano permettant d’exécuter des tâches plus ou moins complexes en parallèle sur des groupes de machines assignées à des rôles.</p>
<p>Il est également possible en poussant le fonctionnement un peu plus loin, dans un environnement virtualisé par exemple, d’avoir un script qui démarre des machines, installe le client Puppet sur celles-ci, référence les nouvelles machines et accepte les certificats au niveau du Puppet Master, puis redémarre le client, avant de lancer une tâche Capistrano qui déploie la dernière version de l’application à partir de SVN sur les serveurs ne possédant pas encore l’application. En un clic, il est possible de multiplier le nombre de ses frontaux pour absorber un pic de charge par exemple.</p>
<p>Le mot clé est : « automatisation ! »</p>
<p><em><strong>Frédéric FAURE</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2009/07/automatisation-puppet-capistrano/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mise en place d’une infrastructure sur AWS : best practices !</title>
		<link>http://decrypt.ysance.com/2009/05/cloud-computing-mise-en-place-infrastructure-aws-best-practices/</link>
		<comments>http://decrypt.ysance.com/2009/05/cloud-computing-mise-en-place-infrastructure-aws-best-practices/#comments</comments>
		<pubDate>Fri, 15 May 2009 14:12:38 +0000</pubDate>
		<dc:creator>Frédéric Faure</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Scalability]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[Automatisation]]></category>
		<category><![CDATA[Cacti]]></category>
		<category><![CDATA[Capistrano]]></category>
		<category><![CDATA[HaaS]]></category>
		<category><![CDATA[Monitoring]]></category>
		<category><![CDATA[Puppet]]></category>
		<category><![CDATA[RRDtool]]></category>
		<category><![CDATA[Webistrano]]></category>

		<guid isPermaLink="false">http://godard.ysance.com/~decrypt/?p=25</guid>
		<description><![CDATA[Ce post va présenter une description détaillée de la mise en place de l’infrastructure sur <a href="http://aws.amazon.com/" title="Site de Amazon">AWS</a> (Amazon Web Services). Je me base sur ce que j’ai mis en place, en l’occurrence, à destination d’une application sociale à forte sollicitation. Cependant, quelque soit la typologie de l’infrastructure sous AWS, les éléments à mettre en place seront toujours les mêmes.

[...]]]></description>
			<content:encoded><![CDATA[<p>Ce post va présenter une description détaillée de la mise en place de l’infrastructure sur <a href="http://aws.amazon.com/" title="Site de Amazon">AWS</a> (Amazon Web Services). Je me base sur ce que j’ai mis en place, en l’occurrence, à destination d’une application sociale à forte sollicitation. Cependant, quelque soit la typologie de l’infrastructure sous AWS, les éléments à mettre en place seront toujours les mêmes.</p>
<p><strong><em>Différence avec une infrastructure standard</em></strong><br />
Tout d’abord il est normal de se poser la question. La réponse devrait être : « aucune ! ». Cependant, force est de constater que bien souvent le côté plus douillet de l’infrastructure hébergé « à la maison » pousse à une certaine forme de laxisme sur un certain nombre de points. Le fait que Amazon, avec ses AWS, propose une solution volatile et dynamique au niveau de ces EC2 oblige à mettre en place des mécanismes qui devraient être standards afin :</p>
<p style="padding-left: 30px;">• de tirer profit des possibilités, du dynamisme, de la solution,</p>
<p style="padding-left: 30px;">• de prendre en compte plus sérieusement, du fait de la volatilité de l’outil, les plans de reprise sur incident et identifier les données importantes afin d’assurer leur durabilité.</p>
<p><strong><em>Le monitoring</em></strong><br />
Le monitoring est le premier élément à mettre en place. Dans une architecture scalable, il est indispensable d’avoir à disposition des métriques afin de savoir justement quand scaler. C’est le rôle de cet élément. Il permet de plus d’identifier les points d’engorgement de l’infrastructure, analyser l’évolution du trafic sur votre site et en déduire les comportement des utilisateurs et dans le cadre d’un monitoring actif, permet également de déclencher des alertes qui servent de base aux astreintes.</p>
<p>Il n’y a pas d’outil miracle pour le monitoring et un certain nombre existent sur le marché avec leurs avantages et inconvénients. Nous pouvons citer Nagios, Cacti, Zabbix, Munin, … Nous avons choisi <a href="http://www.cacti.net/" title="Site de Cacti">Cacti</a> pour notre infrastructure du fait de la qualité des courbes qu’il propose. Il est vrai que le packaging de cet outil manque, à mon avis, de rigueur et que les métriques manquent, sur certains templates, de précision, cependant la qualité des courbes, basées sur <a href="http://oss.oetiker.ch/rrdtool/" title="Site de RRDtool">RRDtool</a>, et leur diversité permet d’effectuer un suivi complet de notre infrastructure et de comprendre les impacts de l’évolution des composants de ladite infrastructure ou bien des applications supportées au fur et à mesure des livraisons des différentes releases.</p>
<p>Nous avons installé également la « plugin architecture » de Cacti qui nous permet d’installer, comme son nom l’indique, des plugin sur l’outil et notamment « Thold », nous permettant de déclencher des trigger sur l’atteinte d‘une valeur sur une courbe ou bien sur une variation afin d’effectuer du monitoring actif. Bien entendu, cela est le prélude à une gestion des astreintes et à chaque alerte remontée doit correspondre un mode opératoire de reprise sur l’incident mis en lumière via Cacti.</p>
<p>Le monitoring est positionné sur une machine EC2 pour des raisons évidentes de coût (le coût des échanges sur l’IP interne est nul) et de sécurité (inutile d’ouvrir plein de ports et donc autant de failles à l’extérieur).</p>
<div id="attachment_162" class="wp-caption alignnone" style="width: 463px"><img class="size-full wp-image-162" title="Cacti - Apache Statistics - Thread scoreboard" src="http://decrypt.ysance.com/wp-content/uploads/2009/05/apache-statistics-thread-scoreboard-tiny.png" alt="Cacti - Apache Statistics - Thread scoreboard" width="453" height="309" /><p class="wp-caption-text">Cacti - Apache Statistics - Thread scoreboard</p></div>
<p><strong><em>La gestion de configuration centralisée<br />
</em></strong>La notion de scalabilité rendue accessible par l’infrastructure des services Amazon, nous oblige à utiliser un outil de gestion centralisé de la configuration. L’utilité est multiple :</p>
<p style="padding-left: 30px;">• instancier rapidement une machine correspondant à un type prédéfini : serveur SQL, serveur de cache, serveur Web, …</p>
<p style="padding-left: 30px;">• assurer l&#8217;homogénéité de la configuration des instances d&#8217;un même type,</p>
<p style="padding-left: 30px;">• capitaliser un savoir faire.</p>
<p>Nous utilisons <a href="http://reductivelabs.com/" title="Site de Puppet">Puppet</a> dans notre infrastructure. Nous avons installé le Puppet Master sur le serveur de monitoring. Le Puppet Master contient les descripteurs des installations et configurations à apporter à une nouvelle machine afin de la préparer suivant le type de machine (nœud) auquel on l’a associé. Régulièrement, le client pull le master afin de vérifier que sa configuration est à jour. Il est également possible de faire du push sur les clients à partir du master pour déclencher une mise à jour urgente.</p>
<p>Il est ainsi très simple de monter une nouvelle instance d’un type donné et d’être sûr que, d’une machine à une autre, la configuration est complètement iso, configuration qui est centralisée sur notre machine de monitoring et dispatchée sur les instances de notre infrastructure. Il est à noter que le descripteur du Puppet Master fonctionne sur un système de nodes et donc un type de machine peut faire référence à plusieurs nodes et on obtient une configuration très modulaire. Tous nos types de machine, par exemple, utilisent le module Puppet de configuration, que nous avons décrit, du protocole SNMP, indispensable pour que Cacti monitore une machine, et le module de l’outil s3cmd nous permettant de faire fonctionner notre système de backup sur chaque machine. Ensuite, chaque type de machine a ses installations/configurations spécifiques.</p>
<p>Exemple du descripteur de nœuds « nodes.pp » du Puppet Master :</p>
<p><span style="color: #339966;">class web-node {<br />
      include snmp-module<br />
      include s3cmd-module<br />
      include web-module<br />
}</span></p>
<p>Exemple du descripteur « init.pp » du module « snmp » du Puppet Master :</p>
<p><span style="color: #339966;">class snmp {<br />
      package {<br />
            &laquo;&nbsp;snmpd&nbsp;&raquo;:<br />
            ensure =&gt; installed;<br />
      }</span></p>
<p><span style="color: #339966;">      file { &laquo;&nbsp;/etc/default/snmpd&nbsp;&raquo;:<br />
            ensure =&gt; present,<br />
            owner =&gt; root,<br />
            group =&gt; root,<br />
            mode =&gt; 0644,<br />
            source =&gt; &laquo;&nbsp;puppet:///snmp/snmpd&nbsp;&raquo;,<br />
            require =&gt; Package["snmpd"],<br />
            notify =&gt; Service["snmpd"];<br />
      }</span></p>
<p><span style="color: #339966;">      file { &laquo;&nbsp;/etc/snmp/snmpd.conf&nbsp;&raquo;:<br />
            ensure =&gt; present,<br />
            owner =&gt; root,<br />
            group =&gt; root,<br />
            mode =&gt; 0644,<br />
            source =&gt; &laquo;&nbsp;puppet:///snmp/snmpd.conf&nbsp;&raquo;,<br />
            require =&gt; Package["snmpd"],<br />
            notify =&gt; Service["snmpd"];<br />
      }</span></p>
<p><span style="color: #339966;">      service { &laquo;&nbsp;snmpd&nbsp;&raquo;:<br />
            ensure =&gt; true,<br />
            hasrestart =&gt; true,<br />
            restart =&gt; &laquo;&nbsp;/etc/init.d/snmpd restart&nbsp;&raquo;,<br />
            hasstatus =&gt; true;<br />
      }<br />
}</span></p>
<p>Très simple de mise en place, il nous permet de démarrer une machine en un clic sur un pic de charge. « Mais… », me direz-vous, « il faut bien installer le client sur la nouvelle machine ? ». Et oui, d’autant plus qu’il y a un système de requête/acceptation de certificat entre le client et le master afin que n’importe qui ne puisse accéder aux configurations. « Très simple ! », vous répondrais-je, au lieu d’utiliser une IHM, comme Elastic Fox, afin de se connecter aux APIs des services Amazon, il suffit de s’y connecter en lignes de commande via un script qui instancie un EC2, éventuellement crée un volume EBS et l’associe, se connecte en SSH sur la nouvelle machine et installe le client, se connecte sur le master et accepte la requête de certificat, redémarre le client sur la nouvelle machine et « hop ! ». La machine s’installe et se configure toute seule ! « Magique ! » me direz-vous, « Ca devrait être pourtant classique » vous répondrais-je… Les possibilités de réactivité et de dynamisme inhérents à EC2 et les AWS de manière générale nous impose cela, sinon ce serait sous exploiter l’outil, voire més-exploiter.</p>
<p>L’auto-scalabilité, que nous n’avons pas (pour l&#8217;instant ;ob) mise en place dans notre cas, consisterait, par exemple, à déclencher ce script sur le dépassement d’une valeur d’un graphe Cacti, instanciant donc une nouvelle machine pour supporter la période de pic, instance qui serait « terminée » suite au repassage en dessous de ce seuil sur le graphe. Les possibilités sont énormes.</p>
<p><strong><em>Le déploiement automatisé<br />
</em></strong>Du fait de la variation du nombre d’instances en fonction de la charge et surtout du nombre potentiellement important desdites instances, il n’est pas envisageable d’effectuer les opérations de maintenance et de déploiement unitairement sur chaque machine (et encore pire à la main !), ce qui non seulement serait chronophage, mais de surcroît source d’erreurs. Il est alors indispensable d’utiliser des outils spécialisés dans l’automatisation et l’exécution parallèle de tâches, tel que <a href="http://www.capify.org/" title="Site de Capistrano">Capistrano</a>, dont les bénéfices sont multiples :</p>
<p style="padding-left: 30px;">• scripter un certain nombre de tâches (livraisons, backups, publication/maintenance du site, &#8230;) et de les exécuter en parallèle sur X machines,</p>
<p style="padding-left: 30px;">• assurer la reproductibilité d&#8217;une tâche,</p>
<p style="padding-left: 30px;">• exécuter rapidement des tâches complexes sur X serveurs en une seule commande,</p>
<p style="padding-left: 30px;">• capitaliser un savoir faire.</p>
<p>Cet outil est très simple d’utilisation et très pratique et exécute des tâches en parallèle, sur un groupe de serveurs que l’on définit, en se connectant en ssh :</p>
<p><span style="color: #339966;">ssh_options[:keys] = &laquo;&nbsp;~/.ssh/la_cle_privee&nbsp;&raquo;<br />
ssh_options[:user] = &laquo;&nbsp;le_user&nbsp;&raquo;</span></p>
<p>Il suffit de définir une liste de serveurs correspondant à un groupe, « sql » par exemple :</p>
<p><span style="color: #339966;">role :sql, &laquo;&nbsp;alias_sql1 &nbsp;&raquo; , &laquo;&nbsp;alias_sql2 &nbsp;&raquo; , … , &laquo;&nbsp;alias_sqlx&nbsp;&raquo;</span></p>
<p>Et ensuite il reste à définir les tâches, que l’on peut décrire intégralement dans le descripteur…</p>
<p><span style="color: #339966;">task :dump_sql, :roles =&gt; :sql do<br />
      run &laquo;&nbsp;rm -f /mnt/backup/`hostname`.`date +%w`-*&nbsp;&raquo;<br />
      run &laquo;&nbsp;mysqldump –pmon_pwd -u mon_user ma_base | gzip -cq6 &gt; /mnt/backup/`hostname`.`date +%w-%y%m%d_%H%M`.sql.gz&nbsp;&raquo;<br />
end</span></p>
<p>… ou bien dans un fichier « .sh » que l’on uploade et que l’on exécute sur la machine distante</p>
<p><span style="color: #339966;">task :store_sql, :roles =&gt; :sql do<br />
      upload &laquo;&nbsp;/root/cap-scripts/cap-backup_sql.sh&nbsp;&raquo;, &laquo;&nbsp;/usr/local/sbin&nbsp;&raquo;, :via =&gt; :scp<br />
      run &laquo;&nbsp;/usr/local/sbin/cap-backup_sql.sh&nbsp;&raquo;<br />
end</span></p>
<p>Il suffit ensuite d’exécuter la simple commande « cap dump_sql » ou « cap store_sql ».</p>
<p><strong><em>Backups</em></strong><br />
Et oui, mettre ses données de base SQL sur EBS (dans le cas où l’on n’utilise pas SimpleDB du fait du besoin d’un minimum de modèle relationnel) ne suffit pas, parce que :</p>
<p style="padding-left: 30px;">• EBS assure une durabilité très respectable par réplication réseau, mais reste l’équivalent d’un disque dur, même si plus fiable,</p>
<p style="padding-left: 30px;">• il n’y a pas que les données de base SQL (ou autres) qui sont importantes, il y a également vos logs principaux et les configurations de vos outils (Cacti, Puppet, Capistrano, …).</p>
<p>Nous utilisons l’outil en ligne de commande « s3cmd » afin de stocker nos backups. Cet outil est utilisé dans nos tâches Capistrano appelées par cron. Très simple d’utilisation, il nous permet d’utiliser les API’s 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>Tips and tricks<br />
</strong><span style="text-decoration: underline;">DNS</span></em><br />
Il arrive de rencontrer quelques soucis DNS au niveau du réseau Amazon pour les instances EC2. Un conseil donc, positionner des hostname plus parlant (au lieu des « domu -xxxx») et utilisez le fichier des « hosts » que vous déployez ensuite via Puppet !</p>
<p><em><span style="text-decoration: underline;">CDN</span></em><br />
Nous utilisons S3 dans notre architecture afin de mettre à disposition les images et autres statiques de notre application à disposition de notre Content Delivery Network, à savoir Panther. Inutile, en effet, de maintenir un serveur Web à cette seule fin, S3 est là pour ça pour un coût minime.</p>
<p><em><span style="text-decoration: underline;">Gestion des Logs<br />
</span></em>Il serait, à mon avis intéressant, de gérer également les logs de manière centralisée. Nous ne l’avons pas mis en place et, par conséquent, je ne ferai pas de recommandations sur un sujet que je n’ai pas testé moi-même. Cependant, pour indication, il est possible de mettre en place un système de logs réseaux, sous Linux par exemple, afin de centraliser et de mutualiser les logs, logs qu’il est ensuite possible d’analyser. Ca vaut le coup pour une infrastructure ou une application distribuée de connaître le comportement ou les différences de comportement des éléments qui la constitue.</p>
<p><em><span style="text-decoration: underline;">Webistrano</span></em><br />
<a href="http://labs.peritor.com/webistrano" title="Site de Webistrano">Webistrano</a> est une IHM permettant d’accéder aux fonctionnalités de Capistrano et introduisant une notion de gestion de projet par la possibilité de gérer les accès aux tâches en fonction de son profil, de tracer qui a déployé quoi sur quel serveur et d’envoyer des alertes mails sur certaines actions. Nous ne l’avons pas testé en production, mais cela peut s’avérer intéressant à prendre en considération.</p>
<p><strong><em>Conclusion</em></strong><br />
Le but de ce post n’est pas de faire la publicité de tel ou tel outil, mais de vous inciter à considérer l’automatisation de votre infrastructure qui, si elle devrait déjà être en place dans vos infrastructures actuelles internes, devient indispensable sous AWS pour peu que l’on souhaite faire de la scalabilité, être réactif ou simplement tirer parti de l’outil mis à disposition.</p>
<p>Je dirais que les principes fondamentaux d’une bonne infrastructure sont au nombre de 3 : KISS, DRY et YAGNI.</p>
<p style="padding-left: 30px;">• KISS pour « Keep It Simple, Stupid », à savoir inutile de chercher à complexifier l’infrastructure, la plus efficace sera la plus simple.</p>
<p style="padding-left: 30px;">• DRY pour « Don&#8217;t Repeat Yourself » , à savoir ce qu’il est possible de scripter et d’automatiser faites-le ! Ca vous prendra un peu plus de temps la première fois, mais vous aurez une tâche réfléchie, reproductible, et vous n’aurez surtout pas besoin de le faire une seconde fois (quoi de plus ennuyeux que de se répéter).</p>
<p style="padding-left: 30px;">• YAGNI pour « You Ain&#8217;t Gonna Need It », à savoir n’installez sur vos machine que ce dont vous avez besoin. Plus vous installerez d’outils inutiles ou one-shot, plus votre infrastructure aura potentiellement des trous de sécurité et pourra introduire des effets de bords. Sans aller forcément jusque là, disons qu’elle sera moins facilement maintenable.</p>
<p>Ces principes vous paraissent drôles pour certains ou peut-être un peu ringard pour d’autres, mais si avant de faire une tâche sur une infrastructure on se demandait si ce que l’on va entreprendre ne rentre pas dans un de ces cas, je pense que les infrastructures, de manière générale, seraient plus fiables, homogènes et performantes.</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><em><strong>Frédéric FAURE</strong></em></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"> </p>
]]></content:encoded>
			<wfw:commentRss>http://decrypt.ysance.com/2009/05/cloud-computing-mise-en-place-infrastructure-aws-best-practices/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
