Přejít k navigační liště

Zdroják » Různé » Zrychlete své webové aplikace s Memcached

Zrychlete své webové aplikace s Memcached

Články Různé

V ére webových aplikácií pre tisíce, milióny či dokonca stovky miliónov užívateľov je výkon veľmi dôležitým aspektom často rozhodujúcim o ich úspechu či neúspechu. Cachovanie je jedna zo základných techník optimalizácie výkonu aplikácií. V tomto článku si predstavíme jeden z najpoužívanejších nástrojov pre cachovanie na strane servera – memcached.

Čo je cachovanie

Princíp cachovania bol vynájdený a aplikovaný už v ranných dobách vývoja software. Základná myšlienka je veľmi jednoduchá – umiestnením informácií na rýchlejšie médium sa docieli znateľného zlepšenia výkonu pri prístupe k týmto dátam. Vhodnou optimalizáciou algoritmov aplikácie sa následne zníži množstvo výberov z pomalšieho média.

Cachovanie môžeme nájsť implementované v rôznych formách aj v bežných, denne používaných aplikáciách:

  • webový prehliadač cachuje obrázky, skripty alebo celé stránky stiahnuté zo servra na disk klienta
  • textový editor načíta obsah celého súboru z disku do pamäte, vďaka čomu s ním môže rýchlejšie pracovať
  • servrová aplikácia ukladá dáta načítané z databáze do pamäte pre budúce zrýchlenie prístupu k nim

Čo je memcached

Tento článok poskytuje úvod do cachovania na strane servera pomocou open-source systému memcached. Ukážeme si, ako nainštalovať memcached na Linuxe a Windows, základy použitia a predstavíme knižnice pre vybrané programovacie jazyky. Účel článku je poskytnúť rýchlu štartovaciu príručku pre vývojárov zo žiadnou alebo veľmi malou skúsenosťou s memcached, nie pokrytie a vysvetlenie všetkých možností, ktoré memcached má.

Memcached je open-source produkt šírený zdarma, ktorého účelom je poskytnúť systém pre cachovanie dát v pamäti s dôrazom na vysoký výkon, škálovateľnosť a nasadenie v distribuovaných scenároch. Projekt vznikol pri vývoji služby LiveJournal a prvotným účelom bolo zrýchliť aplikáciu cachovaním často používaných dát z databáze do pamäte. Dnes je memcached jedným z najpoužívanejších nástrojov svojho druhu a jedným zo základných pilierov infraštruktúry najväčších služieb na webe ako napríklad Google/YouTube, Digg, Facebook, Wikipedia, Amazon a mnoho ďalších.

Koncept memcached je ten, že memcached poskytuje key-value úložisko bežiace ako služba separátne od aplikácie. Nezávislosť na aplikácii pracujúcou s memcached je veľmi dôležitým faktorom, ktorý umožňuje okrem iného napríklad aj jednoduchý deployment ďalších inštancií memcached servrov. Memcached teda beží ako separátna služba/daemon a čaká na prichádzajúce spojenia na TCP porte. Klient, najbežnejšie webový server, iniciuje TCP spojenie na memcached server, pošle príkaz pre získanie alebo odoslanie dát, spracuje odpoveď a odpojí sa. V praxi ale klientské knižnice pre memcached využívajú rôzne implementácie tzv. socket pools, aby sa eliminovala potreba otvárať separátne spojenie pre každý request do cache.

Inštalácia (Linux, Windows)

Ukážeme si základnú inštalačnú procedúru memcached servra na Linuxe a Windows s dôrazom na záludnosti pri inštalácii na Windows platformu. 

Linux

Linux je pravdepodobne najpoužívanejším systémom na ktorý sa memcached nasadzuje a má širokú podporu hotových binárnych balíkov pre rôzne distribúcie. Keďže memcached má závislosť na balíku libevent, musí byť v systéme prítomný tento balík pre úspešný beh memcached. Na Debiane, resp. distribúciách používajúcích .deb balíky je inštalácia jednoducho možná z hotových balíkov:

$ sudo apt-get install memcached

Týmto nainštalujeme memcached a požadované závislosti (libevent). Na Debiane je konfiguračný súbor umiestnený v /etc/memcached­.conf, kde je možné nájsť rôzne voľby spustenia memcached daemona a príslušnými komentármi, napríklad port na ktorom memcached beží, maximálne množstvo pamäte ktoré má byť memcached pridelené atď. Pre základné experimentovanie si vystačíme s default hodnotami, nie je teda potreba v konfiguračnom súbore nič meniť.

Pokiaľ chcete inštalovať skompilovaním zo zdrojových kódov, je potrebné stiahnuť archív s aktuálnou verziou (1.4.4 v čase písania článku) a po rozbalení pokračovať štandardným ./configure && make. Pri inštalácii zo zdrojových kódov je potreba mať v systéme libevent (resp. aj libevent-dev na Debiane).

