Category Archives: Uncategorized

Já plácám sochy z hlíny

Slovutný architekt Dagi poodhalil tajemství své čarodějnické dílny a tím mě vyprovokoval k popisu toho, jak dělám sochy já. Nejsem žádný Michelangelo, který tvrdil, že je socha ukryta v kameni a je jen potřeba ji jen osvobodit, odsekat ten balast kolem.

Občas tedy zažiji ten úžasný pocit, kdy do kousky programu do sebe zapadají jako kousky skládačky. Okamžiky, kdy se sám od sebe vyloupne dobrý návrh, který je jednoduchý, elegantní a funkční. Ale to se mi děje jen občas, většinu času si připadám jako když plácám sochy z hlíny.

To si člověk nejdřív musí připravit kostru, aby bylo na co plácat. Jinak se mu ta socha vlastní vahou zbortí. Takže si člověk nejdřív musí rozmyslet, co za sochu vlastně potřebuje. Jestli to bude člověk, kůň nebo sedmihlavá saň. Je dobré si ujasnit kolik nohou, hlav a jiných výběžků to bude mít. V tomto okamžiku rozhodně není nutné se rozhodovat jestli to bude diktátor, spisovatel nebo básnířka. Je ale dobré vědět, že to bude člověk a že třeba bude stát vzpřímeně. Jakmile mám v tomto jasno, stluču si hrubou kostru a můžu začít plácat.

A pak už jen plácám, tady ubírám sem přidávám, často se mi to nedaří tak odhazuji celé velké kusy. V extrémním případě musím hýbat i s kostrou, ale to je pak velký problém. Většinou se snažím držet se kostry a plácat. Občas dokonce někam plácnu velký kus, který tam jako by zázrakem patří, který dá soše úplně jinou dimenzi. Většinu doby je to, ale spíš takové plácání pokus omyl a pomalé přidávání. Začínám tím co mi připadá důležité. U lidí to bývá obličej, u koní tělo a u sedmihlavých saní pozice hlav. Nicméně se to liší socha od sochy. V jednom se s Dagim nelišíme, detaily si obvykle necháváme na poslední chvíli. Důvod je zřejmý. Jakmile máte detaily, hrozně neradi ty kousky předěláváte. Jakmile máte dokonalý nos, hrozně těžko se vám odhodlává dát obličeji úplně jiný výraz. Jakmile máte hotovou ruku, těžko se přesvědčíte k tomu, že by v ní měl vlastně držet samopal a ne palcát. Takže je potřeba plácat a plácat a doufat v to, že jednoho krásného dne se vyloupne socha, která je prostě povedená. U které sice nebudete vědět jak jste se k ní dopracovali, ale i tak se vám bude líbit. No a když štěstí mít nebudete, tak to vždy můžete prohlásit za moderní umění a prodat mnohem dráž než nějakou normální hezkou sochu.

Končíme s CloudTools

Tento zápisek navazuje na předcházející „Začínáme s Amazon Elastic Cloudem“. Původně jsem se chtěl zabývat projektem CloudTools hlouběji, ale jak jsem zjistil, tak růžové to s tímto nástrojem není.

CloudTools je sada nástrojů, které Java programátorům usnadňují práci s EC2. Poskytují AMI, o kterém jsem se zmiňoval minule, obsahují Groovy skripty pro práci s Grails a hlavně Maven plugin, kterému se budeme věnovat dnes.

Pokud si to chcete sami vyzkoušet, můžete si stáhnout můj příklad ze SVN, jinak to samé můžete udělat i s jakýmkoliv web projektem. Pro to, abychom mohli aplikaci automaticky nasadit na EC2 musíme upravit pom.xml. Musíme přidat pluginRepository odkud se stáhne CloudTools plugin.

	<pluginRepositories>
		<pluginRepository>
			<id>pia-repository</id>
			<url>http://www.pojosinaction.com/repository
			</url>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</pluginRepository>
	</pluginRepositories>

Musíme samozřejmě nakonfigurovat i plugin samotný.

