konto usunięte

Temat: Java & clustering

Może pojawić się kilka dziwnych pytań. Jednak bardzo niewiele wiem jeśli chodzi o technikę "clustering". Co gdzie i kiedy stosować. Czy jeśli napiszemy prostą aplikację w springu (1 moduł) to czy potem "łatwo" można ją przystosować do działania w klastrze ? W sieci jest bardzo mało konkretnych informacji na ten temat, dlatego myślalem, że ktoś tak na "chłopski rozum" powie jak najlepiej stosować tą technikę, w odniesieniu np. do aplikacji springowej. Pytania które mnie dręczą to np. :

1) Co się dzieje z zadaniami typu Quartz ? Który node ma wykonywać dane zadanie?
2) Jak śledzić logi. Pisząc stronę web mamy logi na 1 nodzie, natomiast jak ten problem rozwiązuje się w klastrze
3) Jak się rozwiązuje problem sesji. Replikacja, persistance w bazie (np. Redis) czy statyczne komponenty sesyjne ?

Ogólnie tematyka jest tak, jak dla mnie troszkę zagmatwana. Dużo jest koncepcji, jakichś pomysłów, ale nie ma takiego miejsca (strona www, książka) gdzie ta tematyka jest szerzej i w prosty sposób przedstawiona (chyba, że o czymś nie wiem)
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: Java & clustering

W klasycznym podejsciu (nie koniecznie java) wieze sie z szeregiem problemow:

1) nody powinny byc bezstanowe, nie mozemy na ogole nic na nich przechowywac, wiec potrzebne jest centralny data storage (np NAS) jak np kolejny klaster. Tu w zasadzie sie konczy wiekszosc "roznic programowych" w wielu aplikacjach, musisz zadbac, aby byla bezstanowa, nei zapisywala niczeo kokalnie.

2) kazdy node to dokladna kopia (w ramach danego klastra) - istotne jest pamietac, ze kazda zmiana musi byc wprowadzoan wszedzie

3) deployment na wszystkie nody - jesli sama Java to pewnie kontenery maja taka mozliwosc wbudowana, jesli dodatkowo technologie powiazane - dochodza problemy, ktore moze rozwiazac np capistrano.

4) Load balancing - musisz jakos dzielic ruch miedzy dostepne maszyny, sa rozne wersje load balancingu, od round-robin (w kolko) do bardziej wyrafinowanych metod, gdzie LB dokladnie wie co sie dzieje na maszynach i daje prace najmniej zajetej. Z ciekawostek, sa load balancery brzegowe i load balancery middle tier, czyli masz klastry swoich aplikacji uslugowych w architekturze SOA, gdzie jedna usluga rozmawia do drugiej jako do klastra przez load balancery proxy. Istnieja tez load balancery dzialajace jako service discovery, czyli nie przepuszczasz ruchu przez load balancer, a jest on jedynie informantem, z kim w danej sprawie rozmawiac w danym momencie (z ktorym nodem, ktorej uslugi itd) - zobacz sobie Netfllix Eureka

5) centralizacja zbierania logow (rozwiazan jest sporo, ja uzywam logstash + elasticsearch na AWS), od rozwiazan on premise, do aplikacji typu new relic czy appdynamic (obie dosc drogie, ale jednoczesnie profiluja wydajnosc)

6) zarzadzanie konfiguracja serwerow - tu wchodza dosc popularne rozwiazania dla malych/srednich (ale i wiekszi
korzystaja) jak Puppet czy Chef (facebook uzywac chefa, ja osobiscie wole idee Puppeta)

7) sesja - no java ma swoje mechanizmy do kopiowania sesji miedzy serwerami, mi sie to jednak zawsze wydawalo dosc ciezkie. Nie-javowe podejscie to klaster memcached/redis/elasticache i serializacja i deserialiacja. Dostep jest o 2 rzedy wielkosci szybszy niz do bazy danych (aczkolwiek najwieksze firmy, uzywaja baz, jak np Amazon).

W Jave dochodza rozwiazania typu quartz/terracotta ktore sztucznie niejakoby tworza jedna duza przestrzen (wirtualny klaster) w razie, gdy twoja aplikacja jest raczej OLAP'owa niz OLTP,powa.
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: Java & clustering

