Apache, Tomcat cluster ( load balancing using mod_jk )
Örneğin 12 Gb ram bulunan bir alette tomcat çalıştırdığınız da Java en fazla 2gb ram kullanabildiği için hiç bir esprisi olmuyor. Ayrıca tomcat apache gibi yuzlerce process’i bir arada işleyebilme konusunda pek başarılı değil. Bu sebeple bir cluster yapısı kurarak aynı makina uzerinde birden fazla tomcat calistirmanız gerekiyor.
Cluster yapısında dağıtıcı olarak kullanabileceğiniz bir çok yapı var. En çok tercih edilenler Apache’nin modülleridir. Ben bu yazıda Apache’nin JK modöülünü tercih ettim.
İşlemler sırasıyla aşağıdaki gibi olacaktır. Kurulumu linux/debian üzerinden yaptım. İşletim sistemine göre komutlar değişecektir.
1. JDK kurulumu yapılır:
# apt-get install sun-java6-jdk sun-java6-jre
2. apache2 kurulumu yapılır.
# apt-get install apache
3. apache2 uzerinde JK modül kurulur
# apt-get install libapache2-mod-jk
4. /etc/apache2/mods-available dizini altında jk.conf yatarılır ve aşağıdaki gibi configure edilir:
< IfModule mod_jk.c>
JkWorkersFile /etc/apache2/workers.properties
JkLogFile /var/log/apache2/mod_jk.log
JkLogLevel info
JkLogStampFormat “[%a %b %d %H:%M:%S %Y] ”
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat “%w %V %T”
JkMount /* loadbalancer
JkMount /UnityWebTier/* loadbalancer
< /IfModule>
Burada workers dosyasının yerini de belirtiyoruz.
“workers.properties” dosyasında yukarıda belirtilen yerinde aşağıdaki gibi olmalıdır:
workers.tomcat_home=/var/tomcat
workers.java_home=cd
worker.list=loadbalancer
# default properties for workers
worker.template.type=ajp13
worker.template.port=28009
worker.template.lbfactor=50
worker.template.connection_pool_timeout=600
worker.template.socket_keepalive=1
worker.template.socket_timeout=300
# properties for instance1
worker.instance1.reference=worker.template
worker.instance1.port=8011
worker.instance1.host=localhost
# properties for instance2
worker.instance2.reference=worker.template
worker.instance2.port=8012
worker.instance2.host=localhost
# properties for instance3
worker.instance3.reference=worker.template
worker.instance3.port=8013
worker.instance3.host=localhost
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=instance1,instance2, instance3
worker.loadbalancer.sticky_session=True
5. Tomcat6 http://tomcat.apache.org/download-60.cgi adresinden downlod edilir. Kaç adet tomcat node çalıştırılacaksa hepsi bir dizine çoğaltılır. Biz yukarıdaki workers dosyasında 3 adet node çalıştıracağımızı belirlemiştik.Tomcat ların kopyalanacağı dizin de dizin adları da aslında yukarıda belirtildi. “workers.tomcat_home” ile belrtilen “/var/tomcat” dizini altına “instance1”, “instance2” ve “instance3” alt dizinleri şeklinde kopyalanmalıdır.
Sonrasında her node için birbiriyle çakışmayacak şekilde port ayarları yapılır. Tomcat port ayarları conf dizini altında server.xml dosyasındadır.
“instance1” için :
< Server port="8005" shutdown="SHUTDOWN"> —> < Server port="8001" shutdown="SHUTDOWN">
< Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> —> < Connector port="8011" protocol="AJP/1.3" redirectPort="8441" />N”>
“instance2” için:
< Server port="8005" shutdown="SHUTDOWN"> —>
< Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> —> < Connector port="8012" protocol="AJP/1.3" redirectPort="8442" />N”>
“instance3” için:
< Server port="8005" shutdown="SHUTDOWN"> —>
< Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> —> < Connector port="8013" protocol="AJP/1.3" redirectPort="8443" />N”>
Eğer daha fazla node varsa bu şekilde birer artırılarak devam edilir.
6. Apache’deki virtual host tanımında workers list’imizi belirtmeliyiz.
“/etc/apache/”sites-available/default” dosyasının yeni hali aşağıdaki gibi olmalıdır:
< VirtualHost *:80>
ServerAdmin batur@bilkent.edu.tr
JkMount /* loadbalancer
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
< /VirtualHost>
Bu sekilde butun dosya dizinleri loadbalancer a gonderdik. Eğer özel bir dizini göndereceksiniz.
JkMount /xyz/* loadbalancer
7. Son olarak apache ve tomcat instance’lar başlatılır.
# /etc/init.d/apache2 restart
# /var/tomcat/instance1/bin/startup.sh
# /var/tomcat/instance2/bin/startup.sh
# /var/tomcat/instance3/bin/startup.sh
Artık gelen requestler direk 80 port üzerinden 3 adet tomcat ‘e dağılabilecektir.
Geçmiş olsun… 🙂
I used to be suggested this web site via my cousin. I’m no longer sure whether or not this post is written through him as nobody else recognise such distinct approximately my difficulty. You’re wonderful! Thank you!
Eline sağlık çok güzel bir yazı olmuş. tamda merak ettiğim konuyu ayrıntılı bir şekilde anlatmışsın.
tebrikler ve paylaşım için çok teşekkürler