11 February 2009

Load balancing dengan Apache 2.11 dan Tomcat 5.5

Setelah pada waktu yang lalu kita membahas autentikasi dengan realm pada Tomcat. Kali ini kita akan mencoba load balancing dengan Apache 2.11 dan Tomcat5.5. Load balancing adalah suatu trik yang bisa dilakukan pada sebuah environment server untuk menghindari crash-nya suatu server akibat request terlalu banyak yang diarahkan ke server tsb.

Jika kita gambarkan secara sederhana, pada prosesnya, ketika request diarahkan ke sebuah server maka dengan segera server tersebut akan memproses request tersebut dan kemudian mengembalikan hasil proses itu kepada requestor-nya. Pada saat server sedang memproses request, maka request yang lain akan menunggu hingga request yang sebelumnya selesai diproses oleh server. Jika suatu penungguan request proses terlalu lama biasanya server akan mengembalikan HTTP Status Code 504(Gateway Timeout).

Untuk menanggulangi masalah tersebut dibutuhkan suatu trik tersendiri agar masalah tersebut tidak terjadi pada Sistem Environment Server. Salah satunya adalah dengan menggunakan prinsip load balancing. Perhatikan gambar berikut ini:

Pada gambar ini kita bisa melihat bahwa proses request akan di-forward ke server-server lain. Untuk kemudian request tersebut diproses dan akhirnya dikembalikan ke Gateway Server. Selain itu kelebihan lain skenario ini adalah jika salah satu server processor ini crash dikarenakan suatu hal yang tidak terduga maka request akan tetap bisa dilayani oleh server server processor lainnya.

Sementara kekurangannya adalah jika Gateway Servernya crash maka praktis semua request pun akan tidak terprocess dengan baik. Oleh karena itu dibutuhkan keputusan yang tepat dalam hal menentukan Gateway Server ini terbuat dari apa.

Dengan skenario sistem environment server semacam ini paling tidak kita sudah memperkecil potensi crash sistem environment server kita.

Dalam teknologi J2EE, skenario tersebut bisa diimplementasikan dan mungkin saat ini sudah banyak di implementasikan. Diperusahaan tempat saya bekerja pun skenario ini memang dipakai, untuk menangani request yang memang dalam satu detik tidak bisa dibilang sedikit.

Dengan tidak perlu berpanjang-panjang teori, kita akan langsung mencoba mengimplementasikan skenario tersebut. Kita akan mencoba membangun sebuah Sistem Environment Server dimana dalam sistem tersebut kita punya 1 Gateway Server dan 2 Server Processor. Perhatikan gambar skenario kita kali ini:

Pada gambar skenario kita kali ini, kita memasang Apache2 sebagai Gateway Servernya, dan Tomcat5.5 sebagai Server processornya. Apache2 kita pilih karena Apache2 pada dasarnya adalah sebuah web server yang ringan, dan mudah konfigurasinya. Sementara server processornya kita pilih Tomcat5.5 sebagai sebuah servlet container yang akan memproses semua request-request yang diarahkan. Kemudian pada gambar tersebut juga kita melihat bahwa kedua server processor mengakses satu web aplikasi yang sama. Seperti yang sama-sama kita ketahui, dalam teknologi J2EE terkadang ada beberapa web-aplikasi yang kita buat untuk kemudian di deploy pada Application Server atau pun Servlet Container seperti Tomcat diatas, memerlukan restart agar web aplikasi yang baru saja kita deploy dapat berjalan dengan optimal. Pada saat salah satu server kita restart dan server itu membutuhkan waktu untuk bisa UP dengan normal semua request akan di alihkan ke server yang masih hidup, maka request akan tetap terlayani dengan baik karena gateway mengarahkan request ke server prosessor yang masih hidup.

Kita langsung saja mengimplementasikan skenario tsb. Oh ya kali ini kita akan mencobanya di dalam operating sistem Windows, yang penting kita paham dulu bagaimana konsep skenario load balancing kita ini bekerja. Untuk itu silahkan download Apache2.11 disini, dan Tomcat5.5 disini.

Sebelum kita melakukan instalasi ada beberapa hal yang perlu kita persiapkan sebagai skets dari skenario kita, skets itu adalah sebagai berikut.

  1. Server Gateway akan berjalan pada HTTP port 80.

  2. Server Processor 1 akan berjalan pada HTTP port 8080.

  3. Server Processor 2 akan berjalan pada HTTP port 9090.

  4. Webapps cuma hanya ada pada Server Processor 1 dan tidak perlu ada pada Server Processor 2.

  5. Webapps Server Processor 2 akan diarahkan ke folder dimana webapps pada Server Processor 1 berada.

  6. ModJK Apache module akan digunakan sebagai forwarder request ke Tomcat.

