Schlagwort-Archiv: PostgreSQL

Duplikate aus einer PostgreSQL-Datenbank sicher entfernen

Kleine Notiz, auch für mich selbst. Wer aus einer PostgreSQL-Datenbank mal flott alle Dupli­kate löschen möchte, kann wie folgt vorgehen:

DELETEFROM    tabellennameWHERE   feldmituniquekey NOT IN  (SELECT   MAX(dup.feldmituniquekey)  FROM      tabellenname As dup  GROUP BY  dup.doppeltezeile1, dup.doppeltezeile2, dup.doppeltezeile3, dup.doppeltezeile4);

Die Anzahl der GROUP-BY-Felder kann belie­big erwei­tert wer­den, um das ver­se­hent­li­che Löschen von teil­weise iden­ti­schen Daten­sät­zen zu verhindern.

Drei PPAs für den modernen Mann

Um die Vor­teile eines LTS-Release von Ubuntu (aktu­ell 10.04.2) wei­ter­hin genie­ßen zu kön­nen, ohne auf aktu­elle Soft­ware ver­zich­ten zu müs­sen, gibt es unter Ubuntu die so genann­ten PPAs, Per­so­nal Package Archi­ves. Das sind sepa­rate Repo­sito­rys, mit denen man sein Ubuntu füt­tern kann um Pakete über die Paket­ver­wal­tung zu instal­lie­ren, die aus irgend­ei­nem Grunde noch kei­nen Weg in die offi­zi­el­len Repo­sito­rys der Dis­tri­bu­tion gefun­den haben. Cano­ni­cal ver­folgt die Phi­lo­so­phie, inner­halb eines Release keine Ver­si­ons­sprünge der ursprüng­lich aus­ge­lie­fer­ten Soft­ware mit­zu­ma­chen. Was sehr schade ist, hängt man doch so auf Post­greSQL 8.4, Git 1.7 und Nginx 0.7 fest. Dank eini­ger fleis­si­ger Paket­schnü­rer gibt es aber PPAs, die genau diese Pro­bleme behe­ben. Da ich alle drei zuvor genann­ten Anwendungen/Dienste regel­mä­ßig und auf ver­schie­de­nen Ser­vern nutze, habe ich mir dafür ent­spre­chende PPAs rausgesucht.

Um PPAs zum Sys­tem hin­zu­zu­fü­gen, bie­tet sich das Kom­mando add-apt-repository an. Sollte das Kom­mando nicht gefun­den wer­den kön­nen, leis­tet fol­gen­der Befehl Abhilfe:

sudo aptitude install python-software-properties

Die­ses Kom­mando fügt das Repo­sitory zur Apt-Sources-Liste hinzu und impor­tiert gleich den pas­sen­den GPG-Schlüssel.

Fügen wir nun nach­ein­an­der die drei zuvor erwähn­ten PPAs hinzu:

sudo add-apt-repository ppa:nginx/stablesudo add-apt-repository ppa:git-core/ppasudo add-apt-repository ppa:pitti/postgresql

Ein abschlie­ßen­des sudo aptitude update nicht ver­ges­sen und schon sind die aktu­el­len Ver­sio­nen von Nginx, Git und Post­greSQL via apt/aptitude verfügbar.

Heroku: Rails-Anwendungen in der Cloud

