<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:posterous="http://posterous.com/help/rss/1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Managing complexity</title>
    <link>http://okiess.me</link>
    <description>Ein Blog von Oliver Kiessler</description>
    <generator>posterous.com</generator>
    <link xmlns="http://www.w3.org/2005/Atom" type="application/json" href="http://posterous.com/api/sup_update#af1e3589a" rel="http://api.friendfeed.com/2008/03#sup" />
    
    
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/okiessme" /><feedburner:info uri="okiessme" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://posterous.superfeedr.com/" /><item>
      <pubDate>Wed, 27 Apr 2011 07:14:00 -0700</pubDate>
      <title>NodeJS Deployment in der Cloud</title>
      <link>http://feedproxy.google.com/~r/okiessme/~3/FHfxfSvUwgs/nodejs-deployment-in-der-cloud</link>
      <guid isPermaLink="false">http://okiess.me/nodejs-deployment-in-der-cloud</guid>
      <description>&lt;p&gt;
	&lt;p&gt;Da ich eine &lt;a href="http://nodejs.org/" target="_blank"&gt;NodeJS&lt;/a&gt; / &lt;a href="http://expressjs.com/" target="_blank"&gt;Express&lt;/a&gt; basierte App aus Performance Gr&amp;uuml;nden auf einen eigenen Server auslagern wollte, habe ich es einmal zum Anlass genommen die aktuellen Cloud Deployment Optionen f&amp;uuml;r NodeJS Apps auszutesten.&lt;/p&gt;
