poniedziałek, 31 maja 2010

O skalowaniu baz danych słów kilka

Część druga o skalowalności. Dzisiaj trochę o bazach danych które sprawiają zawsze najwięcej problemów.

Ze względu na naturę baz danych, to co najbardziej obrywa na serwerze to dyski. Wszelkie zmiany muszą być jak najszybciej utrwalane żeby można było zwolnić blokady i zapewnić trwałość danych. Obojętnie jaki wypas serwer by się nie posiadało i tak w końcu dojdzie do tego, że nie będzie już posiadał możliwości by przyjąć więcej obciążenia, a nas nie będzie stać na zakup lepszego. Trzeba będzie się przeskalować w poziomie co jest trochę hardcorowe :)

Podejść jest kilka i chciałem omówić 3 najważniejsze z nich.

1. Master-Slave replication
W tym podejściu mamy jeden węzeł typu master oraz jeden lub więcej węzłów typu slave. Zadaniem węzła master jest tylko i wyłącznie przyjmowanie operacji modyfikacji danych. Ten serwer odpowiada za wszystkie zapytania typu INSERT, UPDATE i DELETE. Jest do tego specjalnie skonfigurowany by operacje te były jak najszybciej wykonywane. Węzły typu slave natomiast odpowiadają za wykonywanie zapytań typu SELECT. Może być ich kilka oczywiście. Aktualizują swoje dane poprzez asynchroniczną komunikację z węzłem master. Co określony czas przesyła on zgrupowane zapytania aktualizujące dane na węzłach slave.
Problemy związane z master-slave replication to:

  • na dobrą sprawę to nie ma tutaj skalowania poziomego. Co prawda mamy więcej węzłów, ale ciągle istnieje tylko jeden master, który może stać się wąskim gardłem, gdy liczba modyfikacji które musi wykonać przekroczy jego możliwości
  • synchronizacja aktualizowanych danych może powodować błędy. Jeśli klient coś zmodyfikuje i natychmiast to będzie chciał odczytać to może otrzymać błędne dane. To jednak można obejść stosując cache z polityką write-through
  • wymagana jest modyfikacja logiki aplikacji aby kierować SELECTy do slave, a modyfikacje do master
Podejście jest bardzo dobre, gdy mamy mało modyfikacji i dużo zapytań.

2. Database clustering 

Klastrowanie bazy danych polega na utworzeniu wielu instancji bazy danych współdzielących jedną wspólną pamięć trwałą. Daje to dużo większą przepustowość i nie wymaga prawie zmian w logice aplikacji.
Jednak posiada też wady:

  • SAN jest drogi i też ma swoje granice
  • wymagana jest kosztowna synchronizacja między wszystkimi węzłami (blokady itp.). Może nawet dojść do momentu, gdy dodanie nowego węzła spowolni działanie całości
3. Database sharding
Bazę danych można też podzielić na wiele mniejszych baz i tak z nich korzystać. Najpierw należy przeanalizować dokładnie sposób jej używania a później znaleźć grupy tabel które są używane razem w zapytaniach. Na tej podstawie można dzielić ją na mniejsze.
Problemy:

  • trzeba bardzo dobrze przemyśleć podział, każda późniejsza zmiana jest bardzo trudna do wprowadzenia
  • gdy jedna z mniejszych baz zacznie działać niewydajnie trzeba będzie ją znowu dzielić. Może dojść do tego, że trzeba będzie mięć np. 3 bazy danych z produktami
  • zapytania łączące z wielu baz są bardzo wolne
  • zapytania modyfikujące wymagają rozproszonych transakcji
  • wymaga znacznych zmian w logice aplikacji

To są tylko koncepcje, firmy w swoich produktach (tych "dużych" głównie) wprowadziły technologie, które ułatwiają skalowanie poziome. Np. w DB2 mamy Database Partitioning Feature, który jest połączeniem podejść database sharding i clustering i eliminuje kilka wad z nimi związanymi. 
Problem jest jednak bardzo złożony i wymaga długich przemyśleń. Trzeba zawsze pamiętać aby wdrożone rozwiązanie spełniało wymagania ACID.

niedziela, 30 maja 2010

