ugrás a tartalomhoz

Képek tárolása az adatbázisban, vagy fájlrendszerben?

solkprog · 2011. Már. 8. (K), 21.45
Sziasztok.

röviden: képeket adatbázisban, vagy fájlrendszerben?

Tudom ezerszer lerágott csont már, sőt jó-párszor előkerült már itt a weblaboron is, de ahogy nézem legutóbb viszonylag rég.
rövid topic
viszonylag hosszú levelezési listaszál

Kérdés ez volna 5 év után kinek mi a véleménye? És itt elsősorban a gyorsaságról beszélek. Cache-el szempontjából szerintetek melyik a jobb? Egy fájlrendszerben tárolt képet az operációs rendszer mennyire fog cache-elni? -ha egyáltalán cache-el..
proclub (azóta már) a szerverek világában mozogsz... Változott a véleményed? ("cégednél" melyiket ajánlanád?)

Szóval képeket adatbázisban, vagy fájlrendszerben?
 
1

Filerendszerben

janoszen · 2011. Már. 8. (K), 22.15
Mindenképpen filerendszerben, ha számít a sebesség. Az oprendszer egy csomó gyorsítást végez fileok esetén, amiktől elesel, ha adatbázist használsz. (File cache, sendfile, stb.) Az adatbázis igazából egyetlen dolgot adhat, amit a filerendszer nem, az a tranzakció-kezelés. Erre viszont képeknél elég ritkán van szükség. Azt meg érdemes szem előtt tartani, hogy az oprendszer kernel módban dolgozik, így sokkal gyorsabb, mint a DB.

Gyakorlati példa: építettünk olyan statikus fájl kiszolgálót, ami 50.000 db 50 kb-os kép random lekérésekre 1,6-1,8 gbitet tolt ki magából és ott még nem volt vége a gépnek, csak már értelmetlen lett volna az adott feladatra betolni még egy hálókártyát. Ha PHP-ból szolgálsz ki képeket, már rég elfogytál CPU-ban és még a közelébe sem értél a néhány száz megabitnek.

Még egy bónusz pont: az adatbázisok meglehetősen furán működnek, ha egy megadott méretnél nagyobb fájlokat akarsz beléjük tölteni insertnél. MySQLnél pl a maximális csomag méret az, amit a legerősebb limitáló tényező, de vannak egyéb tekerentyűk is, amikkel játszani kell ilyenkor.
2

re

solkprog · 2011. Már. 8. (K), 23.05
Ezt én is így gondoltam, és ennek megfelelően építettem fel a rendszereim.

Viszont minap beszéltem valakivel aki az adatbázist javasolta. Épp a cache-hetőség miatt. Annyit azért rögtön hozzátennék hogy asp-és volt az illető, és arról beszélt hogy elég lassú művelet egy fájlt betölteni merevlemezről. Ami ugyan tény, viszont nemtudom hogy az ntfs vs ext viszonyában mennyire árnyalódik ez kérdés.

Nagyon nagyon nagy rendszerek mögé is ezt ajánlanád? facebook? :)
4

CDN

janoszen · 2011. Már. 8. (K), 23.33
A Facebook mögött CDN van, kizártnak érzem, hogy az alatt adatbázis legyen.

Az ASP-s embernek meg lehet igaza, nem ismerem a Windowst, de azért kíváncsi lennék, mennyi képet tud így kitolni magából, hogy user spaceben pakolgatja a byteokat.
7

köszönöm

solkprog · 2011. Már. 8. (K), 23.59
((nyílt titok hogy Facebook az adatait MySQL-ben tárolja...))

Köszönöm a választ, sokat segítettél!
3

Az adatbázis is fileban tárol nem?

neogee · 2011. Már. 8. (K), 23.23
Buta kérdés... ( Mármint amit most felteszek )
Egy adatbázis véletlenül nem fileokban és nem a merevlemezen tárolja az adatokat? :)))

Innentől kezdve egyértelműen gyorsabb a file. Ott csak egy olvasást végzel közvetlenül a lemezről, míg adatbázis esetén kommunikálsz az adatbázissal, nyilván annak is van némi időigénye, plusz még olvasol is a lemezről. Szerintem logikusan végiggondolva egyértelmű, hogy gyorsabb a sima filerendszer.

Én személy szerint ott szoktam alkalmazni adatbázisban tárolt file megoldást, ahol iszonyúan fontos, hogy az adott fileokhoz csak adott személyek férhessenek hozzá minden körülmények között, és nem kiemelkedően fontos a kiszolgálás sebessége, illetve nem nagymennyiségű és nem nagy méretű fileokról van szó. De lehet hogy még erre sem kellene, de számomra így kényelmes. :)

De lehet butaságokat beszélek, világosítsatok fel ha valamit félregondolok :)
5

memória

solkprog · 2011. Már. 8. (K), 23.34
egy adatbázist (vagy egy tábláját) nem olyan ördöngösség akár egy az egybe betölteni memóriába:) noSQL és társai.

De igazából a kérdés nem is erről szól hanem hogy alap felállásban melyiket cache-eli a rendszer jobban. Például nemtudom hogy egy Apache / MySQL / Linux környezetben az adatbázis tartalma mennyire lesz memóriába be cache-lve. Illetve egy filerendszerben egy kép mennyire lesz cache-lve (erre meg is kaptam a választ: nagyon)
6

Cache

janoszen · 2011. Már. 8. (K), 23.36
Az adatbázis cachel és indexel is. Amíg van elég memóriája, baromi gyors tud lenni. Mérd ki, nem olyan nehéz.
8

A fájlrendszer is cache-el,

gphilip · 2011. Már. 9. (Sze), 01.01
A fájlrendszer is cache-el, persze nem feltétlenül úgy, ahogy szeretnéd, de legrosszabb esetben diszkhez is írhatsz valamiféle explicit cache-t. Sőt, ha jól meghatározott a fájlok halmaza, amit ki kell szolgálnod, még az Apache is megteszi a magáét: http://httpd.apache.org/docs/2.2/mod/mod_file_cache.html

Nem látom túl sok értelmét MySQL-t használni bináris fájlok kiszolgálására, hacsak nem esetleg a viszonylag egyszerű skálázódás miatt, ha sokat olvasol.

Van is egy érdekes próbálkozás, ami a MySQL-t mint fájlrendszert használja: http://sourceforge.net/projects/mysqlfs/files/
9

Filerendszer

janoszen · 2011. Már. 9. (Sze), 08.58
A filerendszer cache tekerentyűit természetesen be kell állítani. Pl. az IO schedulerből az alapértelmezett helyett ha jól emlékszem a deadlinet érdemes választani.

Egyébként a filerendszer is skálázódik elég jól, csak kell egy minimális programlogika. Lásd a nagy terhelésű rendszerek fejlesztéséről tartott előadásomat a Docler Akadémián.