Zrychlete své webové aplikace s Memcached

Memcached

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.

Autor se živí vývojem software a baví ho experimentovat s novými i znovuobjevenými technologiemi.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 17

Přehled komentářů

Jens.cz Sdílený hosting
Aleš Roubíček Re: Sdílený hosting
Jens.cz Re: Sdílený hosting
jozefsevcik Re: Sdílený hosting
insekticid memcached na windows (i 64b)
jozefsevcik Re: memcached na windows (i 64b)
bbaron Re: memcached na windows (i 64b)
daeltar Re: Zrychlete své webové aplikace s Memcached
Lukáš Re: Zrychlete své webové aplikace s Memcached
Jens.cz Re: Zrychlete své webové aplikace s Memcached
houska Re: Zrychlete své webové aplikace s Memcached
Jakub Suchy Re: Zrychlete své webové aplikace s Memcached
Blizzy Re: Zrychlete své webové aplikace s Memcached
motyq redis
Ladislav Thon základní pravidlo optimalizace
Jakub Suchy Re: základní pravidlo optimalizace
František Kučera Re: základní pravidlo optimalizace
Zdroj: https://www.zdrojak.cz/?p=3149