Egy jól megírt webes alkalmazás vígan elfut több szerveren, használja a megosztott cache-tárat, satöbbi, de a mögötte szolgáló adatbázis-szerver kiszolgálási képessége véges. A tegnapi Meetup-on jót mosolyogtunk az allas.ma magabiztos kijelentésén, miszerint már fel vannak készülve a fürtözött futtatásra (ők PHP-MySQL), miközben tudjuk, hogy ez messze nem így működik. Hát akkor hogyan? MySQL fürtözés, replikáció, alternatív megoldások.
Maradjunk a kézenfekvő és elterjedt PHP-MySQL példánál. Ha kevés a teljesítmény, betolunk még egy PHP-s szervert és máris minden oké. Lenne, ha nem kellene továbbra is ugyanattól az adatbázis-szervertől lekérdezni a zadatokat.
Ugyan van a MySQL-nek fürtözött (cluster) módja, de sajnos nem ilyen rózsás a helyzet. Az nem úgy van, hogy beállítok egy kapcsolót - fürtözés múkodj now! - és hátradőlök. A MySQL fürtözött változatának korlátozott képességei vannak, nem egy, nem kettő: a saját dokumentációjában is több oldalt szentelnek a témának. Nem kell elolvasnod, összefoglalom a szerintem legsúlyosabb hiányosságokat:
Kilőttük a fürtözést, nézzük a (régebbi) alternatívát, a MySQL replication-t. Gyakorlatilag ezt használja mindenki, még nagyon nagy szolgáltatások (pl. Flickr) is. A replikáció úgy működik, hogy egy master szerverről automatikusan átszinkronizálódik a tartalom egy vagy több slave-re.
A slave-ekre írt tartalom viszont nem megy vissza a master-re, tehát ez az egész arra szolgál, hogy a master szervert ne terheljük olvasással, csak írással (insert/update/delete). Egész vad lehetőségek is vannak, pl. több master körbe-körbe replikálva, de a lényeg ugyanaz marad.
Ez a módszer egészen addig kiválóan működik, amíg a master bírja az adatbázis-módosításokat. Ha kevés az olvasási teljesítmény, indítunk egy új replikát és kész. Itt is van egy kis bibi, mert bár nem kell a mastert vagy a többi slave-et újraindítani, de a teljes adatbázis átrántása nem kis terhelést okoz. Erre vannak ügyes technikák, pl. egy erre a célra fenntartott master-replikáról másolunk.
MySQL replication-nel egészen magas szintig, napi több millió látogatóig is elmehetünk, ha jó alkalmazást írtunk. De ha nem lennének korlátozások, a fürtözés lenne az ideális megoldás. A MySQL replication erősen hack szagú megoldás.
Nem véletlen, hogy a legtöbben MySQL-t használnak. Az adatbázis-kezelők legjobbika, az Oracle lenne a legjobb, leggyorsabb, rendes fürtözéssel, satöbbi... viszont marha drága, webes projektek költségvetésébe (még az usákok millió dollárosába) se fér be. Nem is értem miért csinálják ezt, de biztosan elemezték a pénzeket és így jó nekik, pedighát.
A többi alternatíva, pl. PostgreSQL/EnterpriseDB sem tud többet, jobbat a MySQL-nél, egyelőre, ezt gyorsan elintéztem.
Nem. Ezek a nagy dögök valóban igazi fürtözést és brutális teljesítményt ígérnek, azonban nem hagyományos relációs adatbázis-kezelők. Egy eltárolt sorban (egy rekordban) ugyanis csak egyetlen kulcsmeződ lehet és csak az alapján lehet keresni. Ez olyan, mintha az Excel tábládat csak az A oszlop szerint rendezhetnéd sorba és kereshetnéd.
Értelemszerűen nem lehet így tetszőleges lekérdezéseket és kimutatásokat futtatni, a teljesítmény oltárán beáldozod a rugalmasságot. Hiába jön majd a főnök, hogy csinálj egy gyors kimutatást a kékhajú 23-48 éves felhasználókról, nagy valószínűséggel nem lehet majd megcsinálni.
Vannak próbálkozások, sőt sokan a hagyományos relációs adatbázis-kezelők halálát, komplett gondolkodásmód-váltást (paradigmaváltás) jósolják, javasolják. Hát-hát...
Ők azt mondják, hogy oldjunk meg mindent a kulcs-érték alapú BigTable szerű megoldásokkal. Meg hogy a relációs dolgot a 70-es években találták ki tök más erőforrás-összetételre, pl. akkor a cpu és ram nem volt ilyen olcsó (ebben igazuk van, általában a diszk elérésen hasalunk el miközben a cpu és a ram még bírná).
Sok-sok doksit olvastam már de egyikben sem volt megoldás a kékhajú problémára.
Egyelőre nincs mindenkire jó és tetszőlegesen felskálázható megoldás. Ha belefutsz az egy szem MySQL szervered korlátaiba, utána át kell tervezned és írnod a webes alkalmazásod egy (nagyobb) részét. A fenti megoldások valamilyen egyedi kombinációja lesz az eredmény az alkalmazásod egyedi jellegzetességeitől függően és sok pénzt fogsz fizetni a programozóidnak. Ez van.
iMect means internet, media and other cool things. iMect is a small company near lake Velence, Hungary. We’ve a big footer on every page where you can discover what we do and what happens with us.
Az iMect jelentése: internet, média és egyéb király dolgok. Egy kis cég vagyunk közel a Velencei-tóhoz. Minden oldalon van egy nagy lábléc, ahol felfedezheted, hogy mivel foglalkozunk.