O skalowaniu aplikacji słów kilka

W niedługim czasie zamierzam trochę szerzej pisać o skalowalności, więc postanowiłem napisać kilka słów wstępnych na ten temat. Ale spokojnie, planuję bardziej o produktach i narzędziach niż teoriach jak dzisiaj;)

Żeby później nie mylić trzeba sobie zdefiniować skalowalność. Jest to taka cecha oprogramowania która charakteryzuje jego zdolności do wydajnego działania przy wzrastającym obciążeniu. Np. załóżmy, że mamy super serwis randkowy który ma 1000 użytkowników i generuje strony w 50ms. Po jakimś czasie serwis robi się popularny i przychodzi do niego kolejnych 1000 użytkowników. Byłoby dobrze jakby strony generowały się w powiedzmy w czasie 100-200ms, ale generują się w 5000ms co niestety wskazuje na jego słabą skalowalność. Oczywiście ze wzrostem obciążenia zbliżamy się do limitu jaki może uciągnąć serwer, więc decydujemy się na wymianę starego ,zasłużonego na nowy, dwa razy lepszy. To jak aplikacja będzie się spisywać na nowym serwerze też określa jej skalowalność. Jeśli nadal strony będą się generować powoli przy takim obciążeniu to znaczy, że coś skopaliśmy przy implementacji, jeśli jest znowu fajnie i 50ms to znaczy, że aplikacja daje rade;) Podsumowując skalowalność to także łatwość w rozszerzaniu aplikacji lub jej architektury celem zwiększania wydajności.

Są dwa podstawowe podejścia co do skalowania aplikacji: pionowe (scaling up) oraz poziome (scaling out).

Podejście pionowe to po prostu wymiana lub dodawanie coraz to nowszego i szybszego sprzętu. Jak 12GB RAMu to już mało to dodajemy kolejne 12. Jak procesor nie wyrabia - dodajemy drugi itd. Sprawa jest niezwykle prosta i nie wymaga od nas w większości przypadków ingerencji w aplikację. Jednak posiada wady:

  • koszty - zakup coraz to lepszego sprzętu odbija się na budżecie i gdy po raz kolejny przyjdzie nam wymienić serwer może się okazać, że nas na niego nie stać, lub zyski z tej wymiany mogą być znacznie mniejsze niż poniesione koszty
  • bariera technologiczna - nawet jeśli mamy tyle kasy, że nas stać na każdy sprzęt na rynku to i tak w końcu dojdziemy do miejsca kiedy już nie będziemy mogli kupić lepszego sprzętu, bo po prostu nie on będzie istnieć
  • niska odporność na awarie, jak serwer padnie to system znika z sieci
Dlatego skalowanie pionowe jest dobre do czasu, gdy wymiana sprzętu na lepszy się jeszcze opłaca, lub gdy wiemy jaka jest górna granica wydajności jaką potrzebuje aplikacja.
Podejście poziome to też dodawanie nowego sprzętu, ale tym razem powiększamy jego zbiór dodając go do sieci istniejących już maszyn działających ku dobru systemu. Gdy obciążenie rośnie to dostawiamy kolejny serwer który przejmuje część zadań. Potrzebny jest nam jakiś mechanizm równoważenia obciążenia (load balancer), który będzie rozkładać równo żądania do wszystkich serwerów. 
Oczywiście to podejście też posiada swoje wady:
  • wyższe koszty administracji i konserwacji sprzetu
  • trzeba (bardzo) dobrze przemyśleć architekturę (zwłaszcza w kwestii bazy danych)
  • dodanie nowego węzła wcale nie musi przynieść wzrostu wydajności, możemy nawet zanotować spadek
No, ale mamy znacznie większą odporność na błędy. Jak jeden serwer padnie to mamy jeszcze kilka innych które po prostu przejmują jego ruch. Sprawa odporności na awarie to trochę inny wątek, więc może innym razem coś o tym napiszę.

Skalowanie poziome po jakimś czasie jest naturalnym krokiem przy rozwoju systemu. Przynosi lepsze rezultaty i przy dobrej architekturze może nam dać teoretycznie nieograniczoną skalowalność. Poza tym trudno sobie wyobrazić by np. Google działał na jednym serwerze :)

