żart który wyjdzie wszystkim na złe?

w stanach jest popularny serwis craigslist. jest to swego rodzaju tablica ogłoszeniowa. każdy może dać swoje ogłoszenia. część kategorii jest płatna. ale większość free.

istotne jest to, że craigslist to serwis lokalny. nie można przejrzeć ogłoszeń “wszystkich". najpierw się wybiera  swoją lokalizację – miasto, miasteczko, okolicę (właśnie sprawdziłem – i jest nawet warszawa :).

layout craigslisty jest prosty. malutki – i taki jest zamiar.

tydzień temu pewien człowiek, jason fortuny, stwierdził, że przeprowadzi pewien eksperyment.

z ulotki reklamującej specyficzne “usługi" wziął zdjęcie i dał ogłoszenie, że “uległa kobieta, szuka mocno dominującego faceta":

i have everything that i need at my place….that is where we will play….no exceptions…………. we will play at my place…got it??????????
i fuckin hate yuppies [ iam one]…. pretty boys suck……i fuckin hate them all……all they can do is cum for 2.2 seconds and go 2 sleep……….looking 4 ruff man, harley rider.
it drives me krazy 2 get tit fucked, cuffed, ass spanked with welts and bruises [never any marks on my hands or arms], i have a leg spreader, crop, cane and metal cuffs. spit on me, verbally abuse , and cum [i don't give a fuck about the size of ur cock, as i like small ones]on my nips and face. pull my hair. i don't get fucked in my ass since my hole is tite……….don't even try or think about it.
i am 27 yo sexy str8 woman, 5 ft 7 in, 145 lbs [tennis player] long brown hair, small tits with eraser sized nips and d/d free, safe and sane.
dom fucker, get this……….u better be fuckin tuff enuff 2 handle me and a fucking bastard who thrives on giving pain…..my safe word is code blue. i need it extreme/edge, that is the only way……if this isn't ur bag…….then fuck off.
i am looking 4 a white or latin only, str8 brutal dom muscular male
[30-35 yo] who is arrogant, self-centered, nasty, egotistic, sadistic who likes 2 give intense pain and discipline and wants pleasured who is d/d free, safe and sane.
i demand an expert muscular man needs who demands 2 get serviced by this hot kinky professional woman……..this is not a fuckin portal site, so if u get paranoid on me, fuck off.
send ur stats and a face pic and i'll return mine to you. don't fuckin spam me, or i'll cut off ur balls.

mało subtelne 🙂

cel ćwiczenia – zobaczyć ile ludzi odpowie.

rezultat – 178 odpowiedzi z czego 145 zawierało zdjęcia jak to określone “rozebrane w różnym stopniu".

ale to nie koniec. z bliżej nieznanego powodu umieścił na stronach “encyklopedii dramatycznej" opis sytuacji, ogłoszenie oraz wszystkie dane uzyskane – w tym treści maili, zdjęcia, adresy – wszystko.

efekt – jak trzęsienie ziemi. kilka osób zaczęło ustalać tożsamości ludzi którzy wysłali swoje oferty. informować, że padli ofiarą “scamu".

część ludzi jest/była w związkach małżeńskich. jedna para prosiła o usunięcie ich danych, bo są mocno wierzącymi katolikami i ich znajomi nie wiedzą nic o ekhem, “mało" religijnych upodobaniach.

ktoś znalazł tam znajomego z microsoftu, pojawiły się groźby o pozwanie do sądu. podobno nawet separacja.

sprawa obiła się o praktycznie wszystkie istotniejsze fora dyskusyjne na sieci.

powstaje pytanie – czy ty dałbyś radę zrobić coś takiego? czy uważasz, że to zabawne? a może wręcz przeciwnie? jason jest geniuszem “practical jokes" czy debilem, kretynem?

nowa komórka blackberry – wreszcie dodane multimedia

blackberry nie jest najpopularniejszą komórką na rynku. jednakże ma swoich fanów – w dodatku ktoś kto zaczął używać tego typu sprzętu raczej nie przesiądzie się na zwykłą komórkę.

do tej pory był to sprzęt praktycznie stricte-biznesowy. telefon. poczta. sms'y. i do tego aplikacje biznesowe. bez odtwarzacza mp3, radia, telefonu. mnie to osobiście pasowało.

teraz, blackberry ma wejść między zwykłych ludzi. na rynek w stanach wchodzi właśnie pearl – nowy model (nazwa “kodowa": blackberry 8100).

wygląda dosyć standardowo, choć mnie jako użytkownika standardowego modelu 7290 drażnią połączone klawisze:

8100_na_landing.jpg

co potrafi?

  • oczywiście telefon, maile i smsy
  • instant messaging – aczkolwiek nie wiem w której dokładnie sieci. dla porządku trzeba dodać, że we wcześniejszych to też było, ale trzeba było dokupić dodatkowy, płatny soft
  • 1.3megapixelowy aparat fotograficzny
  • odtwarzacz medialny obsługujący takie formaty jak: muzyka: aac, midi, mp3, wav, amr; video:mpeg4 part2 i h.263. kontenery – avi, mov, mpg, mp4
  • 64 megabajtów pamięci rozszerzalne kartami micro sd (a one mają pojemności do 2 gigabajtów)
  • głośniczek
  • wybieranie głosowe
  • oprogramowanie: książka adresowa, kalendarz, notatnik, lista zadań. przeglądarka załączników w mailach
  • bluetooth
  • wyświetlacz 240×260 pikseli, 65tys. kolorów
  • pracuje w częstotliwościach 850, 900, 1800 i 1900mhz gsm, oraz obsługuje gprs i edge.

miłośników telefonów nokia to nie przekona, ale przekonywać nie zamierzam. wiem jedno – muszę przetestować tę klawiaturę i zobaczyć jak się na niej pisze – a potem – pewnie pora na zakupy 🙂

pgpool – nowa, zupełnie nowa odsłona

ci z was którzy używają postgresa na pewno przynajmniej słyszeli o rozwiązaniu “pgpool".

w dużym skrócie – interfejs między klientem a bazą danych, pozwalający buforować połączenia, zapewniający prostą replikację (zasadniczo multi-master, ale sprawa jest trochę bardziej skomplikowana), śliczny failover i ogólnie same fajne rzeczy.

pgpool doczekał się niedawno wersji 3.0.

natomiast ostatnio – bardzo ostatnio pojawiła się wersja 1.0 programu pgpool 2.

co to jest? praktycznie zupełnie nowy kod. stworzony w firmie “sra" – największej firmie zajmującej się postgresem w japonii. mają własną “dystrybucję" postgresa, własne toole, itd.

i na własne potrzeby zrobili, a potem udostępnili światu pgpool2.

czym się różni pgpool2 od pgpool?

  • obsługuje “parallel query" – czyli możliwość partycjonowania danych między serwery (podpięte pod pgpoola) i wykonywania zapytań jednocześnie na wszystkich serwerach, a potem łączenie wyników
  • obsługuje więcej niż 2 serwery “backendowe"!

do tego został dorzucony graficzny (web-based) program do zarządzania pgpoolem – pgpooladmin.

dla wszystkich którzy kiedykolwiek zastanawiali się nad pgpool'em, ale odrzucili go bo np. nie mógł pracować z więcej niż 2 bazami – pora wrócić do tego projektu 🙂

archiwum gazetowe via google

google uruchomił kolejną interesującą usługę.

przeszukiwalne archiwum artykułów w gazetach. i to nie z np. roku czy 10 lat. całe archiwa. mające ponad 200 lat!

na razie są tam tylko artykuły z:

  • new york post
  • forbes
  • guardian unlimited
  • washington post
  • usa today

ale – biorąc pod uwagę wcześniej ujawnione cele google'a (zindeksowanie wszelkiej wiedzy ludzi) – pewnie niedługo się zmieni – zostaną dodane kolejne gazety i kolejne archiwa.

co istotne – ten projekt ma od początku cele biznesowe – co akurat nie jest oczywiste. google na tym (na razie nie zarabia). nie ma reklam, sponsored linków itp. ale właściciele archiwów będą zarabiali.

po wyszukaniu czegokolwiek będzie można przeczytać podsumowanie. a potem – kupić dostęp do pełnej wersji artykułu. część artykułów będzie za darmo, ale będą też takie i po $300!

google wie co cię może interesować?

od jakiegoś czasu jest dostępna “strona domowa" na google'u. tego typu projektów jest sporo, ale ten wyróżnia się tym, że firma która to oferuje jest “spora". i wiele może.

na ich stronie można dodać sobie różne “gadżety" – prognozę pogody, informacje z gmaila, newsy, rss'y, gry, itp, itd.

od mocno niedawna pojawił się nowy gadżet. “interesting items for you".

co zawiera? 3 zakładki. zawierają kolejno – “searche", linki do stron i listę innych gadżetów. co w tym ciekawego? wszystkie te listy są generowane w oparciu o twoje preferencje. searche to nie searche jakie wykonałeś, ale takie jakie mogą cię zainteresować.

google od dawna znane jest ze zbierania informacji o użytkownikach. historia searchy, klikane linki, gmail, gtalk, analytics itd.

wszystko co google zbiera gdzieś się odkłada. i jest używane do różnych celów – np. do tego by lepiej pozycjonować strony w wyniku szukania. ten gadget natomiast jest czymś co każdy może zobaczyć, obejrzeć i ocenić – podbicia wyników searcha nie widać. to tak. i muszę przyznać, że to co “interesting items" mi podpowiedziało było … interesujące. i chyba nawet przydatne. co prawda nie wiem czemu trafiło tam “JavaScript – Strings" czy “Hibernate", ale już linki do osloskopa, napisy.info, trolltech, wxwidgets czy regular expressions tutorial – mogą sie przydać 🙂

replikacja multi-master z dodatkowymi feature’ami

continuent (dosyć znana w świecie postgresowym (i nie tylko) firma) zaoferowała nowe rozwiązanie – uni/cluster.

jest to rozwiązanie bazujące na ich wcześniejszym produkcie – p/cluster.

potrafi całkiem sporo:

  • obsługuje postgresa od 7.4 do 8.x na większości platform systemowych
  • dane są commitowane na wszystkich node'ach jednocześnie – dzięki czemu nie ma opóźnień replikacyjnych
  • brak opóźnień powoduje, że system jest w stanie zdecydowanie efektywniej load-balance'ować
  • automatycznie przekierowywanie zapytań do najmniej obciążonej maszyny
  • prawie liniowa skalowalność przy dodawaniu nowych serwerów
  • całkowicie automatyczny i bardzo szybki failover. przełączenie trwa poniżej sekundy, transakcje które działały na “padniętym" node'dzie są restartowane
  • system będzie działał poprawnie nawet jeśli na poszczególnych node'ach są inne wersje postgresa. pozwala to na wykonanie w pełni przezroczystego upgrade'u
  • maszyny mogą być dodawane lub usuwane z klastra całkowicie real-time bez żadnych przerw w funkcjonowaniu aplikacji

całość wygląda bardzo interesująco. niestety nie jest rozwiązanie open source ani nawet darmowe, ale jeśli potrzebujesz wysokiej wydajności i bezpieczeństwa danych – powinieneś się poważnie zastanowić.

hstore będzie w oficjalnych źródłach?

jakiś czas temu pisałem nt. hstore. w dużym skrócie – jest do moduł do postgresa pozwalający na przechowywanie w pojedynczym polu dowolnej ilości par klucz-wartość. i wyszukiwanie – oczywiście indeksowane.

wtedy, jedyną możliwością zdobycia hstore'a było wyszukanie adresu strony twórców, ściągnięcie paczki i kompilacja.

skomplikowane – zwłaszcza dlatego, że hstore wymaga kompilacji wewnątrz oryginalnych źródeł.

temat włączenia hstore'a do dystrybucji był kilkukrotnie poruszany. pojawiło się kilka nieporozumień, ale ostatnio tom lane napisał, że nie widzi przeszkód by hstore'a wrzucić w contriby!

co powoduje, że przy odrobinie farta paczka postgresql-8.2.tar.bz2 będzie zawierała kolejne naprawdę potężne narzędzie 🙂

powrót

przez ostatni tydzień byłem praktycznie non stop poza swoim standardowym miejscem pobytu.
niestety to oznacza, że przez ten tydzień nie czytałem wiadomości. zasadniczo samo w sobie nie jest to złe, ale oznacza,  że dnewsach czeka teraz na mnie około 2.7 tysiąca newsów. które muszę przejrzeć i na podstawie części z nich stworzyć wpisy. tak więc bójcie się. kolejny flood newsowy jest bliski.

aha. mam prośbę. jakby ktoś z was był na jakimś lotnisku (najchętniej irlandzkim) i mógł mi zanabyć “irish mist" (taka wóda 🙂 to będę mocno wdzięczny. oczywiście koszt zrefunduję.

przechowywanie obrazków w bazie – tak czy nie? i dlaczego?

praktycznie od zawsze na listach dyskusyjnych bazo danowych, forach, grupach i kanałach ircowych pojawia się jeden temat: “czy i jak przechowywać w bazie obrazki?". oczywiście nie chodzi tylko o obrazki. chodzi o wszelkiego typu pliki binarne – obrazki, filmy, muzykę, pliki z danymi (excel, word itd.).

osobiście jestem przeciwnikiem trzymania tego typu rzeczy w bazie. ale zrobiłem ostatnio mały research aby wypisać często pojawiające się argumeny za i przeciwko takiemu rozwiązaniu.

te argumenty postaram się skomentować, choćby po to by samemu mieć pewność, że mój wybór jest lepszy.

podstawowymi argumentami “za" trzymaniem plików w bazie danych są:

  1. trzymanie ich w bazie upraszcza zarządzanie. praca z np. 100 obrazkami nie jest problemem tak czy inaczej, ale jak poradzić sobie jak jest ich kilka milionów?
  2. wystarcza jeden prosty backup. w tym backupie jest wszystko co konieczne do wznowienia pracy.
  3. bezpieczeństwo – posiadanie danych w bazie umożliwia proste filtrowanie dostępu.
  4. pliki poza bazą danych są narażone na rozsynchronizowanie z bazą – skasujemy rekord z bazy, a pliku nie, albo odwrotnie i katastrofa gotowa.
  5. zapisanie pliku do bazy jest prostsze niż wydzielanie oddzielnego api do zapisywania na filesystemie

podstawowymi (dla mnie) argumentami przeciwko trzymaniu ich w bazie są:

  1. obrazki zajmują zazwyczaj sporo więcej miejsca niż pozostałe dane. to powoduje pewne utrudnienia przy korzystaniu z baz danych które wymagają prealokacji przestrzeni dyskowej.
  2. przesyłanie obrazków wykrzystuje bardzo nieetektywnie połączenia do bazy – połączenie trwa długo i praktycznie nic nie robi
  3. przechowywanie obrazków w bazie praktycznie nic nam nie daje od strony bazodanowej. inne typy danych są użyteczne przy budowaniu warunków wyszukania, łączenia czy sortowania – i w ten sposób “zarabiają" na to by umieścić je w bazie. obrazków (ich plików) nie da się do tego wykorzystać.
  4. systemy plików w nowych systemach operacyjnych są mocno zoptymalizowane w celu szybkiego dostarczania i cache'owania plików. dodatkowo – nowoczesne serwery http potrafią korzystać z mechanizmów systemu operacyjnego do dalszego przyspieszenia wysłania obrazka.

dodatkowo czasem pojawia się jeszcze jeden argument, który jest używany przez zwolenników trzymania plików w bazie, mimo, że jest argumentem “negatywnym" – wykazującym jedynie brak sensu jednego z argumentów przeciwników.
chodzi o to, że zwolennicy twierdzą, że co prawda trzymanie plików w bazie zwalnia bazę, ale obecnie stosowane serwery są i tak bardzo szybkie, pamięć jest tania, dyski też, więc to nie problem.

argument ten traktuję bardziej jako “wyznanie wiary" niż stwierdzenie faktu. pamięć może i jest tania gdy mówimy o pamięcy do pecetów czy do serwerów tak do 8 giga ramu. każda osoba która korzysta z większych maszyn wie, że ceny pamięci rosną lawinowo powyżej tej granicy – w szczególności 16 giga ramu kosztuje dużo więcej niż 2x koszt 8 giga ramu. a co do dysków – fakt robią się coraz tańsze, ale też wymagamy od nich więcej. macierz którą ostatnio się bawiłem kosztowała około $55000. to nie są “grosze".wróćmy więc do bardziej sensownych argumentów.

argumenty “za":
1. to jest istotny problem. bazy danych świetnie sobie radzą z tabelami mającymi kilka milionów rekordów. natomiast katalog z kilkoma milionami plików to porażka.ale wydaje mi się, że problem jest rozdmuchany. wystarczy wymyśleć sensowną konwencję nazewnictwa katalogów/plików i problem znika. przykładowo – w systemie nad którym ostatnio sporo siedzę, nazwy plików są stworzone przez taką transformatę:

  • metadane obrazka są wpisywane do bazy
  • obrazek dostaje swoje id – integera
  • integera konwertujemy na wartość hexadecymalną
  • dopełniamy opcjonalnym zerem do parzystej ilości cyfr
  • wstawiamy “slashe" między pary cyfr
  • i doklejamy rozszerzenie.

brzmi skomplikowanie. ale jest proste. przykład:

  • obrazek o id: 1533672
  • po konwersji na hex uzyskujemy: 1766e8
  • ilośc cyfr jest parzysta więc nie muszę dopełniać (dostawiać z przodu 0)
  • wstawiam slashe i uzyskuję: 17/66/e8
  • dodaję rozszerzenie i mam: 17/66/e8.jpg
  • i koniec.

dzięki temu na każdym poziomie katalogów z obrazkami mam maksymalnie 512 pozycji (256 plików i 256 katalogów). wyszukiwanie i serwowanie tego jest szybkie i proste.

2. jeden prosty backup może i tak. ale ten argument się w/g mnie mocno kłóci z milionami plików.

dużo prościej jest zbackupować bazę o wielkości x giga i do tego katalog z milionem plików niż bazę danych o wielkości x giga + ten milion plików.

czyli – prosty backup tak, ale dla relatywnie małych ilości plików. potem się okazuje, że zwykły dump staje się nierealny i trzeba używać rzeczy typu hot-backup.

3. argument celny o ile pliki są wystawione “po prostu" w documumentroot'cie apache'a.

ograniczanie dostępu na poziomie bazy jest oczywiście miłe i proste, ale zrobienie tego samego po stronie apache'a też nie jest trudne – są .htaccess'y, mod_perl, mod_rewrite, zarządzanie uprawnieniami “w locie". wymaga to trochę innego zestawu umiejętności niż zaprogramowania aplikacji, ale w końcu nie jest to jakiaś wiedza tajemna. są manuale, są przykłady.

dodatkowo – dla większości aplikacji kontrola dostępu do plików binarnych nie jest niezbędna. zazwyczaj (nie zawsze!) są one tylko dodatkiem do danych tekstowych.

sam znam kilka miejsc gdzie obrazki są w ogóle nie chronione – chroni się teksty. jak ktoś się domyśli jaki jest url do obrazka – fajnie. da się przeżyć. a jak się nie da – są metody naprawdę prostej ochrony takich danych.

4. to faktycznie jest problem. w sensie – nie da się zapewnić braku możliwości skasowania pliku z filesystemu. a i robienie triggera kasującego plik z filesystemu przy skasowaniu rekordu byłoby problematyczne (choćby kwestia konieczności użycia poleceń systemowych, co większość baz danych utrudnia, czy rollbacków).

natomiast realnie (mówiąc realnie mam na myśli serwisy którymi się zajmuję) – problem tak naprawdę nie występuje. pliki są wgrywane na filesystem. nikt ich ręcznie stamtąd nie kasuje. dostęp na roota jest limitowany do adminów, innych kont praktycznie na webserwerach nie ma.

jak plik zostanie skasowany z bazy (w sensie, jego metadane) – to przecież istnienie go na dysku nam nie przeszkadza – tzn. zajmuje trochę miejsca, ale to wszystko.

aby to zużycie miejsca przez skasowane pliki zminimalizować wystarcza naprawdę prosty automat który robi listę plików w filesystemie, listę plików z bazy, porównuje i kasuje te których nie powinno być. mały cron który np. raz dziennie robi porządki. nam ten cron zajął jakieś 20 minut pracy. to chyba nie jest za dużo?

5. ostatni argument nt. prostoty api muszę przyznać, że mnie zaskoczył.

spotkałem się z nim relatywnie najrzadziej, ale i tak pojawił się kilka razy. musiałem się nad nim chwilę zastanowić. efekt?

pomyślmy. api wpisu obrazka do bazy dla fajnych baz wygląda:

INSERT INTO obrazki (file) VALUES (‘?');

i wstawienie tak danych binarnych. to jest faktycznie proste. do czasu.

po przejści na inną (większą) bazę pojawiają się bloby których obsługa jest już zdecydowania inna. trzeba otworzyć, pisać, zamknąć – zupełnie jak przy pliku.

co do obsługi pliku, wystarcza trójca: open(); write(); close();. niezależnie od języka programowania wygląda to zasadniczo podobnie. dodatkowo część języków ma wbudowane mechanizmy do robienia tego jeszcze prościej – np. w perlu, można użyć modułu io::all, i potem takiej konstrukcji:

$dane > io(‘/tmp/some.file');

co zajmie się otwarciem, zapisaniem i zamknięciem. bezpiecznie. z obsługą sytuacji krytycznych.

i zadziała tak samo dla site'u mającego 400 wizyt tygodniowo i takiego co ma 400 wizyt na sekundę.

tak więc prostota api wydaje mi się być mocno dyskusyjna. ale ponieważ się pojawiła, trzeba było skomentować 🙂

zostały argumenty przeciwników zapisywania obrazków w bazie – z nimi pójdzie mi łatwiej, bo są to też moje argumenty:

1. na temat tego argumentu mam relatywnie najmniej do powiedzenia. do tej pory używałem dwóch baz wymuszającym prealokację przestrzeni (adabas d i oracle). w obu przypadkach uznałem pomysł za chybiony i maksymalnie upierdliwy. nie jestem specem od oracle'a czy adabasa. może się da to jakoś rozwiązać ładniej. ale jedna rzecz mnie “boli":

mając plik na dysku który ma 1 megabajt. zajmuje on na dysku fizycznie ten 1 megabajt plus wielkosć inode'a. łącznie powiedzmy 1 megabajt i 1 kilobajt.

plik w bazie podlega innym regułom. np. w postgresie – pole dłuższe niż 2 kilobajty jest dzielone i przechowywane w tabelach typu “toast". realnie oznacza to, że na każde 2 kilobajty jest zapisywane dodatkowo około 26 bajtów (plus 4 jeśli używamy oid'ów).

oznacza to, że nasz 1 megabajtowy obrazek w bazie zajmuje około 1megabajt i 13 kilobajtów.
12 dodatkowych kilobajtów to niedużo. a co jak obrazków jest milion?

2. z mojej dotychczasowej praktyki z bazami wynika, że jednego zasobu nigdy nie ma za dużo – są to połączenia do bazy. wystarczy jedno źle napisane zapytanie i potrafi zapchać serwer tak, że nawet najprostsze i najszybsze selecty się nie wykonają. z tego punktu widzenia obrazki to koszmar.

mały, prosty select, indeksowany – powinien być błyskawiczny. i faktycznie jest. dopóki czytamy dane lokalnie.

jeśli jednak request jest zdalny, to połączenie będzie wykorzystywane przez cały czas transmisji do klienta. czyli w skrajnym przypadku kilka minut. oops? czy widzicie ten problem?

nie ma znaczenia co zrobicie – wystarczy, że więcej ludzi zechce obejrzeć wasze obrazki korzystając z kiepskich łącz i system siada. a chyba nie o to chodziło?

3. to wydaje się być oczywiste. wrzucenie do bazy danych np. wielkości obrazka pozwala na proste filtrowanie. daty daje możliwość wyszukania najnowszych obrazków. a co nam daje wrzucenie samego obrazka? nic.

baza nie będzie filtrowała używając danych obrazka. nie założymy na tym indeksu. nie zrobimy order by czy nic takiego. po prostu dane do jednokrotnego wstawienia i selectowania. zero zysku przy dostępie.
4. ten argument wydaje mi się najistotniejszy.rozważmy co musi zrobić aplikacja aby zaserwować obrazek.

załóżmy, że nasza aplikacja jest w php, pracuje pod apache'em. baza danych – postgres.

  • php otwiera połączenie do postgresa (albo korzysta z gotowego)
  • wysyła zapytanie
  • postgres szybko znajduje plik w tabeli
  • odczytuje rekord
  • zwraca do php
  • znajduje nastepny blok
  • odczytuje
  • przesyła do php
  • itd. aż do końca pliku.
  • wtedy postgres informuje: to już koniec
  • a php przesyła to do klienta.

skomplikowane. w dodatku – postgres nie ma i nie może mieć za bardzo zoptymalizowanego dostępu do tego pliku – w końcu – to dane jak inne.
co się dzieje gdy request o plik trafia do apache'a który serwuje pliki statyczne z filesystemu?

  • mając otwarte połączenie do klienta
  • apache otwiera plik który ma serwować
  • a następnie wykonuje jednego syscalla: sendfile

ten syscall realizuje przesłanie zawartości jednego uchwytu pliku do drugiego. w tym przypadku całej zawartości pliku do klienta. całośc odbywa się w kernelu i jest niesamowicie szybka.
zgadza się, że nowe maszyny są szybsze niż kiedyś. ale wymagamy od nich więcej. i jeśli mam obsłużyć 2 miliony page-views dziennie, to nie będę poświęcał czasu maszyn na “durne" przerzucanie danych między procesami (baza, php, klient) skoro można po prostu przepompować dane na poziomie kernela. bez żadnych pętli, warunków itd.

do tego wszystkiego dochodzi jeszcze jeden argument – dla mnie istotny. w życiu każdego systemu pojawia się sytuacja, że kończy się wydajność sprzętu. trzymając wszystko w bazie musimy modyfikować serwer bazodanowy. a mając dane “rozrzucone" mamy większe marginesy bezpieczeństwa i więcej możlwości modyfikacji.

cały czas sensowne klastrowanie baz danych jest marzeniem. są produkty które to robią, ale kosztują horrendalne pieniądze.

natomiast klastrowanie apache'y czy innych fileserwerów jest proste, łatwe i praktycznie bezkosztowe (poza sprzętem oczywiście).

kończąc ten wpis – na pewno są sytuacje gdy względy różne (prawne czy biznesowe) wymuszają stosowanie przechowywania obrazków w bazie. wierzę, że są też takie sytuacje i takie powody o których ja nie wiem.
wiem jednak, że dla praktycznie wszystkich trzymanie obrazków w bazie jest dobrowolną rezygnacją z wydajności i skalowalności w imię mitycznych i łatwo obalalnych idei.