Die Cloud, das Buz­zword des letz­ten Jah­res, ist in aller Munde. Und hat auch schon erste Federn las­sen müs­sen. Was die Cloud eigent­lich kenn­zeich­net, ist nahezu gren­zen­lose Ska­lier­bar­keit. Wenn es nach den Befür­wor­tern der Cloud geht, bucht nie­mand mehr phy­si­ka­li­sche Maschi­nen, son­dern Spei­cher­platz, RAM, Rechen­leis­tung in dem Umfang, den er benö­tigt. Wird zwi­schen­zeit­lich mal mehr gebraucht, dreht man kurz an der ent­spre­chen­den Schraube und zahlt eben für die Zeit ein wenig mehr. Es gibt unheim­lich viele Anbie­ter, gerade Ama­zon, eigent­lich Inter­net­ein­zel­händ­ler, hat in die­sem Bereich von sich reden gemacht. Ama­zon bie­tet alles denk­bare an Cloud-Dienstleistungen an, was man sich nur so vor­stel­len kann. Genau das ist dem Wikileaks-Projekt zum Ver­häng­nis gewor­den, weil der Anbie­ter somit auch am ein­zi­gen Hebel sitzt. Legt er den um, ist Fei­er­abend. Ama­zon bie­tet zwar eine recht große Pro­dukt­pa­lette an, alles abde­cken tun sie dann aber auch nicht.

Wer bei­spiels­weise Rails-Anwendungen in der Cloud lau­fen las­sen möchte, ist auf andere Dienst­leis­ter ange­wie­sen. In den letz­ten Jah­ren hat sich ein Anbie­ter namens Heroku einen Namen in der Com­mu­nity gemacht. Erst kürz­lich wurde Heroku von salesforce.com, einem gro­ßen Anbie­ter von Geschäfts­an­wen­dun­gen, für rund 212 Mio. US-$ aufgekauft.

Heroku hat ein für den Ent­wick­ler sehr effi­zi­ent zu nut­zen­des und ein­fa­ches Deployment-Verfahren ent­wi­ckelt, wel­ches kom­plett Git– und Rake-gestützt ist. Der Rails-Entwickler muss sich also nicht mit der Admi­nis­tra­tion und Kon­fi­gu­ra­tion von Web­ser­vern her­um­är­gern. Ein Vor­teil gegen­über den klas­si­schen Rails-Hostern, von denen es ohne­hin rela­tiv wenige gibt ist, dass man nicht auf die vom Hos­ter instal­lier­ten Ruby-Gem-Versionen ange­wie­sen ist, son­dern seine eige­nen Ver­sio­nen spe­zi­fi­zie­ren kann, wie man es von sei­ner Ent­wick­lungs­ma­schine her kennt.

Wer reine Rails-3-Anwendungen deployen möchte, hat seine Anwen­dung bin­nen weni­ger Minu­ten online:

sudo gem install herokugit initheroku creategit add .git commit -a -m 'first deployment commit to Heroku'git push heroku masterheroku rake db:migrateheroku open

Das war es schon. Die Anwen­dung sollte online sein und sich im Brow­ser geöff­net haben.

Bei Rails-2-Anwendungen gestal­tet sich das Deploy­ment etwas schwie­ri­ger, aber auch nicht viel. Bevor man die oben erwähnte Befehls­kette anschub­sen kann, muss erst ein­mal eine Datei namens .gems erstellt wer­den. In die­ser müs­sen dann alle erfor­der­li­chen Gems, ggf. inklu­sive Ver­si­ons­num­mer notiert wer­den. Beispiel:

rails --version 2.3.5i18n --version 0.4.2rack --version 1.0.1

Erst dann darf deployed wer­den. Neben den oben erwähn­ten Mög­lich­kei­ten gibt es aber noch viele wei­tere, die alle­samt auf den wirk­lich tol­len Sup­port– und Dokumentations-Seiten von Heroku doku­men­tiert sind. So kann man, sofern man bereits lokal Post­greSQL ver­wen­det, sei­nen kom­plet­ten Daten­bank­in­halt mit­tels heroku db:push in die Anwen­dung bei Heroku pus­hen. Post­greSQL ist übri­gens die ein­zige Daten­bank, die von Heroku ange­bo­ten wird. Laut Heroku des­we­gen, weil sie dort die opti­male Kom­bi­na­tion zwi­schen Zuver­läs­sig­keit, Daten­in­te­gri­tät und Geschwin­dig­keit sehen. Ein State­ment, das ich durch­aus unter­schrei­ben kann. Das heroku-Gem ist äußerst mäch­tig und bie­tet einem Zugriff auf sämt­li­che instal­lier­bare Add-Ons (s.u.), auf die Logs und noch vie­les mehr. Eine Stu­die der Doku­men­ta­tion ist empfehlenswert.