Dodawanie lub wymiana sprzętu to nie jedyna droga by przyspieszyć aplikację. W pierwszej kolejności powinna być wykonana dokładna analiza wszystkich komponentów czy możliwa jest ich optymalizacja. Wymaga to trochę czasu, ale przynosi rezultaty. Np. digg.com zyskał 4000%, gdy przeniósł sortowanie z bazy danych do php. Optymalizacja to niestety niekończąca się podróż :)

Zainteresowanych tematem zachęcam do zaglądania do serwisu highscalability.com, gdzie można poczytać dużo artykułów od strony praktycznej. Ja postaram się też ciągnąć temat u siebie, bo jest o czym pisać ;)

wtorek, 25 maja 2010

Dziwny wyjątek podczas uruchamiania skryptu JavaFX

Wczoraj w zamian za to, że nie mogłem pojawić się na Poznańskim JUGu (trochę się przeziębiłem), zabrałem się za JavaFX. Bardzo mało o tym widzę na (Polskich) blogach, więc stwierdziłem, że może coś poczytam i może coś też popiszę u siebie. Niestety pierwsze wrażenie nie było zbyt miłe :P Przyszło mi walczyć kilka godzin z wyjątkiem który wyglądał jak błąd implementacji czegoś w JavaFX.
Plan był taki aby wziąć jeden z przykładów na stronie JavaFX.com, zmodyfikować i zobaczyć co z tego wyjdzie. Jako środowiska użyłem oczywiście NetBeans IDE w wersji 6.8.
Na komputerze lokalnym mój piękny skrypt działał bez zarzutów (uruchamiałem w trybie run in browser), to samo na serwerze.... do czasu aż nie wyłączyłem NetBeans! Kiedy był wyłączony otrzymywałem w consoli javy taki wyjątek:
java.lang.NullPointerException
at sun.plugin2.applet.JNLP2Manager.initialize(Unknown Source)
at sun.plugin2.main.client.PluginMain.initManager(Unknown Source)
at sun.plugin2.main.client.PluginMain.access$300(Unknown Source)
at sun.plugin2.main.client.PluginMain$2.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Error while initializing manager: java.lang.NullPointerException, bail out
Ten problem występował także na moim laptopie i u znajomych. No to się zaczęło wielkie googlowanie i podmiany SDK/JDK na wszystkie możliwe wersje łącznie z instalacją bety NetBeans 6.9 (swoją drogą zapowiada się bardzo ciekawie!). Nic nie pomogło, nic się nie zmieniło :-/ Ostatecznie poległem i napisałem na forum NetBeans z prośbą o pomoc jakoś przed północą. Do rana nikt nie odpisał, ale dziś gdy wstałem wyjątek już był inny. Konsola zgłaszała, że brakuje pliku xxx_browser.jnlp który na 100% znajduje się zaraz obok JARa. Podejrzałem ten plik, a tam ujrzałem bardzo ładny i krótki XML:
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://localhost:8082/servlet/org.netbeans.modules.javafx.project.JnlpDownloadServlet/I%3A/workspace/NetBeans/WebSiteJavaFx/dist/" href="website_browser.jnlp">
    <information>
        <title>website</title>
        <vendor>wookasz</vendor>
        <homepage href="http://localhost:8082/servlet/org.netbeans.modules.javafx.project.JnlpDownloadServlet/I%3A/workspace/NetBeans/WebSiteJavaFx/dist/"/>
        <description>website</description>
        <offline-allowed/>
    </information>
    <resources>
        <j2se version="1.5+"/>
        <extension name="JavaFX Runtime" href="http://dl.javafx.com/1.3/javafx-rt.jnlp"/>
        <jar href="website.jar" main="true"/>
    </resources>
    <applet-desc name="website" main-class="com.sun.javafx.runtime.adapter.Applet" width="700" height="500">
        <param name="MainJavaFXScript" value="pl.lstachowiak.javafx.website.WebSite"/>
    </applet-desc>
    <update check="always"/>