<plugin>
	<groupId>net.chrisrichardson</groupId>
	<artifactId>cloudtools-maven-plugin</artifactId>
	<configuration>
		<awsPropertiesFile>
			aws.properties
		</awsPropertiesFile>
		<schemaName>simplechat</schemaName>
		<schemaUsers>
			<param>
				chat:chat
			</param>
		</schemaUsers>
		<catalinaOptsBuilder>
			{builder, databasePrivateDnsName, slaves ->
			builder.arg("-server")
			builder.arg("-Xmx1000m")
			builder.prop("ptrack.application.environment", "ec2")
			builder.prop("jdbc.db.server", databasePrivateDnsName)}
		</catalinaOptsBuilder>
	</configuration>
</plugin>

Zde je asi nejdůležitější cesta k aws.properties. V ostatních elementech zadáváme přístupové údaje k MySql a konfiguraci Tomcatu. V aws.properties definujeme následující:

imageId.m1.small=ami-6f2cc906
accessKey=XXXXXXXXXXXXXXXXX
secretKey=XXXXXXXXXXXXXXXXX
keyName=Pair1
keyPairFile=/home/lukas/tmp/id-Pair1
sshDir=/usr/bin/

Většinu známe z minulého dílu a z ElasticFoxu. Pokud už máme všechno nakonfigurováno, spustíme mvn package pro vytvoření war souboru. Pak můžeme zkusit spustit mvn cloudtools:deploy. Teto příkaz nejdříve nahraje WAR do S3, nastartuje EC2 server, spustí MySql, vytvoří schéma a kdybychom mu zadali cestu k SQL skriptu, tak by podle něj i vytvořil tabulky. Poté stáhne z S3 WAR na server, nasadí ho a nakonfiguruje Tomcat. Ten spustí a zkusí jestli se všechno podařilo. Vy to můžete otestovat tak, že si server zobrazíte v ElasticFoxu, zkopírujete jeho “Public DNS Name” a zadáte ho do prohlížeče. Pokud jste si udělali díru do firewallu, aplikace by měla být vidět jak na portu 8080 tak i přes Apache na portu 80.

Pokud se ale CloudTooly pokusíte o něco složitějšího, ošklivě narazíte. A to hlavně na zoufalý nedostatek dokumentace. Na WIKI projektu mají pár stránek, z kterých se dá něco zjistit. Něco se dá i vykoukat ze zdrojových kódů. Ty jsou ovšem v Groovy a navíc jsem tam snad nezahlédl ani řádek komentáře, takže taky nic moc. Když jsem zkoušel spouštět složitější topologie clusteru, tak mi to nastartovalo osm serverů, nevěděl jsem proč, co na nich má běžet a hlavně to zas tak moc dobře nefungovalo. Už sice mám představu co a jak by se dalo udělat, ale nějak nemám náladu se tím brodit.

Je taky potřeba se zamyslet nad tím, co bychom vlastně potřebovali. Pro vývoj nám cloudtools:deploy, popřípadě cloudtools:redeploy stačí. Pro ostrý provoz si myslím, že Maven plugin není to nejlepší. Spíš bychom potřebovali něco, co nám ty servery bude hlídat, automaticky startovat nebo vypínat a podobně. To by měl umět projekt ElasticGrid, ale ten má snad ještě horší dokumentaci než CloudTools.

Nicméně mám v hlavě nápad, jak udělat CloudTools o trochu použitelnější. Umí totiž po nastartování serveru spustit libovolný shell skript (viz. zde). Takže teoreticky se dá třeba snadno nainstalovat a spustit například Terracotta aniž by se člověk musel brodit Groovy kódem. Je sice škoda, že není snadné využít existující funkcionalitu, která tam už pro podobné účely je, ale to je bohužel klasický osud nezdokumentovaného kódu.

Začínáme s Amazon Elastic Cloudem

Právě jsem absolvoval první krůčky s Amazon EC2. Abych se donutil si zapsat co a jak se dělá, tak se s vámi o své zkušenosti podělím. Berte to prosím tak, že se to sám teprve učím, takže je docela možné, že ne všechno co tu napíši musí být tak úplně pravda.