Ab sofort kann dann direkt in den Anwen­dungs­con­tai­ner bei Heroku deployed wer­den, indem man ein ganz regu­lä­res Git-Commit erstellt. Ein­fa­cher geht es kaum noch.

Nach­dem die erste Ver­sion der Anwen­dung deployed wurde, kann man sie um einige tolle, teil­weise auch kos­ten­los nutz­bare Add-Ons erwei­tern. Dazu gehö­ren nütz­li­che Erwei­te­run­gen wie CNAME-Einträge für die Anwen­dung (damit man sie auch unter einer eige­nen (Sub-)Domain betrei­ben kann), Jasondb, Mon­goDB und CouchDB für die NoSQL-Anhänger unter uns, Exception-Tracker, Echt­zeit­su­che, New Relic, SMS-Gateways, auto­ma­ti­sierte Daten­bank­back­ups, etc. Man­che kos­ten gar nichts, man­che nur wenig Geld, andere wie­derum sind recht teuer (wobei teuer mal wie­der rela­tiv ist). Dolle ins Geld geht ein SSL-Zertifikat, da sol­che Zer­ti­fi­kate wei­ter­hin IP-basiert sind, was bei einem Cloud-basierten Dienst natür­lich recht fins­ter wer­den kann.

Apro­pos Kos­ten: jeder kann bei Heroku belie­big viele Anwen­dun­gen hos­ten las­sen, die auch erst mal nichts kos­ten, in der Leis­tungs­fä­hig­keit aber arg ein­ge­schränkt sind. Benö­tigt man mehr Res­sour­cen, muss man in die Tasche grei­fen, ab ca. 36 US-$ (0,05 $-Cent pro Stunde) monat­lich geht es los. Dabei unter­teilt Heroku in Dynos und Worker. Dynos beschleu­ni­gen das Front­end, Worker die Hin­ter­grund­pro­zesse der Rails-Anwendung. Der Maxi­mal­aus­bau liegt bei 24 Dynos und 24 Workern, wofür dann aber auch 2,35 US-$ pro Stunde, oder umge­rech­net rund 1.700 US-$ monat­lich anfal­len. Die Per­for­mance­stufe dürfte aber auch „geho­be­nen“ Ansprü­chen genügen.

Damit ist aber noch nicht Schluss, denn eine dedi­zierte Daten­bank ist bei dem Preis noch nicht inklu­sive. Kos­ten­los gibt es 5 MB Shared Data­base, für 20 US-$ monat­lich 20 GB Shared Data­base. Wer gern eine dedi­zierte Daten­bank hätte, muss bspw. für den kleins­ten Tarif Ronin 200 US-$ monat­lich berap­pen. Dafür erhält er 16 gleich­zei­tige Ver­bin­dun­gen, 1,7 GB RAM und 1 com­pu­ting unit. Für 6.400 US-$ gibt es 400 Ver­bin­dun­gen, 68 GB RAM und 26 com­pu­ting units. Wer’s braucht…

Hero­kus Datei­sys­tem ist read-only, Datei­uploads las­sen sich also nicht rea­li­sie­ren. Hierzu kann/sollte man, auch laut Heroku-Dokumentation, auf Anbie­ter wie Ama­zon S3 aus­wei­chen. Für Rails-Anwendungen gibt es diverse Mög­lich­kei­ten, Uploads zu Ama­zons S3 (Sim­ple Sto­rage Ser­vice) aus der Anwen­dung her­aus zu rea­li­sie­ren. Nament­lich erwähnt wer­den Attachment-Fu und Paper­clip. Eine per­sön­li­che Prä­fe­renz kann ich hier abge­ben, ich hab mit bei­den noch nicht gear­bei­tet. Heroku emp­fiehlt im Übri­gen gene­rell, große Dateien, die die Appli­ka­tion zum Down­load bereit­stel­len soll, aus Per­for­mance­grün­den zu S3 oder ähn­li­chen Ser­vices aus­zu­la­gern, weil das Datei­sys­tem von Heroku nicht für der­ar­tige Anwen­dungs­zwe­cke kon­zi­piert und opti­miert wurde.

