Merhaba arkadaşlar,

Bugün sizlere Load balancing hakkında bilgi vermeye çalışıcam. Dökümanın sonunda load balancer nasıl kurulur, load balancing nedir, google gibi büyük firmaların siteleri nasıl hiç kapanmadan çalışıyor vs.. tarzı bilgilere sahip olmuş olmanızı amaçlıyorum :) Kısacası amacım size bir web sitesinin kapanmadan teoride %100 Uptime ile nasıl çalışabileceğini anlatmak.

Öncelikle load balancing nedir bundan kısaca bahsedelim.



Kelime anlamı Yük dengeleme olan Load Balancing kısaca mevcut networkteki trafiği dengelemenize verilen isimdir. Bu işlemi çeşitli amaçlarla kullanabilirsiniz Örneğin serverınızdaki yükü dengelemek amaçlı, internet kafenizdeki veya evinizdeki internet bağlantısını dengelemek, internete erişim oranınızı arttırmak amaçlı kullanabilirsiniz. Benim burada bahsedeceğim durum internet bağlantısından ziyade, serverdaki yükü paylaştırmayı hedefliyor.

Bizim burada bahsedeceğimiz işlem ise: bir adet Load Balancer (LB) kullanarak, gelen requestleri iki adet farklı Web Server (WS)'dan uygun, müsait olana yönlendirmek. Bu sayede Web Serverlarınızdan biri kapalı, arızalı olsa bile kullanıcılarınız bunun farkına varmadan, diğer web server üzerinden işlem yapabilecekler.

Aşağıdaki görsel Load Balancer ile ilgili size muhtemelen daha iyi yardımcı olacaktır.



Buradaki şemayı biraz açacak olursak;

Tüm makinalarda 64 bit Centos 6.5 yüklü durumdadır (Şart değil, benim tercihim bu yönde)

Load Balancer: 192.168.14.131
Web Server: 192.168.14.132
Web Server 2: 192.168.14.133

Bu makinalar benim networkümde olan mevcut ve gerçek IP adresli serverlardır. Kırmızı ile belirtilen ve dışarıdan erişim için kullanmış olduğumuz 192.168.14.100 IP adresi henüz herhangi bir cihaz tarafından alınmamıştır, biz Load Balancer'ı kurarken sanal bir şekilde o IP adresini aldırıcaz.

Yukarıdaki görselden de anlaşılacağı üzere tüm requestler 192.168.14.100 IP adresine gelecek, 192.168.14.130 IP adresli Load Balancer istekleri karşılayıp Web Server 1 veya 2'den uygun olana yönlendirecek. Web serverlar da kullandıkları uygulamaya göre gerekirse DB Serverdan destek alacak.

Şimdi teorik bilgi edindiysek gelelim Load Balancer'ın kurulumuna.

Load balancer nasıl kurulur ?



Benim bu örneğimde kullanacağım Load Balancer piranha. Öncelikle LB makinamıza bağlanıp, gerekli uygulamaları aşağıdaki komut yardımıyla kuruyoruz;

yum install httpd piranha ipvsadm -y


Kurulum gerçekleştikten sonra ise servislerimizi teker teker aktifleştirip, aşağıdaki komutlarla başlangıca ekliyoruz.

service httpd start
service piranha-gui start
chkconfig httpd on
chkconfig piranha-gui on
chkconfig pulse on


Piranha'nın Web tabanlı grafik arayüzünü çalıştırıyoruz (Apache'yi de yükleme amacımız bu dilerseniz Apache yerine nginx de kullanabilirsiniz);

service piranha-gui start


Ip yönlendirmeyi açıyoruz;

sysctl -w net.ipv4.ip_forward=1


Piranha arayüzü için şifre belirliyoruz;

piranha-passwd


(Gelen ekranda iki kere aynı şifreyi giriyoruz, kullanıcı adımız piranha)

Piranha arayüzünün portunu erişime açık hale getiriyoruz;

iptables -A INPUT -m state --state NEW -p tcp --dport 3636 -j ACCEPT
service iptables save
service iptables restart


Şu andan itibaren Load Balancer'ımız kuruluma hazır.

Load Balancer'ımızı Web browser yardımıyla açıyoruz;

http://192.168.14.131:3636

Karşımıza gelen ekranda Login butonuna basıp, piranha kullanıcı adıyla az önce belirlediğimiz şifreyi giriyoruz. Karşımıza aşağıdaki gibi bir ekran gelecek.



Burada Daemon Stop demesinin sebebi, henüz pulse servisini başlatmamış olmamız, bunu birazdan gerçekleştiricez.

Öncelikle tablardan Global Settins tabına geçip, Accept butonuna basıyoruz daha sonra ise Virtual Server tabına geçiyoruz;

Add butonuna basıp, ardından Edit butonuna basarak aşağıdaki gibi bir kayıt sisteme ekliyoruz.