Untuk lebih cepatnya kita akan skip instalasi masing-masing server ke dalam sistem operasi kita. Kita akan langsung melihat masing masing konfigurasi server. Dan jangan run dulu semua atau masing-masing server tsb.

Pastikan semua server berjalan pada HTTP Port yang sesuai dengan skenario

Untuk melakukan ini mari kita lihat konfigurasi pada file Gateway Server atau Apache2.11. file konfigurasi ini bernama httpd.conf yang terletak pada folder <ApacheInstalasionFolder>\conf\, pastikan pada file ini ada baris yang seperti ini:

Listen 80

Ini artinya Apache2.11 kita akan menggunakan HTTP Port 80 sebagai portnya.

Kemudian untuk masing-masing Tomcat sebagai Server Processornya pastikan http Port yang digunakan nanti sesuai dengan skenario diatas. Pada file konfigurasi masing-masing Tomcat yaitu server.xml yang ada pada folder <TomcatInstalation>\conf\ pastikan baris ini sesuai dengan skenario:

<Connector port="9090" maxHttpHeaderSize="9192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />

Connector port masing-masing Tomcat harus sesuai dengan skenario kita. Setelah semuanya kita anggap ok, maka mari kita jalankan masing-masing server tersebut. Jika tidak ada error yang muncul maka seharusnya semua request dibawah ini tidak menampilkan pesan error:

http://localhost/ --- cek Apache2.11 berjalan pada HTTP Port 80

http://localhost:8080/ --- cek apakah Tomcat5.5 berjalan pada HTTP Port 8080

http://localhost:9090/ --- cek apakah Tomcat5.5 berjalan pada HTTP Port 9090

jika semua alamat tersebut tidak menampilkan pesan error pada browser. Maka semua konfigurasi yang kita buat sudah benar.

Menginstall ModJK pada Apache2.11

Untuk menghubungkan Apache2.11 ini dengan Tomcat, Apache memerlukan suatu library bernama ModJK. Silahkan mengunduh ModJK untuk apache anda disini. Setelah kita mendownload module Apache yang ini. Letakkan file ModJK yang kita download pada folder <ApacheInstalationFolder>\modules. Ubah nama file mod_jk-1.2.27-httpd-2.2.10.so menjadi mod_jk.so Kemudian lakukan pengeditan kembali pada httpd.conf dengan cara menambahkan baris ini pada file httpd.conf.

# ModJK Configuration
LoadModule jk_module modules/mod_jk.so
Include conf/mod_jk.conf
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log

Kemudian langkah selanjutnya adalah membuat dua buah file kosong dengan nama mod_jk.conf dan worker.properties di dalam folder <ApacheInstalationFolder>\conf. Dua file ini adalah file-file yang nantinya akan kita gunakan untuk menempatkan konfigurasi-konfigurasi keterhubungan Apache dengan Tomcat.

Setelah itu, kita bisa me-restart Server Apache kita. Jika Apache bisa berjalan normal setelah kita melakukan restart, maka artinya konfigurasi ModJK pada Apache telah selesai. Selain itu akan terdapat juga file log baru pada folder <ApacheInstalationFolder>\logs, file itu bernama mod_jk.log seperti yang telah kita konfigurasi pada file httpd.conf.

Mengkonfigurasi kedua Tomcat untuk mengakses satu webapps saja.

Saat ini kita punya dua Tomcat, agar tidak bingung, kita beri nama Tomcat pertama dengan nama Tomcat-8080 dan Tomcat kedua kita beri nama Tomcat-9090. pemberian nama ini bisa juga kita lakukan secara real dengan cara mengubah nama folder Tomcat tersebut.

Pada gambar skenario diatas kita hanya punya satu folder Web Application yang di-share untuk bisa di akses oleh dua Tomcat sekaligus. Kita hanya akan memakai folder webapps yang ada pada Tomcat-8080, sementara untuk folder webapps yang ada pada Tomcat-9090 kita hapus saja. Kemudian konfigurasi Tomcat-8080 tidak berubah pada baris berikut ini.

<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">