Windows

Inštalácia na Windows je menej pohodlná ako na Linuxe, hlavne z dôvodu, že existuje niekoľko verzií memcached skompilovaných pre Windows. Hlavným rozdielom medzi nimi je ich vek a množstvo potencionálnych problémov. V súčasnosti najlepšou voľbou pre Windows je zostavenie na stránkach jellycan, kde sa jedná o memcached 1.2.6 pre Windows. Stačí ho teda stiahnuť, rozbaliť, spustiť memcached.exe a najzákladnejší setup na Windows je hotový.

V súčasnosti hlavnou nevýhodou Windows ako platformy pre nasadzovanie memcached je to, že Windows nie je platformou, pre ktorú by sa memcache kontinuálne buildoval a testoval. V diskusii na memcached konferencii je prehľad problémov, ktoré bránili alebo bránia začleneniu Windows do build farmy a tým aj oficiálnej podpore memcached na Windows.

Ďalšou ‚zábavnou‘ záležitosťou pri produkčnom nasadení memcached na Windows je spustenie memcached v service/daemon móde s inými ako preddefinovanými nastaveniami. Defaultná konfigurácia memcached alokuje maximálne 64MB pamäte, čo vačšinou nie je dostatočné pre produkciu. Voľba ‚-d‘, ktorá na Windows zabezpečuje spustenie memcached ako služby ignoruje dodatočné argumenty z príkazového riadku, čo sa dá obísť ‚sc.exe‘ utilitou na Windows. Stačí vytvoriť súbor ‚install.bat‘ s následovným obsahom:

@echo off
set ramSize=512

sc create memcached binPath= "c:memcachedmemcached.exe -d runservice -m %ramSize%" start= auto DisplayName= "memcached"
sc start memcached

Je potrebné uložiť súbor, prípadne ešte zmeniť cestu k memcached.exe a max. veľkost alokovanej RAM (ramSize) a spustiť bat súbor. Tým sa nainštaluje Windows služba ‚memcached‘.

Otestovanie spojenia s memcached

Memcached štandardne akceptuje prichádzajúce spojenia na TCP porte 11211. Po inštalácii je potreba otestovať, či memcached beží a akceptuje spojenia, napríklad pomocou telnetu:

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
version
VVERSION 1.2.8
quit
Connection closed by foreign host.
$

Telnet nie je štandardnou súčasťou Windows 2008 Servra a musí sa doinštalovať ako dodatočný komponent. Doporučujem ale namiesto toho využiť iného klienta pre Windows, napr. PuTTY.

Základné operácie – GET/SET

Ešte predtým, než si ukážeme praktické príklady je vhodné uviesť niekoľko faktov súvisiach s memcached, ktoré je potreba mať na pamäti:

  • maximálna veľkosť jednej položky v memcached je 1MB. Táto limitácia vychádza z designu memcached a existuje hlavne kvôli optimalizáciám alokácie operačnej pamäte. V praxi zväčša klientské knižnice podporujú kompresiu dát predtým, než ich zapíšu do cache, čo môže pre niektoré prípady riešiť tento problém. Memcached nie je tým pravým miestom pre cachovanie veľkých dát, rozsiahlych obrázkov, dokumentov atď. Memcached je optimalizované na ukladanie veľkého množstva malých položiek (texty, objekty, výsledky databázových queries a podobne). Aj keď memcached sa drží pravidla, ktoré hovorí že vráti z cache presne to, čo bolo pre daný kľúč do cache vložené, je potreba počítať s týmto obmedzením.
  • memcached neposkytuje mechanizmus autentifikácie alebo iný mechanizmus bezpečnosti. Memcached je navrhnutá tak, aby práca s ňou bola čo najrýchlejšia a komunikácia medzi klientom a cache sa nezaťažovala ničím iným ako samotnými operáciami s cache. V praxi je najjednoduchšou možnosťou ako ochrániť memcached inštancie od nežiadaných spojení firewall pravidlo, ktoré dovolí len určitým servrom prístup k memcached. Najbežnejší je samozrejme scenár, kedy su stroje s memcached neprístupné z vonkajšej siete a len webservery komunikujúce s cache poznajú interné IP adresy memcached servrov.
  • memcached nie je relačná databáza, je to key-value úložisko. Nie je možné napríklad získať všetky položky z cache operáciou typu ‚select * from items‘. Štandardne je možné získavať len tie hodnoty z cache, ktorých kľúče poznáme.

