pátek 1. prosince 2006

JBoss cluster krok za krokem

JBoss logoChtěli by jste otestovat svojí webovou aplikaci v clusteru a nebo si prostě jenom takový cluster vyzkoušet. Pokud ano, můžete pokračovat čtením tohoto průvodce Jak vytvořit JBoss cluster krok za krokem. Nemělo by Vám to zabrat podle mých odhadů více jak patnáct minut.

Níže popsaným způsobem můžete cluster rozběhnout na jednom počítači. Není tedy potřeba více počítačů, samozřejmě pokud budete postupovat analogicky, tak je možný postup aplikovat i pro scénář kdy jsou jednotlivé uzly clusteru oddělené. Přesto má za určitých podmínek i cluster v rámci jednoho počítače opodstatnění. Například OS Windows limituje maximální množství paměti přidělené jednomu procesu, toto omezení se dá obejít právě díky rozběhnutí clusteru v rámci jednoho počítače.

Instalace JBosse

První věc, kterou musíme udělat je nainstalovat JBoss. Doporučuji stáhnout a použít instalátor. Při výběru instalační skupiny zvolte skupinu all tak budete mít JBoss s podporou clusteru. Všechny ostatní hodnoty necháme na defaultních hodnotách. Instalační složku JBosse budeme dále v textu označovat jako JBOSS_HOME.

Vytvoření uzlů clusteru

Po instalaci si vytvoříme cluster, který bude obsahovat dva nódy.

v adresáři JBOSS_HOME\server se nalézá adresář default. Ten dvakrát v tom samém adresáři zkopírujeme jednou pod jménem node1 a node2. Tím pádem budeme mít v JBOSS_HOME\server celkem tři adresáře default, node1 a node2.

V souborech JBOSS_HOME\server\node1\conf\jboss-service.xml a JBOSS_HOME\server\node2\conf\jboss-service.xml odkomentujeme následující beanu.

<mbean code="org.jboss.services.binding.ServiceBindingManager" name="jboss.system:service=ServiceBindingManager">

Navíc v tom samém konfiguračním souboru druhého uzlu změníme

<attribute name="ServerName">ports-01</attribute>

na

<attribute name="ServerName">ports-02</attribute>

Odkomentováním této beany jsme určili, že se nepoužijí defaultní porty, protože by nám dva JBoss server neběžely vedle sebe na jednom počítači. Místo těchto defaultních portů se použijí porty nadefinované v souboru ${jboss.home.url}/docs/examples/binding-manager/sample-bindings.xml. V tomto souboru jsou jsou pak pod klíčem ports-01 a ports-02 nadefinovány různé sady portů. Proto jsme v konfiguračním souboru druhého uzlu nastavili, aby použil jinou sadu.

Spuštěcí skripty

Nyní si vytvoříme spouštěcí skripty, které nám nastartují jeden či druhý node.

V adresáři JBOSS_HOME\bin vytvoříme soubor node1.bat a vložíme do něj run -g dagi -u 228.1.2.199 -c node1.

V adresáři JBOSS_HOME\bin vytvoříme soubor node2.bat a vložíme do něj run -g dagi -u 228.1.2.199 -c node2

Uživatelé Linux samozřejmě *.sh.

Parametr g resp. určuje jméno partition. Partition defiuje rodinu uzlů, které jsou sdruženy v daném clusteru. Proto naše dva uzly mají stejné jméno partition neboť patří do stejného clusteru. Parametr u definuje UDP multicast adresu, na které si budou jednotlivé nódy v clusteru dorozumívat.

Multicast adresu si můžete zvolit jako jsem to udělal já (228.1.2.199), ale musí být pro všechny uzly vašeho clusteru stejná. Každopádně, pokud jste v rámci sítě a někdo z kolegů si bude také zkoušet rozjet JBoss v clusteru a nastaví si stejné jméno partition a stejnou multicast adresu, tak se připojí do Vašeho clusteru. Z tohoto důvodu si zvolte jméno partition a multicast adresu s rozmyslem.

