Turbó fokozat nginx, Redis, Node.js
Az előadó Bártházi András mailto:andras beigli barthazi pont hu twitter:ba78 http://webakademia.hu http://web.conf.hu/2009/program#turbó fokozat Programozókat keresünk Miner.hu kereső projektünkhöz
Miről lesz szó? Mitől lesz gyors egy szolgáltatás? Eszközök, melyek segíthetnek: nginx - webkiszolgáló Redis - memória alapú adatbázis Node.js - öná%ó szerver oldali JavaScript
Gyors webszolgáltatások Melyeket nem feltétlenül kell komolyan venni, de... Nyomjuk meg a turbó gombot a szerverkompúteren Tegyük ki a tartalmat statikus HTML fájlként Írjuk meg a szerver oldali kódunkat assemblyben Ne használjunk adatbázis kéréseket, vagy csak egyszerűeket
Turbó gomb Használd az erőt! Ma már egy 4 magos, 16 GB memóriát tartalmazó szerver is elérhető áron beszerezhető
Statikus HTML Nagyon sok weboldal kivitelezhető HTML-ként Lehet generálni a HTML-t A cache-t ki lehet írni HTML-ként a szerverre, és rewrite megoldásokkal kiszolgálni Gyors kiszolgáló ke%
Kódolás assemblyben Ha nem is assembly-ben, de C/C++ben egész használható megoldások vannak, például: http://www.webtoolkit.eu/wt Mindenestre a cél hogy a kód egyszerű, és a lehetőségek szerint gyors legyen
NOSQL, gyors SQL az sql nyelv sok esetben felesleges lehet gyors, egyszerű adatbázisok: CouchDB, MongoDB,... MySQL, PostgreSQL: de jól indexelt, csak elsődleges kulccsal történő lekérdezések memóriában tárolt adatok
nginx orosz fejlesztésű webszerver, leginkább a lighttpd-hoz hasonlít http://nginx.net/ két célra kiváló, de más feladatokra is megá%ja a helyét: statikus fájlok kiszolgálása proxy szerver minimális memóriahasználata miatt VPS szerverekre kifejezetten ajánlott
nginx Bár kevesebb szó esik róla, mégis ismert projektek is használják: wordpress.com sourceforge.net torrentreactor.net github.com
nginx: lehetőségek Alapfunkciókat ismeri: hozzáférés blokkolás IP cím(tartomány) alapján, HTTP Basic authentikáció, könyvtártartalom listázása, FastCGI, Gzip, virtuális hosztok, rewrite rule-ok, stb. Érdekesebb modulok: load balancing, 1x1 GIF, GeoIP, image filter (képek feldolgozása GD könyvtárra), levelezés proxy, kiszolgálás memcachedből, Circle GIF, HTTP Push, upload progress
nginx: dokumentáció alapvetően orosz projekt, orosz dokumentációval az utóbbi időben elkészült egy angol nyelvű wiki, mely átfogóan bemutatja a lehetőségeket, modulokat interneten több helyen is olvashatunk leírásokat arról, hogy adott problémákat hogy lehet megoldani a segítségével
nginx: működés eltérően az Apache-tól, nincsenek külön szálak indítva kliensenként úgynevezett event based server megoldás processzoronként érdemes workereket indítani, négyprocesszoros szerverben négyet
nginx: sebesség a sebesség nagyon sokféleképpen mérhető: kis statikus fájlok nagy statikus fájlok (adatátvitel) különböző szerver oldali nyelvek
nginx: sebesség ide jött volna különböző mérésekkel igazolva, hogy milyen gyors az nginx statikus fájlok esetén de összehasonlítva távoli kiszolgálás esetén Apachecsal másodpercenként több tízezres kiszolgálás me%ett nem tudtam kimutatni sebességbeli különbséget
nginx: sebesség memóriában, processzor terhelésben viszont egyértelmű nyertes volt, helyből adva a szervernek terhelést: 25kB-os fájl, 100.000 kérés, 10.000 párhuzamos szál Apache: 150 MB memória, 2-es, 3-as load, 45 mp nginx: 50 MB memória, nincs load, 22 mp
nginx: mérések a méréseket egy négyprocesszoros, Core 2 quad szerveren, 4 GB memóriával végeztem, az ab eszközzel távoli kiszolgáláskor egy 100 Mbit/s vonalon csatlakozó, másik szerver teremben levő szerverről mértem alapból a szerveren minimális terhelés volt, a méréseket 10-20 alkalommal is elvégezve vontam le a következtéseket
nginx vs. lighttpd személyesen nem végeztem méréseket, nincsenek tapasztalatok nincs rengeteg összehasonlítás, ezekből a lighttpd hátrányának a következőkre róják fel: több napnyi futtatás után szivárgó memória kevésbé jó processzor kihasználás virtuális hosztoknál nincs külön logolási lehetőség(?) http://www.wikivs.com/wiki/lighttpd_vs_nginx
nginx: használat mi a következőkre használjuk a projektjeinkben: statikus fájlok kiszolgálása (Miner Maps, Miner Toolbar) FastCGI-vel PHP kiszolgálás: előnye hogy nagy látogatottság esetén megfogta a PHP processzek számát, sebesség/processzoridő/memória változás amúgy nem volt
Redis: tulajdonságok Hipergyors fejlesztés: pár hónap alatt 1.0-s kiadás Nagyon jó dokumentáció Ke%emes közösség (levlista) Jó nyelvi támogatottság (PHP, Ruby, Python, Java...)
Redis: tulajdonságok Alapvetően egy kulcs-érték alapú, az adatokat memóriában tároló adatbázisszerver http://code.google.com/p/redis/ Leginkább a Memcachedhez lehet hasonlítani, de szignifikáns különbségek vannak
Redis: tulajdonságok nagyon gyors kiszolgálás: másodpercenként 100.000 írás, 80.000 olvasás atomi, összetett műveletek: listák, halmazok támogatása perzisztens tárolás: adatbázis kiírása lemezre jól hangolhatóan
Redis: egyszerű nem igényel különösebb konfigurációt, gyorsan kipróbálható, átlátható, telnettel lehet hozzá csatlakozni nincsenek bonyolult parancsok, nagyon könnyen és gyorsan tanulható
Redis: alapműveletek SET kulcs érték GET kulcs, MGET kulcs1 kulcs2 kulcs3 EXISTS kulcs INCR kulcs, DECR kulcs INCRBY kulcs szám, DECRBY kulcs szám DEL kulcs
Redis: alapműveletek KEYS minta azon elemek listája, melyek kulcsa mintával kezdődik RANDOMKEY RENAME régikulcs újkulcs DBSIZE EXPIRE kulcs szám
Redis: listaműveletek RPUSH kulcs érték, LPUSH kulcs érték elem beszúrása a kulcs lista elejére, végére LLEN kulcs LRANGE kulcs kezdet vég lista egy részének lekérdezése LTRIM kulcs kezdet vég
Redis: listaműveletek LINDEX kulcs index a kulcs lista egy elemének lekérdezése LSET kulcs index érték adott indexű elem felülírása LREM kulcs darab érték adott értékű elemek eltávolítása a listából LPOP kulcs, RPOP kulcs
Redis: halmazműveletek SADD kulcs érték, SREM kulcs érték, SPOP kulcs SMEMBERS kulcs SMOVE kulcs1 kulcs2 érték SCARD kulcs elemek száma az adott halmazban SISMEBER kulcs érték
Redis: halmazműveletek SINTER kulcs1 kulcs2 kulcsn, SINTERSTORE célkulcs kulcs1 kulcs2 kulcsn metszet lekérése, i%etve metszet tárolása SUNION kulcs1 kulcs2 kulcsn SUNIONSTORE célkulcs kulcs1 kulcs2 kulcsn összeg lekérése, i%etve összeg tárolása SDIFF kulcs1 kulcs2 kulcsn SDIFFSTROE célkulcs kulcs1 kulcs2 kulcsn különbség lekérése, i%etve különbség letárolása
Redis: rendezés listával és halmazzal is működik SORT kulcs SORT kulcs DESC SORT kulcs LIMIT 0 10 ALPHA DESC SORT kulcs BY weight_* SORT kulcs BY weight_* GET object_* veszi kulcs lista elemeit (pl. azonosítók: 1,2,3), lekéri weight_1, weight_2, weight_3 értékeket és rendezi azokat, majd az így kapott sorrend alapján visszaadja object_3, object_2, object_1 elemeket
Redis: mentés konfig fájlban hangolható: x másodpercenként x írás művelet után pl beá%ítható: alapból percenként, de ha volt 1000 művelet, akkor azután is SAVE, BGSAVE, LASTSAVE műveletek
Redis: replikáció Több adatbázist képes összeszinkronizálni: MASTER-SLAVE mode%
Redis: backup az adatbázis perzisztens része egy darab fájl leá%ás nélkül backpuolható, mivel az adatbázis mentése atomi művelet
Redis: egyebek egyszerű, saját szöveges protoko% példakódként egy egyszerű Twitter klón forrása is elérhető, kipróbálható több adatbázist (névteret) is támogat, bár nem igazán kényelmesen, érdemes inkább külön szervereket indítani
Redis: használat IWIW alkalmazásaink mögötti adattároláshoz Miner mögötti queue, /iss bejegyzések tárolása, gyorsítása, oldal cache, stb.
Node.js event I/O engine a V8 JavaScript motorhoz alapvető célja skálázható hálózati dolgok készítése esemény alapú, nem pedig thread alapú megoldás nem webszerver, de webszerver is készíthető segítségével http://nodejs.org/ hasonló az Event Machine (Ruby) és Twisted (Python) projektekhez
Node.js: tulajdonságok Hipergyors fejlesztés Ke%emes közösség (levlista) Használható dokumentáció Fiatal kora e%enére sok kapcsolódó projekt
Node.js: I/O Alapvetően támogatja a következő I/O műveleteket: konzolos standard I/O (stdin, stdout) fájlok írása, olvasása HTTP, TCP és DNS protoko%ok kezelése
Node.js: sebesség Nagyon gyors webszerver 10.000 kérést, 1000 konkurens klienstől pár mp alatt kiszolgál (12k dinamikus tartalmú oldal) nagyobb fájloknál lassabb lehet (megoldás folyamatban), de nem is erre való
Node.js: sebesség Event Machine (Ruby) és Node.js összehasonlítás Forrás: http://four.livejournal.com/1019177.html 1 konkurens kliens: node: 23782, ev: 22606 / sec 5 konkurens kliens: node: 34303, ev: 36899 / sec 300 konkurens kliens: node: 35668, ev: 36405 / sec
Node.js: Comet Mivel memóriafoglalása minimális, i%etve esemény alapú kiszolgálót lehet készíteni benne, kiválóan alkalmas több ezer szál párhuzamos kezelésére is példakódként egy böngésző alap chatszoba megvalósítást is me%ékeltek hozzá
Node.js Bár fiatal projekt, de: mivel JavaScript, kész JavaScript könyvtárak je%emzően használhatóak vele számos modul, kiegészítés van már hozzá most is
Node.js Érdekesebb kapcsolódó projektek: Redis kliens, CouchDB kliens, Tokyo Tyrant kliens, Postgres kliens JSON-RPC webszolgáltatás, Express (Sinatra klón), Disqus blog komment rendszer klón, IRC bot Készül az Extension API, amivel kész könyvtárak könnyen csatolhatóak lesznek
Node.js: használat A Miner Toolbar megoldásának kiszolgálója készül Node.js alapokon Különböző Miner szubprojektek mögöttes kiszolgálója lesz Jól proxyzható nginx segítségével
Köszönet Bártházi András mailto:andras beigli barthazi pont hu twitter:ba78 http://webakademia.hu http://web.conf.hu/2009/program#turbó fokozat Programozókat keresünk Miner.hu kereső projektünkhöz