Sorry za 2 post, ale jakis spryciarz z GL dodal mega event na textarea, wiec jak wychodze poza wysokosc ekranu to przy kazdy keyUp dostaje scroll to gory i scroll w dol.. pzy kazdym jednym znaku wpisanym ;-)

Na naszym przykladzie, powiem, ze mamy szereg aplikacji, kazda w swoim wlasnym klastrze na AWS. Sa aplikacje php (rozne wersje/frameworki), aplikacje perlowe, javowe (spring), wszystkie jako swoje wlasne klastry na dosc malych maszynach (na amazonie dochodzi auto-scalowanie). Wszystkie aplikacje sa bezstanowe, serwery (instancje) wymieniane co kilka dni. Logowanie leci do centralnego indexera pozwalajacego na wyszukiwanie i wizualizacje (elasticsearch). Kazda gada do siebie przez load balancer (czesc jest wewnetrzna, czesc brzegowa).

Moze Cie do czysto javowego zastosowania zainteresowac cos takiego jak Akka - maja ciekawy sposob dzielenia zasobow na innych maszynach tak, ze powstawie hierarchia wykonania i mamy w efekcie wirtualny klaster bez wiekszej spiny.Ten post został edytowany przez Autora dnia 06.11.13 o godzinie 15:02

konto usunięte

Temat: Java & clustering

Piotrze dziekuję ślicznie, właśnie o coś takiego mi chodziło.
Fajnie to wypunktowałość, dało mi pewien punkt odniesienia.Ten post został edytowany przez Autora dnia 06.11.13 o godzinie 14:05
Jarosław Szczepankiewicz

Jarosław Szczepankiewicz Lead Technical
Consultant

Temat: Java & clustering

Piotr J.:
Moze Cie do czysto javowego zastosowania zainteresowac cos takiego jak Akka - maja ciekawy sposob dzielenia zasobow na innych maszynach tak, ze powstawie hierarchia wykonania i mamy w efekcie wirtualny klaster bez wiekszej spiny.

nie byłbym takim optymistą z akką ;):
- to nie tylko "framework" czy "biblioteka" tylko zupełnie inna architektura niż OOP lub proceduralne przetwarzanie, więc przestawienie się na dobre praktyki i myślenie aktorami jest nie mniej trudne niż nauczenie się drugiego języka programowania
- dokumentacja do akki jest jeszcze mocno uboga i nawet example dołaczone do Akki (szczególnie te w javie, bo w scali mam wrażenie lepiej się przyłożyli) mają błędy logiczne (np. moduł sieciowy I/O miał / ma błąd w examplach)
- z automatu jest znacznie łatwiej z nieblokującymi rzeczami w akkce w kwestii skalowania, ale już gdy dochodzi do blokujących wywołań (jdbc / większość io itp.) + konieczności trzymania "współdzielonego stanu między aktorami" łatwo jest się "poślizgnąć". W związku z tym nie każdy rodzaj biznesowych problemów dobrze się będzie skalował na akkce, czasami może być prościej tak jak mówisz napisać bezstanowe nody w klasycznych frameworkach + dodać load balancer / failover przy aplikacjach mocno opartych o blokujące wywołania zewnętrzne.
a tak poza tym to akka rulez ;)

konto usunięte

Temat: Java & clustering

Hmm ja myślałem coś zastosować takie technologie jak :

1) Usługi tylko rest
2) Częśc kliencka AngularJS, Css itp
3) Spring security + CAS
4) Z baz danych mongodb (fajnie się powinno skalować)
5) Do tego dołożyć cache Jboss as Infinispan
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: Java & clustering

@Jarek

Tak, masz racje, dobrze sobie przeczytac http://pragprog.com/book/vspcon/programming-concurrenc... zeby zrozumiec podstawy, jest to ciekawy sposob dzielenia pracy. Sa tez jednak inne, jak STM (Clojure) i kanaly (spring integration, golang) ktore moga byc dosc ciekawe, golang ostatnio dostal skrzydel.

