Basit Bir Load-Balancer Yapımı
Yeni bir medium yazıma daha hepiniz hoş geldiniz. Bu yazımda haProxy kullanarak express ile kurduğum servlerdan basit bir load-balancer yapımını göstereceğim.
İki adet klasörümüz olacak:
- app: express ile oluşturulmas basit bir backend serverı.
- haproxy: load-balancer görevini görecek haProxy klasörü.
Adım 1: Express ile Backend Server’nın Oluşturulması
Express kullanarak basit bir backend server’ı oluşturalım. Bunun için app adında bir klasör yaratıyoruz ve içerisine giriyoruz.
İlk olarak yarn init
diyerek package yapımızı oluşturuyoruz. Daha sonrasında server için gerekli olarak express paketini ekliyoruz: yarn add express
.
Şimdi index.js adında bir dosya yaratıp içerisine şu kodları ekliyoruz:
const app = require('express')();
const appid = process.env.APPID || 4000;
app.get('/', (req, res) => res.send(`APP ID: ${appid}`));
app.listen(appid, () => console.log(`listening on ${appid}`));
Bu nodeJS projesini docker image haline getirmek için Dockerfile dosyasını ekliyoruz:
FROM node:12
WORKDIR /home/node/app
COPY / /home/node/app
RUN npm install
CMD npm run app
Docker image’ımızı yaratmak için şu komutu çalıştırıyoruz:
docker image -t example-app .
Adım 2: HaProxy Yapısının Kurulması
HaProxy nedir?
HAProxy (High Availability Proxy), bir yük dengeleme (load-balancer) görev yöneticisidir. Birçok servis için yük dengeleme, yüksek erişilebilirlik ve proxy gibi hizmetleri ücretsiz, güvenli olarak sunmaktadır.
laod-balancer için haproxy klasörü yaratıyoruz ve içerisine haproxy.cfg
adında bir dosya ekliyoruz:
frontend http
bind *:80
mode http
timeout connect 10s
timeout client 10s
timeout server 10s
retries 3
use_backend all
backend all
mode http
server s1 nodeapp1:4001
server s2 nodeapp2:4002
server s3 nodeapp3:4003
server s4 nodeapp4:4004
Burada yer alan keywordlerin anlamları:
- bind: Çalıştırdığımız port değeri
- mode: HTTP veya HTTPs (SSL varsa) olarak girilir.
- timeout: Zaman aşımı değeridir. İlk denemeden başarısız olursa tekrar denemesi sağlanabilir. Bunun için yeniden deneme sayısını ayarlamanız gereklidir.
- retries: Zaman aşımına uğradığında kaç kere daha tekrarlanacağının değeri.
- use_backend: Kullanılacak backend serverlarının bilgileri.
haproxy klasörünün içerisine bu yapıyı bir docker image’ı haline getirmek için Dockerfile
dosyasını ekliyoruz.
FROM haproxy:1.7
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
Adım 3: Deneme Zamanı
Tüm bu yapıyı (imageları) çalıştırmak en dışta docker-compose.yml
dosyasını yaratıyoruz.
version: '3'
services:
haproxy:
build: ./haproxy
container_name: haproxy
ports:
- '80:80'
nodeapp1:
image: example-app
environment:
- APPID=4001
nodeapp2:
image: example-app
environment:
- APPID=4002
nodeapp3:
image: example-app
environment:
- APPID=4003
nodeapp4:
image: example-app
environment:
- APPID=4004
Tüm yapıyı oluşturduğumuzda klasörleme yapımız bu şekilde olmalıdır:
> app/
> node_modules/
> Dockerfile
> index.js
> package.json
> yarn.lock
>
> haproxy/
> Dockerfile
> haproxy.cfg
>
> docker-compose.yml
Ve geldik image’larımızı çalıştırmaya:
docker-compose up --build
Bu komutu çalıştırdıktan sonra http://localhost
adresine gidiyoruz. Burada her sayfayı yenilediğimizde APP_ID değerinin değiştiğini görebiliriz. Basit bir load-balancer servisini başarıyla tamamladık.
Extra
Daha karmaşık bir yapı için haproxy içeriğini şu şekilde değiştirebilirsiniz:
global
defaults http
timeout client 50s
timeout connect 50s
timeout queue 60s
timeout http-keep-alive 2m
frontend MyFrontent1
bind :80
mode http
use_backend MyBackends1 # or -> default_backend MyBackends
frontend MyFrontend2
bind :4000
mode http
use_backend MyBackends2
backend MyBackends1
mode http
server server1 nodeapp1:4001
server server2 nodeapp2:4002
backend MyBackends2
mode http
server server3 nodeapp3:4003
server server4 nodeapp4:4004
Bir frontend daha eklediğimiz için bunu docker-compose içerisine eklememiz gerekiyor.
.
.
.
haproxy:
build: ./haproxy
container_name: haproxy
ports:
- '80:80'
- '4000:4000' # 4000 inputtan 4000 outputa aktarıyoruz
.
.
.
Burada iki adet frontend ve her bir frontend’e bağlı iki server yarattık. http://localhost
adresine gidip sayfayı yenilediğinizde 4001 ve 4002 portaları arasında geçiş olduğunuz, http://localhost/4000
portuna gittiğinizde 4003 ve 4004 portları arasında geçiş olduğunu görebilirsiniz.
Final
Olabildiğince açıklayıcı bir şekilde anlatmaya çalıştım, umarım faydalı bir yazı olmuştur. Destek olmak için alkışlamayı unutmayınız 🤟
Sevgiler ve saygılar…