Začněme lehkým úvodem do služeb Amazonu (AWS). V podstatě všechny tyto služby mají jednoduché WS rozhraní, pomocí kterých je můžeme ovládat. Jedna z nejpoužívanějších služeb je S3. Ta vám za levný peníz umožní ukládat data na síti. Velmi jednoduše můžete na S3 nahrávat soubory, stahovat si je, můžete je nahrávat tak aby byly veřejné a podobně. Amazon se stará o poskytování služby, zálohování, dostupnost a podobné nezáživné věci. Pěkné na této službě je to, že platíte jen to co využijete. Tzn. místo zabrané na discích a množství přenesených dat. Ceny jsou docela mírné, pohybují se kolem $0.15 za GB/měsíc uložený nebo za GB přenesený. Takže pokud vám tam jen leží pár mega dat, banka vám každý měsíc strhává dvacet haléřů, tak jako mě. Pro snadné používání doporučuji S3 plugin do Firefoxu.

Další zajímavou službou je EC2 (Elastic Cloud alias Pružný Mrak). V podstatě jde o virtuální server, se kterým si můžete dělat co chcete. Máte na výběr mezi několika konfiguracemi, které se liší výkonem, pamětí a diskovým prostorem. Zde také platíte jen využitý čas. Tzn. jenom za severy, které opravdu běží, cena se pohybuje kolem $0.10 za hodinu za nejlevnější stroj. Takže pokud potřebujete unixový server na hraní, tak toto je opravdu hodně dobrá volba.

Pokud si chceme začít hrát, tak si nejdříve musíme u Amazonu zařídit účet, dát jim číslo platební karty a říci jim, že chceme používat EC2 a S3, popřípadě další ze zajímavých služeb které nabízejí. Pro začátek nám ale bude stačit EC2 a S3. Amazon nám vygeneruje identifikátor (AWS access key ID) a heslo (AWS Secret Access Key). Pomocí těchto údajů se budeme identifikovat.

Teď už můžeme zkusit nahodit server. Já k tomu používám Elasticfox. To je plugin do Firefoxu, který umožňuje správu serverů ve vašem mráčku. Takže si ho nainstalujeme, zadáme přístupové údaje a můžeme začít startovat server. Před tím vám ale doporučuji v záložce KeyPairs vygenerovat párek klíčů pro SSH. Jakmile máme vygenerovány klíče, můžeme nahodit server.

Ale jaký? Co na něm bude nainstalováno za systém a software? To určuje AMI (Amazon Machine Image). Ten si teoreticky můžete vytvořit sami, ale pro začátek můžeme použít nějaký existující. Doporučuji například ami-6f2cc906, ten obsahuje CentOS 5, Javu 6, Tomcat 5.5 a MySql a pár dalších věcí. Navíc je kompatibilní s CloudTools, které můžeme použít například pro deploy pomocí Mavenu.

V Elasticfoxu se tedy přepneme do záložky Images, vybereme si AMI a řekneme že chceme nahodit server. Zvolíme si SSH klíč, který jsme si vygenerovali a klikneme na Launch. Amazoni nám přidělí virtuální server, plácnou na něj AMI obraz a nastartují ho. Trvá to pár minut, ale na konci dostaneme linuxový server, s kterým si můžeme dělat co chceme. Když si připlatíme, tak může mít i veřejnou IP adresu. Tady pozor, standardně má server otevřený jen port 22, jakýkoliv další musíte explicitně otevřít. V Elasticfoxu to najdete v záložce Security Groups.

Další věc na kterou je potřeba si dát pozor, je to, že disk který máte k dipozici v EC2 není zrovna nejtrvalejší. Pokud Amazonům náhodou ten server spadne, tak je možné, že přijdete o všechna data, která jste měli na disku uložena. Pokud se s tím nechcete smířit, musíte si je zálohovat třeba na S3 nebo ukládat na Elastic Block Store (EBS). U těchto služeb prý zajišťují vysokou spolehlivost.

To je pro dnešek všechno, příště se podíváme na to jak používat CloudTools. Ale to musím nejdřív ještě vyzkoumat. Něco už s tím umím, ale vypadá to, že to umí automagicky nakonfigurovat MySql cluster, Terracotu, Apache a další věci o kterých mám jen okrajové tušení. Tak se nechte překvapit.