Z mojego doswiadczenia wynika jednak, ze dobry programista w TurboPascalu oprogramuje kogos, kto nie kuma Javy. NIO jest naprawde potezne, java.concurrent takze daje duzo mozliwosci, zanim sie skoncza, warto sie zastanowic, czy przesiadka na jednak troche "cuda" jak akka sa warte zachodu.

@Lukasz

4) Prototypuj najpierw, bo widze, ze wybierasz bazujac na totalnym hype ;) MySQL skaluje sie do kilku miliardow odslon miesiecznie (zaufaj, wiem z autopsji). A z Mongo dostaniesz "nieoczekiwane" problemy ze strony administracyjnej - mam go w produkcji, czasem chce sie plakac.... Zbuduj sobie kilka replica setow, troche szardow i sprobuj to zabic usuwajac nody i wstawiajac spowrotem. Ostatnio gadalem z gosciem, ktory wybal rozwiazania nosql bo ich problemy przestaly sie miescic w domenie petabajtow. Tu sporo ludzi podsmiewa sie z mongo, z powodu ich pierwszych chociazby benchmarkow, ktore bazowaly na asynchronicznym pisaniu do bufora :D czyli generalnie miales baze danych, ktorej sterowniki domyslnie byly ustawione na fire&forget. Do tego poczyatj sobie o teorii CAP, zanim podejmiesz wybor. Polecam http://martinfowler.com/books/nosql.html. Moj szef w firmie, w ktorej mielismy 1,5 miliard odslon miesiecznie na sajcie, powiedzial "nie martw sie ze ci userzy baze zabija zapytaniami, zanim zarejestruje sie pierwszy user".

5) Nie wiem juz w zasadzie po co Ci to jesli chcesz miec klaster do uslug REST (i zakladam SOA do 1 page app)

To ostatnio nabiera rozpedu http://vertx.io/ mozesz sie zainteresowac, ma klastrowanie wbudowane, a model wspolbieznosci podobny do skali, oparty o distributed event bus. Ma archetyp mavena do szybkiego startu. Mozna sie pobawic. Z tego co mi mowiono, jest sporo lzejszy od springa (zobacz sobie w visualvm jak spring odpali hello-world ile tam sie dizeje w srodku rzeczy neizwiazanych z wyrzuceniem "hello-world" na ekran.)

konto usunięte

Temat: Java & clustering

Piotr J.:

@Lukasz

4) Prototypuj najpierw, bo widze, ze wybierasz bazujac na totalnym hype ;)

Zgadzam się z tobą w 100 % Prototypuję :) chcę także usłyszeć opinię innych.

Ja właśnie chciałem skorzystać ze stosu technologii jakie dostarcza spring w tym spring integration myślałem coś o takiej architekturze jaką przedstawił Adam Bien : str 45

http://download.java.net/general/podcasts/real_world_j...

Odnośnie mongodb wiem, wiem mieli swoje wpadki na początku, ale teraz dostali dofinansowanie i widać, że nowsze wersje są już bardziej dopracowywane.
5) Nie wiem juz w zasadzie po co Ci to jesli chcesz miec klaster do uslug REST (i zakladam SOA do 1 page app)

Hmm zakładam istnienie grubego klienta. Czyli JS + AngularJS od strony klienta. Programowanie foreground musi być niezależne od background. Nie widzę lepszego wyjścia niż w ten właśnie sposób.Ten post został edytowany przez Autora dnia 07.11.13 o godzinie 14:16
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: Java & clustering

Memcache, Redis, mozesz sobie usera trzymac bazujac na tokenie WSSE (skoro gruby klient) i autentykowac kazde zapytanie w ten sposob, nie ma nawet potrzeby sesji, tylko autentykacja, wiec IMHO utrudniasz sobie zycie.

konto usunięte

Temat: Java & clustering

Hmm Panowie a tutaj proszę coś nawet od springa się znajdzie :
Spring XD, Spring Reactor , Spring Integration

Szkoda tylko, że te projekty nie są w pełni rozwinięte :/

http://spring.io/blog/2013/05/13/reactor-a-foundation-...
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: Java & clustering

Tak na serio, to masz problemy z danymi w petabajtach bo mam wrazenie, ze juz tworzysz poprostu magie;-) ?