Kita bisa melihat pada konfgurasi Tomcat-8080 ini bahwa appBase (Application Base) pada Tomcat-8080 ini tetap pada webapps dilokasi yang yang sama. Sementara untuk Tomcat-9090 setting barisnya harus berubah menjadi seperti dibawah ini:

<Host name="localhost" appBase="..\Tomcat-8080\webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">

Kita lihat pada konfigurasi Tomcat-9090 ini, appBase-nya mengarah pada webapps milik Tomcat-8080. dengan catatan bahwa masing-masing Tomcat ini berada dalam satu lokasi yang sama, misal : Tomcat-8080 ada di C:\ProgramFiles\Tomcat-8080 dan Tomcat-9090 berada pada lokasi C:\ProgramFiles\Tomcat-9090.

Setelah kedua Tomcat tersebut telah selesai kita konfigurasi, kita buat sebuah file jsp biasa yang berisi print out hello world, dan letakkan file jsp tersebut pada folder webapps di Tomcat-8080, kemudian lakukan restart pada kedua Tomcat tersebut, kemudian cobalah untuk mengakses file tersebut dengan menggunakan browser, tapi dengan dua request http yang berbeda seperti dibawah ini:

http://localhost:8080/file_jsp_hello_world.jsp - cek HTTP Port 8080

http://localhost:9090/file_jsp_hello_world.jsp - cek pada HTTP Port 9090

jika keduanya bisa diakses lewat browser, artinya konfigurasi single webapps kita telah berhasil. Dan kita bisa melangkah ke tahap berikutnya.

Mengarahkan Apache ke kedua Tomcat menggunakan konfigurasi ModJK.

ModJK adalah suatu module Apache yang mampu mem-forward request dari Apache ke Application Server atau Servlet Container seperti Tomcat. ModJK juga bekerja sebagai sebuah Load Balancer, ModJK akan secara otomatis mengarahkan request ke suatu Application Server atau Servlet Container yang tidak sibuk. ModJK bekerja pada protokol AJP. Pada Tomcat 5.5, protokol AJP yand didukung sampai dengan versi 1.3.

Untuk mengaktifkan protokol AJP pada Tomcat, cukup mengedit file server.xml menjadi seperti contoh berikut ini:

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009"
enableLookups="false" redirectPort="2543" protocol="AJP/1.3" />

Kita akan memakai AJP-Port 8009 untuk Tomcat-8080 dan AJP-Port 8007 untuk Tomcat-9090, sekarang mari kita modifikasi kembali file server.xml pada masing-masing Tomcat sesuai dengan skenario protokol AJP tersebut. Kemudian kita restart kembali masing-masing Tomcat, dan lakukan cek terhadap protokol AJP yang telah kita konfigurasi tadi. Cara mengeceknya dengan menggunakan command netstat –an pada console windows seperti gambar berikut ini.

Jika pada konsol sudah muncul protocol ajp seperti gambar diatas, maka artinya Tomcat-Tomcat kita sudah bisa berjalan pada protokol AJP tersebut.

Sekarang kita akan melakukan konfigurasi pada ModJK yang ada pada Apache supaya semua request bisa diarahkan ke protokol AJP Tomcat tersebut. Buka file worker.properties kosong yang telah kita buat sebelumnya tadi, file ini berada pada lokasi <ApacheInstallationFolder>/conf. Kemudian tambahkan baris-baris berikut ini pada file tersebut.

#
# You should configure your environment slash... ps=\ on NT and / on UNIX
# and maybe something different elsewhere.
#
ps=\

# define worker list
worker.list=Tomcat-balancer
# ----------------- Tomcat-8080 worker definition -----------------
worker. Tomcat-8080.port=8009
worker. Tomcat-8080.host=localhost
worker. Tomcat-8080.type=ajp13
worker. Tomcat-8080.lbfactor=1

# ----------------- Tomcat-9090 worker definition -----------------
worker. Tomcat-9090.port=8007
worker. Tomcat-9090.host=localhost
worker. Tomcat-9090.type=ajp13
worker. Tomcat-9090.lbfactor=1

# ----------------- core load balancer worker definition -----------------
worker.Tomcat-balancer.type=lb
worker.Tomcat-balancer.balanced_workers=Tomcat-8080, Tomcat-9090
worker.content-balancer.sticky_session=1

