Home / DevOps / Nginx Kullarak Load Balancer Yapımı

Nginx Kullarak Load Balancer Yapımı

Uygulamamıza gelen istekler artığı zaman bu istekleri dengelemek gerekir. Yani gelen istekleri dağıtarak sistemi ayakta tutmak isteriz. Bu, uygulamamızın ayakta kalması için çok önemlidir. Tek bir sunucu üzerine gelen aşırı yük, istenmeyen sonuçları doğurabilir, bu yükü karşılamak için iki seçeneğimiz vardır:

1-) SCALE UP

Bu yöntemde, sunucunun mevcut ram, cpu vb. gibi donanımlarını arttırarak sunucunun yükü kaldırması beklenir.

2-) SCALE OUT

Mevcut uygulamamızın olduğu sunucunun bir veya daha fazla replikası oluşturulur ve gelen istekler bu sunucular üzerine dağıtılır. Böylelikle tek bir sunucu üzerinde tüm istekler suncumuzun kaldıramayacağı kadar yük yaratmaz.

Scale Out yönteminde yük dengeleyici yani Load Balancer devreye giriyor. Load balancer, uygulamamızın önündedir ve gelen istekleri uygulama sunucumuza dağıtır. Eğer arkadaki bir sunucuda bir sorun olup sunucu down olmuş ise, load balancer gelen istekleri buraya yönlendirmez ve gelen istekleri diğer ayakta olan sunuculara dağıtır.

Biz load balancer olarak ngnix kullanacağız. Eğer nginx kurulu değilse buraya tıklayarak nasıl kurulacağını inceleyebilirsiniz.

Nginx, sunucu yükünü çeşitli şekilde dağıtmanıza yardımcı olur. Bunlar;

Least Connection : Bu yöntem gelen istekleri, üzerinde en az istek olan sunucuya aktarır.

upstream backend_servers {
   least_conn;
   server server_ip; 
   server server_ip;
}

Ratio : Bu yöntem gelen istekleri istediğimiz gibi dağıtmamıza yardımcı oluyor; Her sunucuya bir ağırlık belirliyoruz ve bu kurala göre yükler dağıtılır.
Örnek olarak server_1 ve server_2 olarak 2 tane sunucumuz olduğunu varsayalım, 10 istek server_1 sunucusuna, 20 istek server_2 sunucusuna gitsin diyelim, bunu aşağıdaki komutlarla yapabiliriz:

upstream backend_servers {
   server server_ip weight=2; 
   server server_ip weight=4;
}

Round Robin : Gelen istekleri sırayla belirlenen sunuculara aktarır. Ngnix default olarak bu yöntemi kullanır. Bunun için birşey tanımlamamıza gerek yoktur.

upstream backend_servers {
   server server_ip; 
   server server_ip;
}

Ip Hash : Bu yöntem, uygulamamızı kullanan kullanıcılarının session bilgilerini kaybetmemek için kullanılır.
Yani kullanıcı_A, sunucu1’e istek attı ve işlemlerini burada yapıyor diyelim, Kullanıcı bir sonraki ziyaretinde sunucu2’ye gitmez ve bilgileri sunucu1’de olduğu için hep sunucu1 de kalır.

upstream backend_servers {
   ip_hash;
   server server_ip; 
   server server_ip;
}

Şimdi ben bu demoyu yapabilmek için kendi sunucum da 2 tane container üzerinde web uygulaması ayağa kaldırıcağım; Biri 3000 diğeri 3001 portundan ayağa kalkacak ve load balancer bizi bu uygulamalara yönlendirecek.

İlk olarak web uygulamalarımızı ayağa kaldıralım.
Şimdi bu web uygulamasını docker kullanarak ayağa kaldırıcağız, bunun için aşağıdaki gibi basit bir Dockerfile yazdım:

FROM centos:latest
RUN yum -y install httpd
COPY . /var/www/html/
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
EXPOSE 80

Sonrasında aşağıdaki gibi basit bir index.html sayfası hazırladım, Dockerfile ve index.html dosyası aynı yerde olmaları gerek.

<!DOCTYPE html>
<html>
<head>
	<title>Teknodice.com</title>
</head>
<body>
<h1>Teknodice.com Server A</h1>
</body>
</html>

Şimdi docker buid ile image oluşturaacağız, bunun için aşağıdaki komutu terminalde çalıştıralım:

docker build -t web1 .

Evet ilk image oluştu. Şimdi bir tane daha oluşturacağız; fakat ilk olarak index.html dosyasımızda h1 ile yazdığımız kısımdaki Server A yazan yeri Server B olarak değiştirelim, çünkü load balancer’ın düzgün çalışıp çalışmadığını bu şekilde test edebileceğiz.
Yukarıdaki işlemi yaptığınızı varsayıyorum, şimdi tekrar build edelim:

docker build -t web2 .

Artık elimizde 2 tane web1 ve web2 adında image bulunuyor, terminale aşağıdaki komutu çalıştırarak image’lerimizi görebiliriz:

docker images

Şimdi ngnix için bir config dosyası oluşturacağız, aşağıdaki adımları takip edelim:

sudo nano /etc/nginx/conf.d/teknodice_ngnix_loadbalancer.conf
upstream backend_servers {
  server sunucu_ip:3000;
  server sunucu_ip:3001;
}
server {
  listen 80;
  location / {
  proxy_pass http://backend_servers;
 }
}

Kendi komutlarımızı başlangıç olarak görmesi için default yapılandırmayı silmemiz gerek, sildikten sonra ngnix’i yeniden başlatacağız.

Silmek için:

sudo rm /etc/nginx/sites-enabled/default

Yeniden başlatmak için:

sudo systemctl restart nginx

Şimdi web1 ve web2 image’lerini çalıştıralım, bunun için aşağıdaki komutları konsol ekranında çalıştıralım:

docker run -d -p 3000:80 web1

docker run -d -p 3001:80 web2

Her şey yolunda ise, aşağıdaki komutu çalıştırdığımızda başarıyla start olan containerları görmemiz gerek:

docker ps

Artık herşey hazır!
Yukarıdaki yöntemleri belirtmediğimiz zaman Ngnix default olarak Round Robin seçecektir, yani gelen istekleri sıra ile sunuculara yönlendirecektir.

Şimdi Ngnix yüklü olan sunucuma gidiyorum ve LoadBalancer’ı test ediyorum, her istekte beni sunuculara otomatik olarak dağıttığını görebilirsiniz:

İlk request;

İkinci request;

Demo için oluşturduğum tüm dosyalara aşağıdaki linkten ulaşabilirsiniz.

İNDİRMEK İÇİN TIKLAYIN.

İlginizi Çekebilir

AzureDevOps Pipeline’da Custom Conditions Kullanımı

Bu yazımız da AzureDevOps pipeline’da custom conditions kullanımını inceleyeceğiz. Custom conditions pipeline da kullandığımız taskların …

0 0 vote
Article Rating
Subscribe
Bildir
guest
0 Yorum
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x