Najčastejšie prevádzané operácie s memcached sú čítanie z cache (GET) a zapisovanie do cache (SET). Bežný scenár je ten, že pokiaľ je v aplikácií logika, ktorá vždy načítava data z databáze, môže byť táto logika upravená tak, aby sa na prítomnosť týchto dát najprv opýtala memcached. Pokiaľ ich memcached vráti, aplikácia ďalej pracuje s týmito dátami a nemusí robiť dotazovanie do pomalšej databáze. Pokiaľ položka ešte nie je v cache (čo môže byť z rôznych dôvodov, ktoré popíšeme nižšie), získame dáta z databáze a zapíšeme ich do cache. Pri ďalšom požiadavku na tieto dáta ich už aplikácia načíta len z cache, teda rýchlejšie.

Vyjadrené programovo, pokiaľ máme kód podobný následovnému:

result = query("select a,b,c from x");
return result;

Po integrácii s memcached by vyzeral následovne:

result = get_from_memcache("mykey1");
if (result == NULL)
{
 result = query("select a,b,c from x"); // získa položky z databáze
 set_to_memcache("mykey1", result); // nastaví ich do cache pod kľúčom mykey1
}
return result;

To je všetko, čo je potrebné k najzákladnejšej spolupráci s memcached.

Ako bolo spomenuté vyššie, je niekoľko dôvodov, ktoré môžu spôsobiť, že položka sa nenachádza v cache:

  • položka ešte nebola zapísaná do cache pod daným kľúčom
  • položka expirovala. Memcached podporuje automatická expiráciu, čo je veľmi užitočné v prípadoch, že chceme položku v cache automaticky zahodiť po určitom čase. Nastavenie expirácie na 0 pri zapisovaní položky do cache spôsobí, ze memcached položku automaticky nezahodí po určitom čase, teda bude v cache až do doby než ju klient explicitne vymaže.
  • položka bola zmazaná
  • došlo k reštartu memcached služby, alebo bol zaslaný ‚flush_all‘ príkaz, ktorý zahodí všetky položky 

Keďže memcached je veľmi rozšíreným riešením, má aj odpovedajúco silnú podporu klientských knižníc pre množstvo programovacích jazykov, frameworkov a prostredí. Pre Python, Javu a .NET doporučujem použiť následovné knižnice.

Python

python-memcached balík, z Linuxu dostupný jednoducho pomocou apt-get alebo easy_install. Python-memcached je možné používať aj s frameworkom Django pri využití memcached ako cache backendu.

>>> import memcache
>>> mc = memcache.Client(['127.0.0.1:11211'], debug=0)
>>> mc.set("mykey1", "X1")
True
>>> mc.get("mykey1")
'X1'

Java

spymemcached je knižnica vyvíjaná jedným z kľúčových vývojárov memcached servra. Je zároveň dobrou voľbou pokiaľ používate Hibernate, pretože hibernate-memcached second level cache využíva spymemcached klienta. Spymemcached je každopádne najlepšou voľbou aj v prípade, že nepoužívate Hibernate.

.NET

enyim.com Memcached Client je najlepšou voľbou pre .NET aplikácie a je aktívne vyvíjaná. Pokiaľ ale používate NHibernate s memcached, NHibernate štandardne pracuje s iným – starším klientom, ktorý už nie je v aktívnom vývoji. Ak teda nepoužívate NHibernate, najlepšou voľbou je enyim klient.

Ďalšie odkazy a zdroje

Okrem základných get/set operácií obsahuje memcached množstvo dalších zaujímavých funkcií. Detailný popis všetkých možných funkčností, príkazov a parametrov je možné nájsť v dokumentácii protokolu, napríklad štatistiky, increment/decrement operácie, multi-get výbery položiek, použitie UDP protokolu a ďalšie.Okolo memcached existuje veľká komunita a množstvo materiálov. Niekoľko odkazov, kde je vhodné začať:

Záver

Memcached dokáže pri správnom použití vyriešiť určité problémy škálovania a výkonnosti aplikácii, v ktorých typicky dochádza k častým operáciám s pomalšími zariadeniami (disk, databáza). Aj keď je to jeden z nástrojov, ktorý vie ‚urýchliť veci‘, je potreba myslieť nato, že základné pravidlo optimalizácie je optimalizovať aplikáciu všade tam, kde je to možné. V konečnom dôsledku žiadny nástroj nedokáže vyriešiť problémy neoptimálne napísaných algoritmov alebo zle napísaných dotazov do databázy. Pokiaľ už ale máte túto fázu ‚optimalizácie samého seba‘ zvládnutú a vidíte cachovanie ako vhodný nástroj, memcached je veľmi dobrou voľbou, kedže sa jedná o stabilné, vysoko rozšírené riešenie s podporou distribuovaného nasadenia a vynikajúcou komunitou.

Článek je překladem anglického originálu Getting Started with Memcached, publikovaného na autorově blogu Maddemcode. Z angličtiny přeložil autor původního článku.