&lt;p&gt;Dabei sind mir zum jetzigen Zeitpunkt zwei Services bekannt:&lt;/p&gt;
&lt;p&gt;- &lt;a href="http://cloudfoundry.com/" target="_blank"&gt;Cloud Foundry&lt;/a&gt; (VMWare)&lt;/p&gt;
&lt;p&gt;- &lt;a href="https://no.de/" target="_blank"&gt;No.de&lt;/a&gt; (Joyent)&lt;/p&gt;
&lt;p&gt;Beide versprechen ein einfaches und schnelles Deployment.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: large;"&gt;No.de&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;No.de ist ein Service von Joyent, die ein Anbieter von Cloud Servern &amp;auml;hnlich zu Amazon EC2 sind. Zudem sind Joyent der aktuelle Arbeitgeber von &lt;a href="http://tinyclouds.org/" target="_blank"&gt;Ryan Dahl&lt;/a&gt;, dem Hauptentwickler von NodeJS. Nachdem man nun einen Joyent Account angelegt und einen "Coupon Code" zum Anlegen einer Node Smartmachine zugewiesen bekommen hat (der Service ist noch in der Beta), kann man loslegen. Das &lt;a href="http://wiki.joyent.com/display/node/Getting+Started+with+a+Node+SmartMachine" target="_blank"&gt;Deployment Verfahren&lt;/a&gt; l&amp;auml;uft &amp;auml;hnlich wie zu Heroku &amp;uuml;ber Git.&lt;/p&gt;
&lt;p&gt;Zudem kann man sich auch direkt &amp;uuml;ber SSH auf die&amp;nbsp;Node Smartmachine&amp;nbsp;einloggen und z.B. ben&amp;ouml;tigte Node Libraries selber installieren. Auch eine Installation von MongoDB ist m&amp;ouml;glich (neben mysql und redis). Die Leistungsf&amp;auml;higkeit der Node Smartmachine l&amp;auml;sst sich beim Erzeugen ausw&amp;auml;hlen (RAM).&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: large;"&gt;Cloud Foundry&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Die Cloud Foundry von VMWare ist eine offene Applikationsplattform, die auch NodeJS unterst&amp;uuml;tzt (neben Ruby on Rails und dem Java Spring Framework). Mit einem entsprechenden Cloud Foundry Account (momentan auch noch nicht frei verf&amp;uuml;gbar) kann man &amp;uuml;ber ein Commandline Tool Anwendungen deployen. Git wird hier nicht direkt ben&amp;ouml;tigt. Ausgehend vom Root Verzeichnis der NodeJS Anwendung kann man diesen Stand zur Cloud Foundry pushen. Dabei wird abgefragt wieviel RAM die Anwendung ben&amp;ouml;tigt und auf wievielen Server Instanzen die Anwendung laufen soll.&lt;/p&gt;
&lt;p&gt;Im Gegensatz zur No.de Smartmachine kann hier keinen Port angeben, auf dem die Anwendung laufen soll, sondern dieser wird durch die Plattform eigenst&amp;auml;ndig zugewiesen. Zudem wird auch automatisch ein Webserver Proxy (Loadbalancer) erzeugt, der auf die verf&amp;uuml;gbaren NodeJS Anwendungsinstanzen verteilt, die man erzeugt hat.&lt;/p&gt;
&lt;p&gt;Zudem kann man z.B. MongoDB oder Redis einfach als Services w&amp;auml;hrend des Deployments mit der Anwendung koppeln und darauf zugreifen. Die &lt;a href="http://support.cloudfoundry.com/entries/505133-deploying-a-node-js-app-with-npm-dependencies" target="_blank"&gt;NodeJS Library Abh&amp;auml;ngigkeiten&lt;/a&gt; beschreibt man in einer JSON Datei im Rootverzeichnis der Anwendung und nutzt den "Bundle" Mechanismus von npm, um diese direkt mit der Anwendung auszuliefern. Das kann beim No.de Cloud Service zwar auch machen, bei Cloud Foundry ist es allerdings verpflichtend, da man keinen direkten Zugriff auf die Server Instanzen hat.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: large;"&gt;Fazit&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Der Unterschied zwischen den beiden Cloud Services ist eindeutig. No.de erlaubt das Erzeugen von NodeJS optimierten Server Instanzen (also eher "Server Hosting" &amp;auml;hnlich zu Amazon EC2) und Cloud Foundry ist eine Applikationsplattform, die verwaltet wird und automatische Skalierung erlaubt (wie z.B. &lt;a href="http://www.heroku.com/" target="_blank"&gt;Heroku&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Ich habe mich f&amp;uuml;r Cloud Foundry entschieden, da einem hier die Aufgabe der Skalierung der Anwendung abgenommen wird. Wenn man weitere Anwendungsinstanzen ben&amp;ouml;tigt, kann man diese beim "Pushen der Anwendungen" zuweisen. Zudem sind notwendige Services wie z.B. &lt;a href="http://www.mongodb.org/" target="_blank"&gt;MongoDB&lt;/a&gt;&amp;nbsp;bereits vorhanden, k&amp;ouml;nnen sofort genutzt werden und werden ohne eigenen Adminstrationsaufwand "mit skaliert". Braucht man mehr Kontrolle &amp;uuml;ber den eigenen Server und z.B. einen direkten Zugriff auf das Filesystem sollte man sich eher f&amp;uuml;r den No.de Service entscheiden.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://okiess.me/nodejs-deployment-in-der-cloud"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://okiess.me/nodejs-deployment-in-der-cloud#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/okiessme/~4/FHfxfSvUwgs" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1175860/oli128_128.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/people/3sTqrImwqxMd</posterous:profileUrl>
        <posterous:firstName>Oliver</posterous:firstName>
        <posterous:lastName>Kiessler</posterous:lastName>
        <posterous:nickName>okiess</posterous:nickName>
        <posterous:displayName>Oliver Kiessler</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://okiess.me/nodejs-deployment-in-der-cloud</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 22 Apr 2011 05:04:00 -0700</pubDate>
      <title>Was man tun kann, um auf eine EC2 Downtime vorbereitet zu sein</title>
      <link>http://feedproxy.google.com/~r/okiessme/~3/MCrAgOtnxeE/was-man-tun-kann-um-auf-eine-ec2-downtime-vor</link>
      <guid isPermaLink="false">http://okiess.me/was-man-tun-kann-um-auf-eine-ec2-downtime-vor</guid>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;span style="font-size: large;"&gt;Backup, Backup, Backup...&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Die Anwendungsdaten sollten so "beweglich" wie m&amp;ouml;glich sein, d.h. man sollte sich nicht nur auf seine &lt;a href="http://aws.amazon.com/ebs/" target="_blank"&gt;EBS Laufwerke&lt;/a&gt; verlassen. Wie die aktuelle &lt;a href="https://aws.amazon.com/de/ec2/" target="_blank"&gt;EC2&lt;/a&gt; Downtime in der us-east Verf&amp;uuml;gbarkeitszone gezeigt hat, kann man sich nicht nur darauf verlassen Snapshots von seinen Laufwerken zu haben. Unter Umst&amp;auml;nden kann man keine neuen Laufwerke aus Snapshots erzeugen. Daher sollte man zus&amp;auml;tzlich S3 Backups machen und am Besten auch noch ein Cloud Backup ausserhalb von AWS haben.&lt;/p&gt;