Um die Per­for­mance­un­ter­schiede mes­sen zu kön­nen, habe ich eine Instal­la­tion von Red­mine bei Heroku vor­ge­nom­men. Das Deployen die­ser Anwen­dung ist lei­der nicht total tri­vial, die ein­zel­nen Schritte habe ich des­we­gen in einem Gist (wel­cher auch noch mal ganz unten ein­ge­bet­tet ist) niedergeschrieben.

Zum Ergeb­nis mei­ner Bench­marks, gemes­sen auf einer Pro­jekt­über­sichts­seite mit ab -c 50 -n 200:

  1. 1 Dyno (kos­ten­los): 7,98 Requests pro Sekunde
  2. 2 Dynos: 13,15 Requests pro Sekunde
  3. 3 Dynos: 18,46 Requests pro Sekunde
  4. 10 Dynos: 53,46 Requests pro Sekunde
  5. 24 Dynos: 84,14 Requests pro Sekunde
  6. 1 Worker: 7,64 Requests pro Sekunde
  7. 2 Worker: 7,74 Requests pro Sekunde

Die Anzahl der Worker wirkt sich also in kei­ner Weise auf die Anwen­dungs­per­for­mance aus, die Anzahl der Dynos hin­ge­gen beträcht­lich. Den größ­ten Gewinn (pro­zen­tual gese­hen) bekommt man hier, wenn man von dem einen kos­ten­lo­sen Dyno auf einen zwei­ten, kos­ten­pflich­ti­gen auf­rüs­tet. Die monat­li­chen Kos­ten lie­gen mit die­sem bei rund 36 US-$, also umge­rech­net in etwa 27 €. Eigent­lich nicht zu viel ver­langt, man darf nur nicht ver­ges­sen, dass in die­sem Preis noch kein Sto­rage und nur 5 MB an Daten­bank­platz inklu­sive ist.

Zum Ver­gleich: mein nicht opti­mier­ter Root-Server (Athlon64 X2 6.400+, 4 GB RAM, OpenVZ) lie­fert rund 10,5
R
equests pro Sekunde. Den muss ich natür­lich selbst admi­nis­trie­ren, war­ten, etc. Und das Deploy­ment ist auch längst nicht so bequem bzw. müsste erst mal von mir auf die­sen Bequem­lich­keits­le­vel gebracht werden.

Heroku bie­tet für einen akzep­ta­blen Preis einen wirk­lich tol­len und per­for­man­ten sowie äußerst fle­xi­blen Ser­vice an. Für den Rails-Entwickler, der keine Lust hat, sich mit der Ein­rich­tung und Admi­nis­tra­tion eines Rails-fähigen Web­ser­vers rum­zu­schla­gen und ggf. auf­tre­tende Pro­bleme zu behe­ben ist Heroku aus mei­ner Sicht opti­mal. Zumal man hier nicht gleich einen zwei­ten Ser­ver hinzu kau­fen muss, nur weil die Anwen­dung an ein oder zwei Stun­den am Tag mal mehr Res­sour­cen braucht, als es die eigene Hard­ware zulässt. Die Anmel­dung kos­tet nichts und das Deployen der eige­nen (oder frem­den) Anwen­dung genau so wenig. Einem Ver­such steht also nichts im Wege. Viel Spaß dabei.

https://gist.github.com/779866