Spring integration jest dobrze rozwiniety, ale wiem czy wiesz do szego sluzy jak wymieniasz z spring xd i reactorem ;-)Ten post został edytowany przez Autora dnia 07.11.13 o godzinie 17:51

konto usunięte

Temat: Java & clustering

Nie na szczęście nie o to chodzi.

Spring XD jak napisali w springu jego celem jest walka z wielką złożonością danych. Natomiast Spring Reactor będzie odpowiednikiem (a la) Akki . Spring integration jak nazwa wskazuje fajne mechanizmy integracji wszelkiego rodzaju danych.

Chodziło mi bardziej o spring reactor, bo to bardzo interesująca propozycja szkoda, że jeszcze w fazie produkcji :/

konto usunięte

Temat: Java & clustering

Łukasz W.:
Nie na szczęście nie o to chodzi.

Spring XD jak napisali w springu jego celem jest walka z wielką złożonością danych.

Złożoność danych...

konto usunięte

Temat: Java & clustering

Jarosław S.:
Piotr J.:
Moze Cie do czysto javowego zastosowania zainteresowac cos takiego jak Akka - maja ciekawy sposob dzielenia zasobow na innych maszynach tak, ze powstawie hierarchia wykonania i mamy w efekcie wirtualny klaster bez wiekszej spiny.

nie byłbym takim optymistą z akką ;):

- to nie tylko "framework" czy "biblioteka" tylko zupełnie inna architektura niż OOP lub proceduralne przetwarzanie, więc przestawienie się na dobre praktyki i myślenie aktorami jest nie mniej trudne niż nauczenie się drugiego języka programowania

Trzeba też dodać - akka służy do / upraszcza tworzenie systemów " concurrent" a nie "skalowalnych / w klastrze" (cokolwiek to znaczy).

http://en.wikipedia.org/wiki/Akka_(toolkit)
Szymon Biliński

Szymon Biliński Programista Java

Temat: Java & clustering

Łukasz W.:
1) Co się dzieje z zadaniami typu Quartz ? Który node ma wykonywać dane zadanie?

Zakładam, że masz na myśli obiekty, które powinny mieć dokładnie jedną instancję w obrębie danego klastra?

W najprostrzym przypadku, możesz przypisać dany obiekt do wybranego węzła na stałe i aktywować go warunkowo na podstawie zewnętrznego parametru konfiguracji. Takie rozwiązanie nie jest jednak HA - jeżeli wybrany węzeł padnie, to nic go samoczynnie nie zastąpi.

Bardziej niezawodnym rozwiązaniem jest tzw. "clustered singleton". Przykładową implementację znajdziesz tutaj (JBoss AS).
2) Jak śledzić logi. Pisząc stronę web mamy logi na 1 nodzie, natomiast jak ten problem rozwiązuje się w klastrze

Najprościej wysłać je przez sieć na wybraną maszynę: przykład (log4j).
3) Jak się rozwiązuje problem sesji. Replikacja, persistance w bazie (np. Redis) czy statyczne komponenty sesyjne ?

Można nic z nią nie robić, ale wymaga to ustawienia "sticky session" na load balancerze. Taki wariant nie jest odporny na awarie (tj. wywalenie się danego węzła powoduje utratę sesji, które były przez niego obsługiwane), ale jest stosunkowo łatwy w utrzymaniu.

Jeżeli potrzebujesz replikacji, to jest to kwestia odpowiedniej konfiguracji kontenera (dotyczy to zarówno sesji HTTP jak i second-level cache). Z punktu widzenia aplikacji nie musisz nic szczególnego robić (nie licząc może tego, że obiekty przechowywane w sesji powinny być serializowalne, ale to w zasadzie dotyczy każdej aplikacji).

Krótko mówiąc, *większość* problemów związanych z klastrowaniem rozwiązuje się na etapie wdrożenia, a nie implementacji. Jeżeli chcesz bliżej zapoznać się z tematem, to bardzo polecam książkę Scalable Internet Architectures (Theo Schlossnagle) oraz lekturę JBoss Clustering Guide (JEE, ale koncepcje są szersze).

Następna dyskusja:

Czy Play Framework dla Java...




Wyślij zaproszenie do