&lt;p&gt;Wenn man es sich leisten kann, ist eine Datenbank Replikation ausserhalb der eigenen AWS Verf&amp;uuml;gbarkeitszone sinnvoll (auch problemlos mit &lt;a href="http://aws.amazon.com/de/rds/" target="_blank"&gt;RDS&lt;/a&gt; m&amp;ouml;glich). Auch hier gilt, am Besten auch ausserhalb von AWS...&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: large;"&gt;Automatisiere deine Server Infrastruktur&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="font-size: 13px;"&gt;Wenn deine EC2 Server Images nur auf EBS Laufwerke zur Verf&amp;uuml;gung stehen, kann das auch problematisch sein. Wenn EBS nicht verf&amp;uuml;gbar ist, k&amp;ouml;nnen keine neuen Server Instanzen daraus gestartet werden, die man dann per Elastic IP verbinden k&amp;ouml;nnte.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="font-size: 13px;"&gt;Daher sollte man sein komplettes Server Setup zus&amp;auml;tzlich per Skript (z.B mit&amp;nbsp;&lt;a href="http://wiki.opscode.com/display/chef/Home" title="Chef" target="_blank"&gt;Chef&lt;/a&gt;) in einer anderen AWS Verf&amp;uuml;gbarkeitszone oder bei einem anderen Cloud Provider wiederherstellen k&amp;ouml;nnen. Das Erstellen dieser Skripte kann unter Umst&amp;auml;nden zeitaufwendig sein, aber wenn es eine massive EC2 Downtime gibt, ist man dankbar f&amp;uuml;r die investierte Zeit.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: large;"&gt;Bundle everything...&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Auch die Library Abh&amp;auml;ngigkeiten deiner Anwendung k&amp;ouml;nnen dir in den Weg kommen, wenn du kurzfristig auf eine neue Umgebung umgeziehst. Im Falle von Ruby on Rails sollte man dar&amp;uuml;ber nachdenken, die Gem Abh&amp;auml;ngigkeit per Bundler direkt in die Anwendung zu integrieren (&lt;a href="http://gembundler.com/bundle_package.html" target="_blank"&gt;Packaging&lt;/a&gt;). Das erh&amp;ouml;ht den Grad der Mobilit&amp;auml;t deiner Anwendung und verringert den Einrichtungsaufwand deiner Server Umgebung. Hier muss dann nur Ruby und Bundler verf&amp;uuml;gbar sein, statt eine Vielzahl von Gems in der korrekten Version.&lt;/p&gt;
&lt;p&gt;Neue Library Versionen haben oft kleinere API &amp;Auml;nderungen zur Folge und k&amp;ouml;nnen dann beim Umzug deiner Anwendung auch noch in Codeanpassungen enden oder eine Debugging H&amp;ouml;lle verursachen, bis man das entsprechende Problem in einer Library gefunden hat.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: large;"&gt;Hab deine DNS Zone unter Kontrolle&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: 13px;"&gt;Wenn man kurzfristig die komplette Anwendung umziehen muss, k&amp;ouml;nnen die DNS Einstellungen deines Domain Providers ein gro&amp;szlig;es Hindernis sein. Hier empfiehlt es sich die DNS Zone bei einem Provider zu betreiben, der extrem geringe TTL Zeiten und eine eigene Verwaltung erlaubt. Somit kann man schnell auf andere Elastic IP's verweisen oder gar auf eine IP bei einem anderen Cloud Provider. Also Massenprovider f&amp;uuml;r DNS absolut vermeiden! Die Flexibilit&amp;auml;t bei diesen reicht einfach nicht und auch der Kontakt zum Support kann sehr frustrierend sein... Auch eine Sache, die einem erst im Notfall klar wird ;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: large;"&gt;Verstehe die Abh&amp;auml;ngigkeiten der Cloud Services, die du benutzt&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Meine Website z.B. war auch von der Downtime in der us-east&amp;nbsp;Verf&amp;uuml;gbarkeitszone&amp;nbsp;betroffen. Warum? Die Website selber l&amp;auml;uft nicht in us-east, aber ich nutze als Cloud Service "mongohq", bei denen meine MongoDB betrieben wird. Dieser Cloud Service wiederum nutzt wie so viele alle andere Cloud Services auch EC2 Server Instanzen... Daher war ich dann auch direkt betroffen. Wusste ich im Vorfeld das mongohq seine Server in us-east bei AWS betreibt? Nicht wirklich...&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: large;"&gt;Fazit&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Sollte man nun auf EC2 und andere Cloud Provider verzichten? Nein. Downtimes k&amp;ouml;nnen &amp;uuml;berall vorkommen und sind im Falle von EC2 recht selten. Aber man sollte der Cloud auch nicht blind trauen und vor allem muss man gut vorbereitet sein. Wie immer wenn es um den professionellen Betrieb von Webanwendungen geht, sind die Themen Standardisierung und Automatisierung extrem wichtig...&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://okiess.me/was-man-tun-kann-um-auf-eine-ec2-downtime-vor"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://okiess.me/was-man-tun-kann-um-auf-eine-ec2-downtime-vor#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/okiessme/~4/MCrAgOtnxeE" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/1175860/oli128_128.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/people/3sTqrImwqxMd</posterous:profileUrl>
        <posterous:firstName>Oliver</posterous:firstName>
        <posterous:lastName>Kiessler</posterous:lastName>
        <posterous:nickName>okiess</posterous:nickName>
        <posterous:displayName>Oliver Kiessler</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://okiess.me/was-man-tun-kann-um-auf-eine-ec2-downtime-vor</feedburner:origLink></item>
  </channel>
</rss>