Pro vyzkoušení konfigurace clusteru nejdříve spustíme node1.bat a až nastartuje tak node2.bat. Můžeme to udělat i opačně protože na pořadí v případě JBoss clusteru nezáleží, všechny uzly jsou si rovny. Není zde žádný řídící uzel, který by se musel nahazovat. V logu uzlu, který jsem spustili by mělo být po startu druhého uzlu něco podobného následujícímu.

       
22:48:52,250 INFO  [dagi] New cluster view for partition dagi (id: 1, delta: 1)
: [10.0.0.3:1199, 10.0.0.3:1299]
22:48:52,250 INFO  [dagi] I am (10.0.0.3:1199) received membershipChanged event:
22:48:52,250 INFO  [dagi] Dead members: 0 ([])
22:48:52,250 INFO  [dagi] New Members : 1 ([10.0.0.3:1299])
22:48:52,250 INFO  [dagi] All Members : 2 ([10.0.0.3:1199, 10.0.0.3:1299])       
       
    

Nastavení loadvbalanceru

Takže máme již nastavený cluster, ale před ten musíme posadit load balancer, který bude rozdělovat jednotlivé příchozí HTTP požadavky na uzly našeho clusteru. Následuje obrázek z je originální JBoss dokumentace a ilustruje funkci load balanceru v případě, že jeden z uzlů clusteru odejde.

The load balancer architecture for clustering

Protože JBoss používá jako HTTP server Tomcat, který podporuje mod_jk je možné jako load balancer použí HTTP server Apache.

Takže pusťmě se do toho!

Instalace

Doporučuji Vám sthánout kompatibilní verze mod_jk a Apache. Ja jsem stáhnul mod_jk-apache-2.2.3 a instalátor Apache 2.2.3. Při instalaci samotného Apache serveru není potřeba nic měnit, můžete použí defaultní hodnoty. Jenom si dejte pozor, že nemáte obsazený defaultní port 80 pro HTTP komunikaci např. jiným serverem (IIS) či jiným programem. Instalační adresář Apache je odkazován jako APACHE_HOME.

Po instalaci nakopírujte stahnutý mod_jk-apache-X.Y.Z.so do adresáře APACHE_HOME\modules a přejmenujte na mod_jk.so.

Apache konfigurace

Přidejte následující řádek Include conf/mod-jk.conf na konec souboru APACHE_HOME\conf\httpd.conf.

Vytvořte soubor APACHE_HOME\conf\mod-jk.conf a vložte do něj následující obsah.

     
# Load mod_jk module
# Specify the filename of the mod_jk lib
LoadModule jk_module modules/mod_jk.so
 
# Where to find workers.properties
JkWorkersFile conf/workers.properties

# Where to put jk logs
JkLogFile logs/mod_jk.log
 
# Set the jk log level [debug/error/info]
JkLogLevel info 
 
# Select the log format
JkLogStampFormat  "[%a %b %d %H:%M:%S %Y]"
 
# JkOptions indicates to send SSK KEY SIZE
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
 
# JkRequestLogFormat
JkRequestLogFormat "%w %V %T"
               
