Apache Web Server, Load Balance & Clustering ve Site Routing – Bölüm 2

Konu 2: Load balancing yönetimi sağlayan bir yapı tasarlamayı düşünüyorsunuz.

Bir uygulamanız var. (seferOver v2.0) Bu Tomcat veya JBoss Application Server altında çalışıyor. Bir gün stabil çalışmayacak hale gelene kadar (memory leak – genellikle geliştirici hatasından kaynaklanan overflow error | https://plumbr.eu/  bir göz atın.) çok istek geldiğini gördünüz, uygulama çok trafik yükü altında kaldı ve dikey yükselmenin (bandwidth genişletme, yeni trafik alanı satın alma, memory upgrade, cpu upgrade) yetersiz olduğunu, yatay yükselmeye ihtiyacınız olduğunu farkettiniz.

Uygulamanının içinde session yönetimi yapılmalı ve bearer token kullanmıyor / kullanamıyorsunuz (http://en.wikipedia.org/wiki/OAuth) (Bu durumda MemCache veya EhCache kullanılmalı)

Yatay genişleme için birden fazla (vm veya dedicated fark etmez – Artık bizim için dedicated sunucu ayırımı yok. Hepsi aynı.) sunucuya sahipsiniz. Uygulama sunucunuzu ve uygulamanızı her birine kurup eşit veya isteğiniz oranlarda istek yükü paylaşımı yapmak (process yükü değil, request – response yükü) istiyorsunuz.

Uygulamanız sadece servis ve arayüz olarak değil dosya – lisans üretme yeteneğine sahip ve her istediğinizde her makineden doğru yanıt gelmesini istiyorsunuz… (bunun anlatacağım konuyla direkt olarak ilgisi yok. Bu konu için memcache veya ehcache kullanılmalı.)

Gereken Malzemeler:

  • Birden fazla server (test için aynı server üzerinde de yapabilirsiniz)
    Internal Lan Ip’leri 10.11.12.{13 , 14 ve 15} olan makineleri kullandım.
  • Apache Web Server (10.11.12.13)
  • Apache Web Server için mod_jk.so
  • Birden fazla Tomcat (tomcat1: 10.11.12.14 ve tomcat2: 10.11.12.15)
  • Bir uygulama. (uygulamanız kendi içinde tomcat veya jboss taşıyabilir halde de olabilir. Bu durum için farklı bir konfigurasyona gerek duyulmamaktadır.)

Uygulanan Ortam:

  • Centos 64 bit server (test amaçlı olduğu için önce 1 server üzerinde çalıştım. Sonradan farklı makinelerde test için workers.properties dosyasında localhost değerlerini internal lan IP’leri ile update etmem yeterli oldu)
  • text editör olarak nano,
  • iptables servisi,
  • Apache web server’ın yönetimi ele alması için SELinux ayarlarına erişim ve
  • Sistemi restart edebilmek için root kullanıcı yetkisi.

ve gelelim Yapılan İşlemlere:

  • Apache web server 80 portunda çalışacak. Bunda sorun yok.
    service httpd start | restart | stop ile yönetebiliyoruz. ok
  • Tomcat1‘ in conf/server.xml dosyasında aşağıdaki parametreyi http protokolü ile bu tomcat’e erişilmesini istemediğimden comment içine aldım.
<!-- <Connector port="8081" protocol="HTTP/1.1"
 connectionTimeout="20000"
 redirectPort="8443" />
 -->
  • Şimdi ajp protokolünü devreye sokalım. Tomcat1 için 8081 portu kullanılsın. Burda redirectPort parametresine karışmadım. Sadece port parametresini değiştirdim. Tomcatimiz apache’ye bu port üzerinden ajp protokolü ile haberleşecek. http üzerinden direkt tomcat’e erişme imkanımız, yukarıdaki blok comment’e alındığından mümkün değil. Eğer http de açık olsun isterseniz (test sürecinde) Http protokolü ile ajp protokolünü aynı porta vermemelisiniz.
 <Connector port="8081" protocol="AJP/1.3" redirectPort="8443" />
  • Aynı makinede 2 tomcat varsa ve birini kapatmanız gerektiği durumda diğerini etkilememesini – çakışmamasını istiyorsanız shutdown portunu da ayarlamanız gerekmektedir.
    Port değişimi:
 <Server port="8005" shutdown="SHUTDOWN">
  • Worker tanımlaması:Not: Eğer tomcat1 deki worker tanımlaması buna yapılırsa ağırlık ve istek önceliği bu sisteme verilecek. Hangisinin öncelikli yanıt vereceğini, hangisinin IDLE olarak bekleyeceğini jvmRoute parametresi belirliyor.
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="worker1">
  • İçerik Tanımlaması:

Evet. Burası sıkıntılı. Şimdi ben uygulamamın adını myapp olarak ayarladım diyelim. Normal şartlarda tomcat’te “/myapp” veya “/”(root) path de çalıştırabilme imkanım var. Bunu zaten biliyoruz. Routing konfigurasyona geldiğimizde ise, sadece /myapp altında çalıştırma imkanım kalıyor. Ben root ‘ta çalıştırma imkanı bulamadım. Benim asıl uygulamam routing konfigurasyonunda yaptığım ayarlamalar ile root’ta çalışmadı. Belki de ben becerememiş olabilirim.

mod_proxy ile ve url redirect komutları ile /myapp dizinindeki uygulamayı root’ta göstermeyi de, virtual path yaratmayı da denedim. Belki de uygulamamdaki bir problemden kaynaklı olarak bunu becerememiş olabilirim. Çünkü küçükcük ufacık tefecik programlarla bunları becerebildim; benim kurmaya çalıştığım uygulama spring ile harmanlı olduğu için baharatları gaz yapmış olabilir (:

<Context path="/myapp" docBase="myapp" debug="0" privileged="true" />
  • Tomcat2 için yukardaki işlemleri tekrarlıyoruz
    jvmRoute=”Worker1″ konfigurasyonunu tomcat2 için yapmıyoruz. Ajp portunu aynı makinede ise 8082 yapabilirsiniz. Aynı makine üzerinde olacaksa port farklı olmalıdır. Farklı makine üzerinden apache web server’a request/response gönderecekse farklı port olmasına gerek olmamaktadır. Hatta bu durumda her ikisi de 80 bile olabilir yani.
  • Apache Web Server yüklenmiş olması gerekliliğini atlamış olabilir miyim – evet.
yum install httpd
  • Apache Web Server yüklemesinden sonra /etc/httpd/conf/httpd.conf dosyasında commentli olarak aşağıdaki yazıya benzer birşey bulunmaktadır. Onu pageDown ile gezerek bulup commentsiz olarak şunu yapıştırıyoruz
ServerName localhost:80
  • /etc/httpd/modules/ dizinine mod_jk.so dosyası kopyalandı
  • /etc/httpd/conf/httpd.conf dosyası içinde, diğer LoadModule işlemlerinin sonuna şu ayarlar yapıldı:

Burada Jk mount ayarlamalarım var. Eğer uygulamanızı root path’de çalıştırabiliyorsanız aşağıdaki gibi olacak. Eğer root path da çalışmıyorsa mecbur sonu yıldızlı isminin olduğu path’den çağırılacak. ” JkMount /myapp* myapp ”

#SEFER BEGIN
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/conf/workers.properties
#JkLogFile /etc/httpd/conf/mod_jk.log
#JkLogLevel info
#JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMount /status status 
JkMount /* myapp
JkMountCopy On
#SEFER END
  • Apache için /etc/httpd/conf/ dizinine yeni bir workers.properties dosyası oluşturuldu:
worker.list=loadbalancer,status
 worker.worker1.port=8081
 worker.worker1.host=10.11.12.14
 worker.worker1.type=ajp13
 worker.worker2.port=8081
 worker.worker2.host=10.11.12.15
 worker.worker2.type=ajp13
 worker.worker1.lbfactor=1
 worker.worker2.lbfactor=1
 worker.loadbalancer.type=lb
 worker.loadbalancer.balance_workers=worker1,worker2
 worker.status.type=status

Burada Tomcatler için tanımlanan portlar worker olarak girildi

lbfactor ile yük oranı 3:1, 4:2 tarzında (1:1) tanımlandı.

  • Centos sunucusu için SELINUX ayarı kapatıldı.

/etc/sysconfig/selinux dosyası için şu yönergeler izlenebilir.

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled. ***bununla değiştirdim.**
SELINUX=permissive
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted
# SETLOCALDEFS= Check local definition changes
SETLOCALDEFS=0

  • Sistem restart edildi
  • Httpd servisi başlatıldı, tomcatler çalıştırıldı.

İşlemler bu kadar. Yazının başında bahsettiğim ihtiyaçları karşılayabilecek yapıyı kurduk. Balance ayarlarını kullacağınız sistemlerin ağ ve donanım hızlarına göre ayarlayabilirsiniz. Tertemiz oldu. Hepsi bukadar.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s