JBoss Clustering ve Session Replication
clustering, jboss, j2ee, java February 17th, 2009
Selam sevgili java manyakları. Uzun uğraşlar sonucu bir büyük dert olan sunucular arası session paylaşımı problemini JBoss ile çok kolay bir şekilde çözmeyi başarmış bulunuyoruz.
Örneğin 2 tane çalışan JBoss’umuz var ve aynı web uygulamaları üzerlerinde koşuyor, load balancer’ımız da (örneğin modjk) gelen istekleri bu sunucular arasında paylaştırıyor. Derken bir problem oluyor sunuculardan birisi kapanıyor ya da daha sık olabilecek birşey, deployment yapmak için sunuculardan birisini kapatmamız icap ediyor misal, ne oluyor bu durumda? O sırada sunucuda tutulan tüm session bilgisi kaybediliyor, yani login olmuş kullanıcılar siteden atılıyor!
Bu durumu çözmek için kolları sıvadık ve JBoss üzerinde biraz araştırma yaptık. Meğersem JBoss tayfası bu olayları çok çok önceden düşünüp yapmışlar bize de vermişler ama haberimiz yokmuş. Bakalım neymiş…
JBoss 4.2.2 sürümünü baz alarak, <JBOSS_HOME>/server/ dizini altında “all” isimli bir config bulunuyor. Bu config “default” configinden farklı olarak zaten cluster için varsayılan ayarları içeriyor. Bizim yapmamız gereken ufak değişiklikler var. Öncelikle “all” configinin bir kopyasını alıyoruz ve ona yeni bir isim veriyoruz. 2 sunucumuz olduğunu varsayarsak birincisine node1 ikincisine node2 diyelim. <JBOSS_HOME>/server/node1/deploy/jboss-web.deployer/server.xml içerisinde
<Engine name=”jboss.web” defaultHost=”localhost”>
satırını bulup,
<Engine name=”jboss.web” defaultHost=”localhost” jvmRoute=”node1″>
şeklinde jvmRoute belirtiyoruz. Daha sonra
<JBOSS_HOME>/server/node1/deploy/jboss-web.deployer/META-INF/jboss-service.xml içerisinde
<attribute name=”UseJK”>false</attribute>
parametresini true yapıyoruz,
<attribute name=”UseJK”>true</attribute>
JBoss tarafındaki ayarlar bu kadar. Uygulamamız içerisinde ise web.xml içerisinde
<distributable />
satırını eklememiz gerekiyor. Ayrıca jboss-web.xml dosyası içerisinde şu ayarları ekliyoruz:
<jboss-web>
<replication-config>
<replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger>
<replication-granularity>SESSION</replication-granularity>
<replication-field-batch-mode>true</replication-field-batch-mode>
</replication-config>
</jboss-web>
Bunun dışında session’da tutacağımız her şeyin Serializable olmasına dikkat etmemiz gerekiyor.
Evet, şimdi JBoss’u çalıştırırken bu ayarlarla çalışması için -c parametresini kullanmamız gerekiyor, örnek:
<JBOSS_HOME>/bin/run.sh -c node1 -b 192.168.1.1
Bu şekilde çalışan JBoss’lar aynı network grubu içerisindelerse birbirlerini görüyorlar. Bu cluster yapısında load balancer’dan gelen istekler JBoss’lardan birisinin kapanması durumunda öteki JBoss’a yönlendiriliyor, arka planda session bilgisi replike edildiği için kullanıcı farklı JBoss’a düşse de aynı session bilgisi ile devam ediyor.
Siz de bu yapıyı test edecekseniz en basidinden load balancer olarak modjk’ya ihtiyaç duyabilirsiniz. Bununla ilgili olarak şuradan bilgi edinebilirsiniz.
Ayrıca JBoss clustering vs ile ilgili ayrıntılı bilgiyi buradan bulabilirsiniz. İsterdim ki en ince ayrıntısına kadar gireyim ancak ben de daha yeni öğrendim, üzerinde biraz daha çalışmaya ihtiyaç var ama kabaca bu şekilde yapılıyor :)
hepinize bol cluster’lı günler dilerim…
Social Bookmarking
February 17th, 2009 at 23:06
[…] http://javamanyaklari.com/2009/02/jboss-clustering-ve-session-replication.jsp No comments for this entry yet… […]