Etikettarkiv: memcache

Docker är kittet i DevOps

Docker

Då och då dyker det upp mjukvara som underlättar livet avsevärt, då man nästan utropar Heureka! När jag först lärde mig använda Fabric så tycke jag att detta var ju guld värt: Att slippa göra samma sak manuellt på flera servrar. DevOps-filosofin i ett nötskal

Men! Nu tog jag mig tid och försökte lära mig Docker. Docker har tagit det hela lite längre och isolerar filer samt processer från underliggande operativsystem samt innehar versionshantering. Vad innebär detta då?

Jo, för sådana som mig som har beroenden långt utanför vad vanliga webbhotell kan leverera såsom Redis, Sphinx och Memcache så är Docker en mjukvara som löser detta.

Man kan kort och gott säga att Docker är ett operativsystem i operativsystemet. Lite som Xen eller Vmware men mycket ”lättare”.

I detta underliggande operativsystem så utgår du från en spegelbild som fungerar som bas och allt du lägger till får en ny revision. Detta gör exempelvis om du vill flytta en webbsajt med Redis, MySQL och Sphinx Search från en server till en annan så behöver du enbart flytta det som ändrats från spegelbilden.

Docker är så klart öppen källkod och helt gratis att använda. Och inte nog med det så är det ett MeetUp om några veckor i Stockholm om just DevOps och Docker med talare från bl.a. Spotify:

Dödar gamla buggar på bloggnätverket

I går så fixade jag en fem år gammal bugg som gjorde att cachningen på min sajt BloggVärde fungerade suboptimalt. Felet bestod i att jag använde en sekundräknare som uppdaterades i en SQL-fråga mot databasen.

Dock så cachar jag genom memcache och en md5-summa som beräknas på SQL-frågan, eftersom SQL-frågan blev ny varje sekund så cachades bara frågorna i en sekund. Det sänker förvisso belastningen till SQL-servern lite men när jag hade fixat buggen så gick sajten flera sekunder snabbare.

Jag har även flyttat över BloggNytt till molnet aka Amazon EC2 och håller på att flytta mer av mitt bloggnätverk från 2007.

Du glömmer väl inte att lägga till ping.bloggnytt.se i din lista över XML-RPC tjänster som du pingar från WordPress? Du lägger in http://ping.bloggnytt.se under Inställningar->Skrivinställningar och Uppdateringstjänster.

 

WordPress prestanda 101

Under Sweden Social Web Camp så försökte jag på kort under en session tid förklara hur man kan analysera och hitta flaskhalsar i WordPress gällande prestanda. Så därför försökte jag här sammanfatta det jag pratade om på några rader.

Först och främst så bör du stänga av alla plugins och då se om prestandan fortfarande är dålig, för tyvärr finns det många dåliga plugins (se här då Computer Sweden intervjuade mig och Nikke, år 2009).

Okej, nästa grej att testa är att slå på något cache-plugin i form av W3 Total Cache eller WP Super Cache. Du kan även testa att ”städa upp” i databasen då många plugins lägger temporär eller onödig information i databasen (kommentera om du vet något plugin som gör detta).

Använder du ett cache-plugin så bör du även installera memcached samt titta i källkoden längst ner på sidan hur många SQL-anrop som cachas, exempelvis (skriver WP Super Cache också ut detta?):

Object Caching 730/765 objects using memcached

En annan grej man kan testa är att använda strace direkt från kommandotolken i Linux tillsammans med PHP, ungefär så här:

$ cd /min/blogg/

$ strace php index.php

Så får du lite loggrader utspottade på skärmen och om det står still länge på ett ställe så ser du exakt vad som händer på den raden. Samt så bör du även testa Xdebug så kan berätta exakt vilken rad i PHP-koden som går långsamt, tar lite tid att installera och använda.

Du kan även titta i MySQL:s slow-log som kan aktiveras på eller hittas i /etc/mysql/my.cnf (sök efter log_slow_queries).

Sist men inte minst det som jag brukar göra är att lägga upp Varnish som en front-end proxy framför Apache exempelvis, detta är en helt mer eller mindre transparent lösning. Kom även ihåg att Apache slukar massor av minne jämfört med Nginx som istället kan användas till memcached. Detta är nog det bästa tipset jag kan ge samt att testa använda ett CDN.

