Docker Üzerinde Http Load Balancing (Nginx)

Uygulama sunucumuz üzerine gelen Http istekleri yoğunlaştıkça, yani uygulama trafiği arttıkça buna paralel kaynak (İşlemci, Ram v.s.) ihtiyacı doğmaktadır. Bu ihtiyacı karşılamanın çeşitli yöntemleri vardır.

Scale Up: Mevcut sunucu üzerinde donanımsal kaynak arttırımına gitmek. Genellikle işlemci, Ram upgrade edilerek yapılır.

Scale Out: Mevcut uygulama sunucusunun bir kopyası daha oluşturularak kaynak arttırımına gitmek.

Load balancing konusuda tam burada devreye girmektedir. Uygulama sunucularımızın önüne konumlandırarak gelen http istekleri eşit veya kurala bağlı olarak yönlendiren (dağıtan) bir araçtır. Ayrıca uygulama çalışma anında herhangi bir sunucun down olması halinde load balancer’ımız gelen isteği o sunucuya yönlendirmez. Böylece http istek kaybına neden olmaz.

Çeşitli load balancing yöntemleri mevcuttur. Bu makalemizde nginx load balancer uygulamasını tanıyacağız. Nginx üzerinde uygulayabileceğimiz çeşitli dağıtım yöntemleri vardır.

Round Robin: Gelen istekleri eşit olarak ayaktaki sunuculara dağıtır.

Ratio: Gelen istekleri belirlediğimiz sınırlara göre dağıtan yöntemdir. Örnek olarak gelen 10 isteğin 5'ini bir sunucuya 3'ünü bir sunucuya kalan 2'sini farklı bir sunucuya yönlendirebilirsiniz.

Least Connection: Üzerinde en az request olan sunucuya yönlendirme yapan yöntemdir.

Ip Hash: Kullanıcı session bilgilerinin kaybolmaması için bu yöntem kullanılabilir. Örnek olarak login olan bir kullanıcının session bilgileri A sunucusunda bulunuyorsa o kullanıcının client’ından gelecek her request A sunucusuna yönlendirilir. Böylece session kaybının önüne geçilebilir.

Sık kullanılan bu yöntemlerden bahsettikten sonra örnek bir uygulama ile inceleyelim.

Öncelikle docker üzerinde nginx uygulamamızı ayağa kaldıralım. Boş bir klasör oluşturarak için aşağıdaki nginx config dosyasını (nginx.conf) koyalım.

upstream servers {
server 192.168.1.137:5000;
server 192.168.1.137:5005;
}
server {
listen 80;
location / {
proxy_pass http://servers;
}
}

Config içine iki tane sunucu ekledik ve 80 portu üzerine gelen http isteklerini eşit olarak bu iki sunucuya dağıtmasını söyledik.

Yine aynı dizine Dockerfile dosyası ekleyerek uygulamamızı çalıştıralım.

Önce docker build işlemini yapalım. (Docker Image oluşturuyoruz.)

docker build -t nginxserver .

Ardından ilgili Image’ımızı çalıştıralım.

docker run -d -p 80:80 nginxserver

İlk uygulamamızı çalıştırdık (nginx) şimdi bu load balancer’ın arkasında çalışacak örnek .net core uygulamalarımızı ayağa kaldıralım.

Yeni bir .Net Core Mvc projesi oluşturalım.

mkdir DotnetNginx
cd DotnetNginx
dotnet new mvc

Projemizin ana dizinine aşağıdaki Dockerfile dosyasını ekliyoruz.

Önce build ve ardından run işlemlerini yapıyoruz.

//BUILD
docker build -t dotnetnginx .
//RUN 1:WEBSITE
docker run -d -p 5000:5000 dotnetnginx
//RUN 2.WEBSITE
docker run -d -p 5005:5005 dotnetnginx

Evet docker ps komutu ile çalışan container’ları listeleyelim.

Gördüğünüz gibi 3 uygulamamız da ayakta. Şimdi apache bench yük testi yaparak performansı gözlemleyelim.

Önce sıradan 5000 portu üzerinden tek bir sunucuya request atalım.

2000 request için Time token for test: 1.491

Şimdi öndeki nginix sunucumuza aynı testi uygulayalım ve sonuca bakalım.

2000 request için Time token for test: 0.335

Not: Benchmark testleri konusunda desteği için Vehbi Emiroglu arkadaşımıza teşekkür ederim.

Evet gelen istekleri scale ederek her iki sunucuya dağıttığımızda sonucun ne kadar pozitif olduğunu gözlemledik.

Repo:

Faydalı olması dileğiyle.

Hoşçakalın.

--

--