Burada "Virtual IP Address:" kısmına herhangi bir makinaya tanımlamamış olduğumuz IP adresini giriyoruz, bizim buradaki örneğimizdeki IP adresi 192.168.14.100 Ben bu işlemi Apache için örneklediğimden dolayı Port olarak 80 kullandım. Diğer ayarları görüntüdeki gibi yaptıktan sonra Accept butonuna basıyoruz. Buradaki önemli nokta Device kısmı burada gördüğünüz gibi eth0:1 yazmakta. Normalde benim bu şekilde bir Ağ bağdaştırıcım yok fakat yeni tanımladığımız IP için bunu sanal olarak sistem otomatik olarak oluşturuyor.

Sanal networkümüzü kurduktan sonra sıra geldi gerçek serverlarımızı sisteme tanıtmaya, bunu da isminden anlayabileceğiniz gibi Real Servers kısmından gerçekleştiriyoruz.

Real Servers kısmına girdikten sonra yine önce Add ve Edit butonunu kullanarak aşağıdaki gibi ayarlamaları gerçekleştiriyoruz.



Bu işlemi Web Server 1 ve 2 için toplamda 2 kere yapıyoruz. Daha sonra Real Servers kısmında teker teker serverları seçip (De)Activate butonuna basıyoruz, aşağıdaki gibi bir görüntü elde etmiş olmamız gerekiyor.



Sağ üstte bulunan Virtual Servers kısmına geçip, orada da Virtual server için (De)Activate butonuna basıyoruz.

Şu anda sistemlerimiz temel olarak hazır. Web serverlarımızda port yönlendirme işlemini gerçekleştirip, sistemi çalıştırabiliriz. Bunun için de sırasıyla Web Server 1 ve Web Server 2 bilgisayarlarına bağlanıp,

iptables -A PREROUTING -t nat -p tcp -d 192.168.14.100 -j REDIRECT
service iptables save
service iptables restart


komutlarını çalıştırıyoruz.

Şimdi son olarak tekarar Load Balancer makinamıza bağlanıp pulse servisimizi start ediyoruz;

service pulse start


Şu andan itibaren sistem hazır ve kullanılabilir olması gerekmekte. Durumu dilerseniz Piranha arayüzündeki "CONTROL/MONITORING" kısmından kontrol edebilirsiniz. Her şey yolunda gittiyse aşağıdakine benzer bir görüntü elde etmiş olmanız gerekmekte.



Şu andan itibaren browserdan http://192.168.14.100 IP'li bilgisayara erişmeyi denediğimizde önce LoadBalancer'dan geçip, bilgisayarların müsaitliklerine göre Web Server 1 veya 2 üzerinden uygulamamız çalışacaktır. Web Serverlardan herhangi birinde problem olduğunda ise Örneğin Web server 1 çöktü kullanıcılarınız bunun hiç farkına varmadan Web Server 2 üzerinden sisteminize sorunsuzca erişebilecektir.

Peki LoadBalancer makinası çökerse ?



Bunun için isterseniz ek önlem olarak Redundancy kısmından yedek load balancer makinanızı tanıtıp (load balancer ayarlarının orada da yapılı olması gerekir) Load Balancer 1 makinanız çöktüğünde otomatik olarak 2 makinanızın çalışmasını sağlayabilirsiniz.

Bu loadbalancer 2 makinanızın çökmeyeceği anlamına gelmiyor hatta olayı abartıp, komple networkün çöktüğünü göz önünde bulundurursak bu durumda karşımıza DNS Fail over hizmetleri çıkıyor.

Farklı bir networkte aynı yapıyı kullandığınız durumlarda, DNS Failover kullanarak networklerinizden birinde problem olduğunda, yedek networkle sisteminizin çalışmasını sürdürebilirsiniz fakat bu şu şekilde bir problem yaratabiliyor bildiğiniz gibi dns için belirlediğiniz TTL (Time to Live) süresi kadar mevcut kullanıcılarınız dns cachelerini temizlemedikleri sürece sıkıntı yaşayacaklardır. Bu süreyi 5-10 dakika gibi kısa bir süre şeklinde belirlediğinizde ise performans sıkıntısı çekebilirsiniz.

Her sistemin avantaj, dezavantajları olduğu gibi DNS Fail over sistemlerinin hatta Load Balancing işleminin de dezavantajları var. Örneğin php uygulamalarınızda session sunucuda tutulduğu için misafirleriniz sıkıntı yaşayabilir. Web server 1 de oturum açmış olduğu halde, 2 de oturum açılmamış session oluşmamış olduğu için sıkıntı yaşayabilir. Buna önlem olarak da memcached farklı bir sunucu kullanabilir veya DB serverınızda sesionları DB'de tutarak session_set_save_handler yardımıyla bu sorunun da üstesinden gelebilirsiniz.

Yukarıdaki örnek Google'ın nasıl hiç kapanmadan çalıştığını, Google'ın datacenterının bulunduğum semtten büyük olduğunu düşünürsek pratikte özetleyebilecek durumda değil fakat teorik olarak mantık aynı.

Aklınıza takılan bir soru olursa, yorumlardan sorabilirsiniz.