Yük Dengeleme (Load Balancing), sunucu kümesi içerisindeki sınırlı kaynaklar içerisinde artan trafiğin karşılanabilmesi için geleneksel yöntem olan Dikey Ölçeklendirme’nin (Vertical Scaling) aksine Yatay Ölçeklendirme (Horizontal Scaling) ile yapıya ilave sunucu ekleme şeklide ilerleyen yönteme yük dağılımını sağlamaktır.
Her geçen gün artan request trafiğinin, belirlenen algoritmaya göre paylaştıran böylelikle her sunucuya belirli client request’lerin ulaştığı bu yapılandırmada günümüzde Load Balancing oldukça büyük öneme sahiptir.
Nginx ile Load Balancing Yapılandırması için ilk olarak sisteminizde nginx kurulu olması gereklidir. Varsayılan olarak kurulumunda oluşan “default” konfigrasyon dosyası silip, aynı isimle devam ediyor olacağız.
root@mertkarakulak:~# rm -rf /etc/nginx/sites-available/default
Aynı isimle dosyayı tekrar oluşturuyoruz.
root@mertkarakulak:~# nano /etc/nginx/sites-available/default
LBService olarak isimlendirdiğimiz method üzerinde back-end üzerinde tanımlı olan web sunucularımızı tanımlıyor ve akabinde sunucunun herhangi bir hostname üzerinden gelecek 80 portuna air requestleri dinelemesi gerektiğini ve gelen trafiğinin ise method üzerindeki sunuculara iletilmesi yönünde oluşturduğumuz dosyanın yapılandırmasını aşağıdaki gibi düzenliyorum.
upstream lbservice {
server 10.20.30.40:81;
server 10.20.30.41:82;
server 10.20.30.42:83;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://lbservice;
}
}
Yapılan bu konfügrasyonun üzerindeki yapılandırmalarımızın doğru bir şekilde çözümlendiğini doğrulayabilmek için aşağıdaki komutu kullanıyorum.
root@mertkarakulak:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Herhangi bir problem olmadığına göre, nginx servisini yeniden başlatarak yeni configleri okumasını sağlıyorum.
root@mertkarakulak:~# systemctl restart nginx
Ve sonuç aşağıdaki gibi, istekleri sırasıyla web sunucularına paylaştırmaktadır. Varsayılan olarak gelen bu paylaştırma algoritmasının adı “Round Robin” şeklindedir.
Ancak her zaman isteklerin sırasıyla her sunucuyu dolaşmasını istemeyebiliriz, bu durumlarda ise alternatifler yer almaktadır.
root@mertkarakulak:~# nano /etc/nginx/sites-available/default
upstream lbservice {
least_conn;
server 10.20.30.40:81;
server 10.20.30.41:82;
server 10.20.30.42:83;
}
Yukarıdaki gibi yapılandırıldığında, gelen her isteği en az yoğunlukta ve aktif konumda olan sunucuya yönlendirecektir. Dolayısıyla bu yapılandırma ağır trafik beklendiği durumlarda sıklıkla tercih edilir. Bu yapılandırma ise “Least Connection” şeklinde adlandırılmaktadır.
Aşağıda görüldüğü gibi farklı bir tarayıcıdan giriş yaptığımda bana ilk olarak “Web Server 2” sonucusu verdiği için, diğer sunucuların boş olması nedeniyle yalnızca “Web Server 1” ve “Web Server 3” sunucularına gelen request’i dağıtmaktadır.
Bazı özel durumlarda gelen isteğin üzerindeki session bilgilerinin değişmemesi, kullanıcının girdiği sunucuya isteklerin devamlı gelmesi için algoritma kullanılması gerekebilir bu durumlar için “IP Hash” şeklinde ifade edilen bir yapıdır.
root@mertkarakulak:~# nano /etc/nginx/sites-available/default
upstream lbservice {
ip_hash;
server 10.20.30.40:81;
server 10.20.30.41:82;
server 10.20.30.42:83;
}
Bu durumda ise ilk olarak isteğim teslim edildiği sunucunun “Web Server 1” olması nedeniyle devamında gelen isteklerinde “Web Server 1” üzerine teslim edildiği görülmektedir.
Nginx resmi web sitesi üzerinde ilgili teknik dökümanlara ulaşabilir veya işlem sırasında bir problem ile karşılaşırsanız yorumlardan, iletişim alanından bana ulaşabilirsiniz.
Veya
Nginx’e ait forumlar aracılığıyla topluluk ve yetkililer ile iletişim kurabilirsiniz.
Güzel gözüküyor. Eline sağlık.
Selam Mert,
Oldukça ayrıntılı olmuş, tebrik ederim.
Merhaba,
Tesadüfen gördüm, gerçekten başarılı bir makale.