Sedikit pemahaman pada konfigurasi diatas. Oleh karena kita memakai Sistem Operasi Windows maka nilai ps di konfigurasi dengan “\”, kemudian kita membuat dua worker disana yaitu Tomcat-8080 dan Tomcat-9090, masing-masing worker tersebut kemudian kita konfigurasi sesuai dengan port protokol AJP yang telah kita konfigurasi sebelumnya pada masing-masing server.xml yang dimiliki Tomcat masing-masing.

Kemudian kita lakukan satu konfigurasi lagi untuk mengatur web-aplikasi apa saja yang bisa di forward oleh Apache, untuk konfigurasi ini kita akan melakukakannya dalam file mod_jk.conf yang juga terletak pada lokasi yang sama dengan worker.properties tsb. Tambahkan baris-baris ini pada file mod_jk.conf.

# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"

# Send JSPs for context /examples to worker named worker1
# Static files
JkMount /* Tomcat-balancer

Mari kita pahami juga baris-baris yang ada pada file mod_jk.conf ini. Pada baris kedua, kita tentukan format untuk log mod_jk ini, sementara untuk baris ke empat kita meminta supaya apache memforward semua termasuk URI dan Directories request, kemudian baris ke enam adalah konfigurasi format log mod_jk untuk request yang masuk dan melalui mod_jk ini. Dan baris yang terkakhir adalah baris dimana kita mengkonfigurasi webapps apa saja yang bisa di akses oleh Apache melalui ModJK ini. Jika kita membuat konfigurasi JkMount seperti contoh diatas, artinya kita membuat semua webapps milik Tomcat bisa diakses oleh apache. Kita bisa membuat spesifik webapps tertentu saja untuk bisa di akses Apache seperti contoh berikut :

……
……
# Send JSPs for context /examples to worker named worker1
# Static files
JkMount /manager/* Tomcat-balancer
JkMount /test/* Tomcat-balancer
JkMount /examples/* Tomcat-balancer
……..
……..

Konfigurasi diatas adalah contoh dimana hanya beberapa webapps tertentu saja yang bisa di akses oleh Apache, jadi ketika user me-request aplikasi selain yang ada pada list mod_jk.conf ini maka Apache akan mengembalikan http status 404 (File Not Found) ke user, meski sebenarnya aplikasi yang di-request oleh user tersebut memang ada dalam webapps Tomcat.

Selesai sudah semua konfigurasi load balancing Apache dengan Tomcat kita kali ini. Silahkan kita test semua konfigurasi tersebut dengan cara me-restart masing-masing Server kita, baik apache maupun Tomcat. Berdasarkan pengalaman yang saya alami, kita harus me-restart kedua Tomcat lebih dulu sebelum merestart Apache, artinya kita harus membuat Tomcat bisa listening dahulu sebelum Apache yang menjadi konsumernya bisa memforward request-request ke masing-masing Tomcat.

Dengan konfigurasi diatas kita sudah bisa membuat sebuah Server Environment Sistem dengan kelebihan-kelebihan tersendiri. Dan konfigurasi tersebut masih memungkinkan untuk bisa di modifikasi dan dilakukan ekplorasi lebih dalam lagi. Silahkan dikembangkan lebih lanjut sesuai dengan kebutuhan dan keinginan anda.

Terima kasih dan Semoga bermanfaat

Menteng, 7 Februari 2009


josescalia

6 comments:

Anonymous said...

Oke bgt nih threadnya,btw sy mau tanya nih gimana cara menghapus salah satu file *.jsp yang ada di servernya?mohon pencerahannya...tx

JoseScalia said...

Menghapus salah satu file JSP?

Kan tinggal masuk ke folder [TomcatInstallatsionFolder]/webapps/[WebAplicationFolder]/

Kemudian delete file jsp yang ingin di delete...

Namun terkadang bisa juga file JSP ada pada lokasi lain misal di dalam folder WEB-INF/jsp/
Atau mungkin saya tidak mengerti pertanyaan anda...

BTW, terima kasih telah mengunjungi blog ini

salam

http://josescalia.blogspot.com

thegoch said...

klo kita http://localhost/test harusnya kelauarnya apa ya?

ony Ivantono said...

tomcat worker di lognya udh bisa lewat tapi akses webpagenya di apache tidak bisa keluar, error 404, salah dimananya y,
saya akses ke folder /examples g bisa jeluar

thx for help

ony Ivantono said...

waktu saya akses folder /examples di apache server port 80 keterangan error 404, padahal di tomcat1 ada foldernya

ony Ivantono said...

waktu saya akses folder /examples di apache server port 80 keterangan error 404, padahal di tomcat1 ada foldernya