</jnlp>
No jak widać dwie ścieżki coś nie takie jakie powinny być. Podmieniłem na http://lstachowiak.pl i vuala! Działa!:) plik ostatecznie wygląda następująco:
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://lstachowiak.pl/" href="website_browser.jnlp">
    <information>
        <title>website</title>
        <vendor>wookasz</vendor>
        <homepage href="http://lstachowiak.pl/"/>
        <description>website</description>
        <offline-allowed/>
    </information>
    <resources>
        <j2se version="1.5+"/>
        <extension name="JavaFX Runtime" href="http://dl.javafx.com/1.3/javafx-rt.jnlp"/>
        <jar href="website.jar" main="true"/>
    </resources>
    <applet-desc name="website" main-class="com.sun.javafx.runtime.adapter.Applet" width="700" height="500">
        <param name="MainJavaFXScript" value="pl.lstachowiak.javafx.website.WebSite"/>
    </applet-desc>
    <update check="always"/>
</jnlp>
Szkoda, że nigdzie nie wyczytałem wcześniej, że ten plik jest plikiem tekstowym. Z pewnością zajrzałbym tam na początku i oszczędziłoby mi to trochę czasu i nerwów.
Zapraszam na lstachowiak.pl, co prawda nie jest to dzieło sztuki, ale zawsze jakieś początki ;-)

UPDATE:
A jednak ciągle nie działa :-/ Nie rozumiem tego zupełnie. Będę rozwijać wątek jak do czegoś dojdę. Może ktoś ma jakieś sugestie ?

UPDATE2:
Dzięki bardzo Krzysztofowi Kula :) Skompilowałem za pomocą eclipsowej wtyczki i zaczęło działać.

czwartek, 20 maja 2010

Spotkanie Poznań JUG - Processing [24.05.2010]

Znowu info z Poznania :) Kolejne spotkanie się szykuje! W najbliższy poniedziałek posłuchamy o Processing -środowisku do tworzenia sztuki elektronicznej. Zapowiada się bardzo widowiskowo:) Oto krótkie streszczenie od prelegenta Marcina Ignaca:
Przedstawie swoje doświadczenia z pracy ze środowiskiem Processing. Prezentacje rozpoczne krótkim wyjaśnienie czym jest Processing oraz wprowadzeniem do sposobu pracy z tym środowiskiem. W dalszej części spotkania możecie się spodziewać projektów z obszarów grafiki generatywnej, przez interaktywne instalacje aż do multimedialnych projekcji w przestrzeni publicznej. Od fazy konceptualnej przez prototypowanie aż do finalnego produktu – Processing sprawdza się na każdym kroku. Opowiem również o wadach i zaletach tego narzędzia, a także jak “szkicowanie w kodzie” (sketching in software) zmieniło moje podejście do programowania.
Aby zapoznać wstępnie z tematem zapraszam na stronę prelegenta pod tag processing.org.
To mi się bardzo spodobało:

MSAFluid with motion tracking from Marcin Ignac on Vimeo.

Nie muszę już raczej nikogo namawiać aby się zjawić! ;)

Szczegóły:
Poniedziałek 24.05.2010
Siedziba Cognifide - Aleje Wielkopolskie 4, Poznań
Godzina 18:00
Na spotkanie wymagana jest rejestracja

Do zobaczenia !

ps. ostatnio u mnie czysto informacyjne, ale postaram się niedługo to nadrobić ;)

niedziela, 16 maja 2010

Zmiana adresu bloga na blog.lstachowiak.pl

Drobny post informacyjny. Jutro zmieniam adres bloga na blog.lstachowiak.pl Nie wiem jak to się odbije na dostępie do niego ze starego adresu (Google twierdzi, że powinno być spoko) oraz RSS (to też podobno) dlatego jeśli byłyby jakieś problemy to proszę tylko zupdatować sobie adres.

ps. testy wypadły poprawnie ;-)

wtorek, 11 maja 2010

Eclipse DemoCamp Helios 2010 - Poznań [10.06.2010]

