W pierwszej części napisałem czym jest klastrowanie i do czego służy. Pora skupić się na architekturach klastrowania dostępnych w serwerze JBoss AS.
Topografia klastra zdefiniowana w odpowiednim pliku konfiguracyjnym usługi HAPartition za pomocą XMLa dla każdej instancji, ma ogromne znaczenie dla administratorów serwerów JBoss. Programiści natomiast zwracają większą uwagę na konfigurację z punktu widzenia klienta usługi. W JBoss AS wykorzystywane są dwie architektury klastrowania:
- interceptory po stronie klienta,
- zewnętrzne loadbalancery.
Interceptory po stronie klienta
Większość zdalnych usług udostępniania przez serwer JBoss AS włączając w to JNDI , EJB, JMS , RMI czy JBoss Remoting wymaga od klienta, aby ten uzyskał (znalazł i pobrał) obiekt stub (proxy). Obiekt stub jest generowany przez serwer. Implementuje on interfejs biznesowy usługi. Po pobraniu obiektu stub przez klienta wywołuje on na nim lokalne zapytanie, następnie stub przekazuje zapytanie przez sieć do odpowiedniej usługi.
Zaślepka wygenerowana przez serwer zawiera w sobie interceptor, który wie jak rutować zapytania do wielu węzłów w klastrze. Następnie stub znajduje odpowiedni węzeł, serializuje parametry zapytania, odserializowuje wyniki zapytania i zwraca je do klienta. Interceptor posiada aktualną wiedzę na temat klastra. Zna on adresy IP każdego dostępnego węzła w klastrze, algorytm dystrybucji obciążenia pomiędzy węzłami oraz informację, w jaki sposób radzić sobie z sytuacją, gdy docelowy węzeł nie będzie dostępny.
W przypadku gdy topologia klastra zmienia się, węzeł uaktualnia dane w interceptorze przy najbliższym zapytaniu. Przykładowo, gdy jeden z węzłów zostanie odłączony od klastra – każdy interceptor zostanie o tym powiadomiony przy podłączeniu się do któregokolwiek aktywnego węzła. Wszystkie aktualizacje obiektu stub są niewidoczne dla klienta.
Polityki rozkładu obciążenia
Dla architektury opartej na interceptorach po stronie klienta serwer JBoss AS 4.2 oferuje następujące polityki:
- Round-Robin (
org.jboss.ha.framework.interfaces.RoundRobin) – każde zapytanie jest przekazywane do kolejnego serwera znajdującego się na liście dostępnych węzłów, pierwszy cel jest wybierany przypadkowo. - Random-Robin (
org.jboss.ha.framework.interfaces.RandomRobin) – dla każdego zapytania docelowy węzeł wybierany jest przypadkowo. - First Available (
org.jboss.ha.framework.interfaces.FirstAvailable) – jeden z dostępnych węzłów zostaje zostaje wybrany jako domyślny (bez znaczenia który). Gdy lista dostępnych węzłów zmieni się stub wybierze następny dostępny węzeł, jednak dopiero wtedy gdy wybrany wcześniej węzeł już nie działa. Każdy stub wybiera cel niezależnie. Jeżeli klient pobierze dwa obiekty stub (np. EJB) – każdy z nich wybierze samodzielnie cel. Jest to polityka, która zapewnia tzw. session affinity (sticky sessions). - First Available Identical All Proxies (
org.jboss.ha.framework.interfaces.FirstAvailableIdenticalAllProxies) – polega na tym samym co, First Available z tą różnicą, że wszystkie zapytania jednego klienta będą kierowane do tego samego docelowego węzła. Dla przykładu: jeżeli klient pobierze dwa obiekty stub jakiejś usługi, każdy z nich będzie odwoływał się do tego samego węzła w klastrze.
Wszystkie powyższe polityki są implementacją interfejsu org.jboss.ha.framework.interfaces.LoadBalancePolicy. Można stworzyć również własną implementację tego interfejsu.
Loadbalancer
Wiele usług udostępnianych przez serwer JBoss nie wymaga od klienta, aby ten pobierał obiekt proxy. W szczególności dotyczy to usług związanych z protokołem HTTP, gdzie klient (często przeglądarka internetowa) wysyła zapytania i otrzymuje odpowiedzi bezpośrednio za pomocą połączenia odpowiedniego dla wybranego protokołu (np. HTTP). W takim przypadku wymagany jest zewnętrzny loadbalancer, którego zadaniem jest przetworzenie otrzymanych zapytań, a następnie ich wysyłka do węzłów w klastrze. Loadbalancer jest logiczną częścią klastra, mimo to określa się go jako usługę zewnętrzną.
Loadbalancer może zostać zaimplementowany jako rozwiązanie programowe bądź sprzętowe. Wielu producentów oferuje bardzo zaawansowane rozwiązania sprzętowe. W rozwiązaniach programowych na wyróżnienie zasługują moduły serwera Apache. Do wersji 2.2 serwera Apache rolę loadbalancera dla serwerów aplikacyjnych Javy pełnił moduł mod_jk. Obecnie funkcjonalność ta jest dostarczana przez moduł mod_proxy_balancer.
Loadbalancer posiada zaimplementowany mechanizm, który umożliwia mu poznanie topologii klastra oraz zapewnia logikę rozkładu obciążenia pomiędzy węzłami czy detekcji niedziałających węzłów. Problemem przy takiej architekturze może być to, że loadbalancer sam w sobie może być powodem braku dostępu do aplikacji, ponieważ gdy loadbalancer przestanie odpowiadać – żaden klient nie dostanie się do aplikacji, dlatego też loadbalancer powinien być stale monitorowany aby zapewnić wysoką dostępność całego klastra. Bardzo często stosuje się redundancję loadbalancerów aby wykluczyć pojedynczy punkt awarii.