# Mount your applications
JkMount /application/* loadbalancer
 
# You can use external file for mount points.
# It will be checked for updates each 60 seconds.
# The format of the file is: /url=worker
# /examples/*=loadbalancer
JkMountFile conf/uriworkermap.properties               

# Add shared memory.
# This directive is present with 1.2.10 and
# later versions of mod_jk, and is needed for
# for load balancing to work properly
JkShmFile logs/jk.shm 
              
# Add jkstatus for managing runtime data
<Location /jkstatus/>
    JkMount status
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Location>         
     
    

Vytvořte soubor APACHE_HOME\conf\uriworkermap.properties a vložte do něj následující obsah.

    
# Simple worker configuration file

# Mount the Servlet context to the ajp13 worker
/jmx-console=loadbalancer
/jmx-console/*=loadbalancer
/web-console=loadbalancer
/web-console/*=loadbalancer

/test/*=loadbalancer
/test=loadbalancer    
    
    

Tím je řečeno, které sub cesty budou směrovány load balancerem. Jinýmy slovy jakýkoliv HTTP požadavek na http://hostname/jmx-console nebo http://hostname/web-console a nebo http://hostname/test doručí na jeden z uzlů v našem clusteru. Aplikace jmx-console a web-console jsou v JBossu standardně. Pro naše budoucí testovací účely jsme připravil ješte mapování aplikace test. Pokud si to budete chtít vyzkoušet nějakou aplikaci, pak stačí aby byla v JBossu deploynutá v kontextu test případně si samozřejmě můžete namapovat vlastní existující aplikaci. Stačí pouze uvést její kontext.

Dále (už se blížíme do finále) je potřeba vytvořit soubor APACHE_HOME\conf\workers.properties a do něj vložit následující obsah.


# Define list of workers that will be used
# for mapping requests
worker.list=loadbalancer,status

# Define Node1
# modify the host as your host IP or DNS name.
worker.node1.port=8109
worker.node1.host=localhost 
worker.node1.type=ajp13
worker.node1.lbfactor=1
worker.node1.cachesize=10

# Define Node2
# modify the host as your host IP or DNS name.
worker.node2.port=8209
worker.node2.host=localhost
worker.node2.type=ajp13
worker.node2.lbfactor=1
worker.node2.cachesize=10

# Load-balancing behaviour
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2
worker.loadbalancer.sticky_session=1
#worker.list=loadbalancer

# Status worker for managing load balancer
worker.status.type=status    
    
    

Pozn: všiměte si hodnoty worker.node1.port a worker.node2.port. To jsou porty, na kterých poslouchá JK konektor JBosse resp. Tomcatu.

Konfigurace Tomcatu uvnitř JBosse

Poslední věc, kterou musíme udělat je nastavení Tomcatu a jeho Mod_JK.

V souboru JBOSS_HOME\server\node1\deploy\jbossweb-tomcat55.sar\server.xml přidejte do elementu Engine atribut jvmRoute="node1". Ten potom vypadá následovně

   <Engine name="jboss.web" defaultHost="localhost" jvmRoute="node1">
   

V souboru JBOSS_HOME\server\node2\deploy\jbossweb-tomcat55.sar\server.xml přidejte do elementu Engine atribut jvmRoute="node2". Ten potom vypadá následovně

   <Engine name="jboss.web" defaultHost="localhost" jvmRoute="node2">
   

V souboru JBOSS_HOME/server/node1/deploy/jbossweb-tomcat55.sar/META-INF/jboss-service.xml a JBOSS_HOME/server/node2/deploy/jbossweb-tomcat55.sar/META-INF/jboss-service.xml změňte obsah elementu attribute s atributem name a hodnotou UseJK na true.

   
<attribute name="UseJK">true</attribute>

A to je vše, nyní máme cluster připravený včetně loadbalanceru.

V případě nejakých nejasností doporučuji konzultovat postup s JBoss originální dokumentací. Konkrétně sekce 16.5. HTTP Services v rámci kapitoly 16. clustering.

Zkouška clusteru

  • nastartujte Apache
  • nahoďte uzel 1
  • nahoďte uzel 2
  • otevřete prohlížeč a zadejte adresu http://localhost/web-console/. Pokud Vám Apache poslouchá na jiném portě než 80, tak jej musíte zadat. Webová konzole je defaultni chráněná jménem a heslem, které jste zadali v jednom z instalačních kroků JBosse.
  • Na stránce webové konzole, je v pravém rámu informace Running config: 'XXX'. Pokud několikrát za sebou zadáte adresu http://localhost/web-console/ a mezi každým požadavkem si smažete cookies a nebo použijete jinou instanci prohlížeče tak by jste se měli čas od času dostat na jiný uzel. Tedy bude se měnit nápis Running config: 'Node1' za Running config: 'Node2' a naopak.

Pokud se Vám za žádných okolností nepovede, že prohlížeč nepujde alespoň někdy (po vymazání cookies či puštěním jiné instance prohlížeče) na jiný uzel, pak je něco špatně. V opačném případě gratuluji, máte úspěšně nastavený a fungující JBoss cluster. O tom proč jsme mazali cookies aneb sticky session a jak udělat aplikaci, která bude automaticky replikovat HttpSession zase příště.

Tenhle článek by nikdy nevzniknul nebýt Gala Mardera VP R&D z firmy InterBit.

Thank you very much, you are the real Java champion!