Komentáře

Subscribe
Upozornit na
guest
17 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Jens.cz

Ten koncept je zajimavý, akorát jestli to chápu dobře, tak není možné to použít například na sdíleném hostingu s PHP, kde se každý uživatel může připojit na „localhost:11211“ a získat tak data (pokud trefí klíč) ostatních uživatelů?

Aleš Roubíček

Memcached se hodí tam, kde máte aplikaci nasazenou na několika strojích, které potřebují mít synchronizovanou cache. V českém prostředí se málo kdy setkáte s potřebou něco jako distribuovanou cache nasadit…

Jens.cz

Nemyslím že „V českém prostředí se málo kdy setkáte s potřebou něco jako distribuovanou cache nasadit“.

Sám jsem pracoval na českém projektu, kde jedna LAMP aplikace bežela na čtyřech strojích a jednotlivé služby byly různě rozhozeny kvůli zátěži a my jsme řešili jak mezi sebou komunikovat. Memcached mohl ledacos vyřešit. Myslím že by se to dalo navíc použít na kešování stránek, kterou jsem dělali přes DB.

jozefsevcik

Ano, shared hosting nie je prostredie, kde by sa memcached hodila, práve kvôli možnosti prístupu k cudzím „kľúčom“. Je to riešitelný scenár, ale rozhodne nie bežný pre nasadenie memcached.
Inak ta cache nie je synchronizovaná v zmysle ‚mám X memcached inštancií, na každej sú identické kľúče‘, t.j. položky nie sú replikované.

insekticid

aktualni verze memcached pro Windows vcetne 64bit verze najdete na http://labs.northscale.com/…ed-packages/
(aktualne 1.4.4)

memcached pouzivame uz docela dlouhou dobu

jozefsevcik

Sú to dosť čerstvé buildy (v podstate boli zostavené až po napísaní článku), každopádne je to veľmi pozitívny posun windows portu memcached.

bbaron

1.4.4 sme mali nasadenu dva mesiace v live prevadzke a o potom zacala „blbnut“ – prestala posielat to, co mala v cache. boli sme nuteni sa vratit spa5 k 1.2.8
nastastie pouzivame memcache v kombinacii s xcache, ktora bezi na lokalnych serveroch.
takze najprv si data pytame z xcache a az potom z memcache. memcache predsa len potrebuje TPC spojenie a to pri velkom navale spomaluje ;-)

daeltar

Rozhodně by bylo supr, kdyby někdo mohl napsat o nějakém českém nasazení.

Lukáš

Třeba Seznam.cz? :))))

Jens.cz

a na co se to na Seznamu pouziva? (pokud to neni tajne:)

houska

na seznamu pouzivame krome memcached take membase (narozdil od memcached umi rozklad na vice serveru), pouziva se napr. pro ukladani „skla“ na chatu lide

Jakub Suchy

Myslim, ze muzu prozradit, ze treba http://www.iprima.cz na Drupalu ma na pozadi memcached

Blizzy

Myslím, že můžu prozradit, ze některé instance vyhledávače Jyxo (query – dotazovací část) využívají distribuovanou memcached. Použil jsem klientskou knihovnu libmemcached (C, C++).

motyq

Zajimavy v tomto ohledu je jeste redis – je to takovy „klon“ mezi mysql a memcachi. Tedy umi cachovat stejne jako memcache a zaroven je mozno udelat i nekolik slaves k jedne master…

Ladislav Thon

> základné pravidlo optimalizácie je optimalizovať aplikáciu všade tam, kde je to možné

Základní pravidlo optimalizace je, když odhlédneme od klasického „nedělejte to“, optimalizovat úzká hrdla. Zoptimalizovat 10ms akci na 8ms je hezké, někdy dokonce úctyhodné, ale když brzí nějaká vteřinová, tak taky vysoce zbytečné.

To teda jenom jako lehký doplněk, nic proti memcached.

Jakub Suchy

Pro zacatecniky to urcite plati, nicmene Paretovo pravidlo neplati, kdyz uz tech 80 procent mate vyladeno :-)

František Kučera

+1 Optimalizovat by se nemělo za každou cenu – někdy se tím spíš uškodí (např. se zhorší přehlednost kódu a celého systému, ztíží se práce budoucím vývojářům) – a to všechno jen kvůli těm „2ms“. Takže souhlas – optimalizovat úzká hrdla. A jen pokud z toho kouká nějaký měřitelný (!) a významný rozdíl – pokud je optimalizace zanedbatelná, nebo jen „cítíme“ že to tak bude rychlejší, je lepší neoptimalizovat (zejména pokud „optimalizace“ spočívá v psaní dalšího kódu nebo přidávání dalších komponent).

P.S. nic proti Memcached, tenhle komentář je mimo téma…

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.