Sen finns det så klart mycket man kan göra på själva sidorna som WordPress spottar ut (sprites, javascript etc), men det är utanför detta blogginlägg.

Uppdatering: Glömde skriva två saker som jag nämnde på sessionen, dels är det att använda sig av en OP-code cache typ APC eller eAccelerator samt så kan även URL-strukturen i WordPress slöa ner prestandan.

MongoDB – Test av NoSQL, del 1

Som läsare av denna blogg så vet du nog vid det här laget att jag har en stor kärlek till det som kallas för NoSQL. Dvs systemlösningar som inte enbart innefattar SQL.

Tre av de stora kandidaterna till att snabba upp MySQL eller byta ut MySQL helt heter Redis, CouchDB samt MongoDB men vilken ska man välja? Som du kanske förstår så finns det inget bra svar på detta men jag tänkte här nedan försöka ge en liten inblick hur det är att installera och använda respektive dokumentcentrerad (icke SQL) databas.

Andra NoSQL-system som är värda att nämna är Neo4j, Tokyo Cabinet, Memcache samt Cassandra.

Bakgrund MongoDB

Används av sajter såsom bit.ly och foursquare. Utvecklat i C++ och överbryggar RDBMS och nyckel-värde lagring.

Installation MongoDB

Installationen gick mycket smidigt på mitt Ubuntu 10.10 system med hjälp av apt:

$ sudo apt-get install mongodb-server

Då installeras MongoDB, xulrunner samt så läggs en användare vid namn mongodb upp. Mongodb lyssnar även på två TCP-portar på 127.0.0.1

För PHP-stöd till MongoDB så kan pecl-porten användas och installeras på följande sätt:

$ sudo pecl install mongo

Om du får ett felmeddelande i stil med:

sh: phpize: not found
ERROR: `phpize’ failed

Så måste Ubuntu-paketet php5-dev installeras där phpize ingår. För att sedan få php att ladda in mongo-modulen så kan följande kommando användas:

$ sudo sh -c ”echo extension=mongo.so > /etc/php5/conf.d/mongo.ini”

För att sedan använda MongDB så kan exempelvis följande PHP-kod användas för test:

<?php

// connect

$m = new Mongo();

// select a database

$db = $m->comedy;

$collection = $db->cartoons;

// add an element

$obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );

$collection->insert($obj);

// find everything in the collection

$cursor = $collection->find();

// iterate through the results

foreach ($cursor as $obj) {

echo $obj["title"] . "\n";

}

// disconnect

$m->close();

?>

För att sedan verifiera testa:

$ php mongodb.php

Så bör följande visas:
Calvin and Hobbes
Andra inlägg i denna serie kommer snart.

NoSQL – MySQL och memcached på väg bort

Jag ser fler och fler välja alternativa lösningar till MySQL och memcached och väljer då istället exempelvis Redis eller Cassandra. Ryan King som jobbar på Twitter intervjuades nyligen och berättade att de håller på att gå över till Cassandra för att lagra deras ofantliga mängder med tweets.

Som jag har skrivit tidigare så använder jag Redis för alla mina nya projekt men ser även till att ha en kopia kvar i MySQL för att Sphinx skall indexera fritext. Men jag kommer förmodligen att skippa MySQL helt snart eftersom Sphinx även kan läsa in exempelvis fritext från XML som kan genereras från innehållet i Redis.

När jag startar mitt nästa projekt så kommer jag att skippa MySQL och memcache helt och försöka att bygga en lösning som enbart förlitar sig på Redis (och Sphinx så klart).

Kategorisering av de olika lagringstyperna:

  • Key-value stores: Redis, Scalaris, Voldmort, and Riak.
  • Document stores: Couch DB, MongoDB, and SimpleDB.
  • Record stores: BigTable, HBase, HyperTable, and Cassandra.
  • Scalable RDBMSs: MySQL Cluster, ScaleDB, Drizzle, and VoltDB.

Glöm inte läsa denna rapport som nyss släpptes på ämnet:

High Performance Scalable Data Stores av Rick Cattell

NoSQL here we come.

Redis är guds gåva till webbutvecklaren

Efter mitt blogginlägg om hur jag använder Memcache för att logga många klick så fick jag ett tips av Emil Stenström (som bl.a bloggar på FriendlyBit.com) om att ta en titt på Redis. Redis går lättast att beskriva som en storebror till Memcache som fungerar ungefär på samma sätt men har betydligt fler funktioner.

Redis stödjer exempelvis listor där du lätt kan skapa en FIFO-lista eller varför inte spara data under en längre tid eftersom Redis standardmässigt inte kastar bort något som Memcache gör.

Att installera och använda Redis under Ubuntu 9.10 så kan du göra enl. följande:

$ sudo apt-get install redis-server

$sudo apt-get install libphp-redis

Sedan är det bara att inkludera /usr/share/php/redis.php i din PHP-kod och testa Redis:

<?php

require_once "/usr/share/php/redis.php";
$redis = new Redis();
$redis->set("nyckel", "värde");
echo $redis->get("nyckel");

?>

Prestandan är imponerande:

110000 SETs/second, 81000 GETs/second

Observera även att paketet redis-server finns med i Ubuntu från och med version 9.10.

Logga många klick

Jag gillar att klura på problem, speciellt när jag kan klura länge och väl. Det är så att jag har ett nytt projekt där jag avser att logga många klick i sekunden och av erfarenhet tidigare då jag utvecklat bl.a BloggVärde så vet jag att det inte är direkt så lätt som det låter.

Att uppdatera i MySQL med UPDATE eller dylikt är en på tok för dyrbar process så därför har jag nu klurat fram en lösning som troligtvis är bättre:

Jo, det är så att memcache har stöd för increment samt så går det att köra memcached processen med -M flaggan som ser till att inget åker ut, dock så är det då upp till dig själv att se till att du inte överskrider minnet du allokerar till memcached.

Sen så ser jag bara till att kontrollera vad värdet är ungefär var femte minut och skriver ner det till MySQL-databasen samt rensar värdet.

Smart va? Hoppas det funkar i praktiken..

Skapa din egen URL-förkortare

Vill du också ha en egen personlig URL-förkortare? Jag skapade ju en för några månader som hittas på to.ly och redan så har 100 000 url:er förkortas. Tjänsten har ett API samt lite plugins till bl.a IE och Firefox.

Nu tänkte jag dela med mig av de erfarenheter jag har erhålligt genom att skapa denna tjänst och sammanfattar det nedan.

1. Domännamn

Hela poängen att ha en URL-förkortare är ju att skapa korta URL:er och då är ju ett kort domännamn en bra grej att ha. Några populära TLD:er för URL-förkortare är LY (Libyen) samt GD (Grenada) och vill du veta hur du kan registrera domäner under dessa TLD:er så kan tjänsten domai.nr hjälpa dig:

Annars så finns det även korta domäner på andrahandsmarknaden: n.nu såldes nyligen för 325€

2. Webbserver

Jag gillar verkligen Apache men den slukar för mycket minne allt för ofta och då finns det lite andra bra alternativ:

Planet PHP hade nyligen en artikel om hur du får Nginx att fungera med FastCGI och PHP. Kom även ihåg att göra så att 404 (ej hittas) fel går till din funktion som gör uppslagningar any2dec() (se nedan).

3. Databas

Att ha något slags databasbackend är ju att föredra och till en början så kan det vara bra att hålla det enkelt, jag började med att bara logga undan URL’er och ett löpnummer (auto_increment). Detta för att förhindra dubletter

4. Koden

Den grundläggande principen är enligt följande:

  1. Någon vill förkorta en URL, du kontrollerar om den redan finns och finns den inte så:
  2. Skapa en kort URL, url:en baseras på det löpnummer som MySQL INSERT auto_increment returnerar och funktionen dec2any() som hittas här.

För att förhindra att långsamma databasuppslagningar som söker efter dubletter vid INSERT så kan Sphinx användas för att generera ett index varje natt och sedan gör du slagningar mot Sphinx samt MySQL (dagens URL:er).

Jag använder även memcached när jag kollar efter dubletter samt vid ompekningen (HTTP 301 Moved Permanently).

5. Spam

Du bör även lägga in spärrar för att föhindra  spam och då kan bl.a SURBL vara till hjälp: http://www.surbl.org/ eller detta pear-paket: http://pear.php.net/package/Net_DNSBL/