Dużo się dzieje ostatnio w Poznaniu! Bardzo dużo! GeeCON, spotkanie PJUG a teraz dochodzi jeszcze Eclipse DemoCamp. Parę dni temu zaczęły się zapisy oraz Call for Papers. Jeśli pracujesz z Eclipsem i chcesz podzielić się swoimi doświadczeniami nie wahaj się tylko zgłoś jako prelegent!
Na tę chwilę zgłosiły się już 3 osoby ze swoimi tematami:

  1. Krzysztof Daniel/IBM Eclipse Support Center, EMF supports GWT or Eclipse Extended Preferences
  2. Krzysztof Kazmierczyk, OSGI in the cloud
  3. Jacek Pospychała
Osoby które jeszcze nie są pewne co by mogły przedstawić jak i te co się zdecydowały muszą się dopisać do listy uczestników na wiki Eclipsa: wiki.eclipse.org/Eclipse_DemoCamps_Helios_2010/Poznan.
Impreza odbędzie się 10 czerwca na terenie Centrum Wykładowego Politechniki Poznańskiej w salach 6 i 8.
Rozpoczęcie zaplanowano na godzinę 18:00.
Pizza oczywiście będzie :)

Serdecznie zapraszam!

ps. jak tak dalej pójdzie to Poznań powalczy o miano stolicy Javowej społeczności w Polsce ;-P

niedziela, 9 maja 2010

Spotkanie JUGs@GeeCON [12.05.2010]

Poznań JUG w wydaniu specjalnym! Z okazji zbliżającego się GeeCONa odbędzie się spotkanie zorganizowane we współpracy z Polish Java User Group. A na nim wystąpi aż trzech prelegentów z różnych miejsc na świecie:

Geertjan Wielenga:
The NetBeans Platform is the framework that underlies the NetBeans IDE – and many other desktop applications, some of which you may have already used. The Platform saves years of development time in building any significant desktop application, by providing a modular framework that simplifies both developing and updating desktop applications. It is used by vendors as diverse as Nokia (NetACT – cellular network monitoring and management) and Boeing (engineering materials analysis), UNESCO and many others, to develop applications as diverse as photo library management, satellite network management, semiconductor testing, planning oil drilling and music composition.

The NetBeans Platform is based on pure Java and uses the Java standard Swing toolkit, making applications based on it portable – and even deliverable via Java WebStart directly via the web. This talk will provide a comprehensive overview of the NetBeans Platform, how it works, and how to get started using it.
Chris Aniszczyk:
Eclipse e4 brings a new set of technologies into the existing Eclipse platform that make Eclipse applications easier to write, more configurable by developers and integrators and easier to reuse in a variety of runtime environments.
In the end, attendees will be introduced to Eclipse e4 and learn about the future of the Eclipse platform.
Ed Burns:
Ed has developed a 50 minute audio-visual presentation recounting his experience in writing the book. This presentation includes audio clips from the programmers themselves, including subtitles for those for whom English is not their native language, together with insight to tie it all together.
Myślę, że nie muszę nikogo przekonywać do tego, że tego spotkania JUGa przegapić nie można :)

Uwaga! Wyjątkowo spotkanie odbędzie się w innym miejscu - Poznańskim Ośrodku Nauki znajdującym się na ul. Wieniawskiego 17/19, sala 312. Miejsce to zaznaczone jest na GeeCONowej mapce:

Pokaż GeeCON in Poznan na większej mapie


Godzinę rozpoczęcia zaplanowano na 18:00. Do uczestnictwa wymagana jest rejestracja pod tym adresem.
Do zobaczenia!!

sobota, 8 maja 2010

GeeCON już w Poznaniu!

GeeCONowy baner już uświetnia Poznańskie Multikino, gdzie za kilka dni odbędzie się konferencja.
Rozpiska tego co, kto i gdzie dostępna jest tutaj -> geecon.org/site/schedule. Jak widać udało się nam zaprosić wiele gwiazd świata Javowego i nie tylko - nie można tego przegapić!
Jeśli jeszcze się nie zarejestrowałeś/zarejestrowałaś to zostały już ostatnie chwile! Spiesz się!
Można także zapisać się na University Day gdzie czeka kilka bardzo ciekawych szkoleń :)

Zapraszam i do zobaczenia na GeeCONie!!

GeeCON w sieci:
www: www.geecon.org
twitter: twitter.com/Geecon_news
facebook: www.facebook.com/pages/GeeCON/