Basit Bir Load-Balancer Yapımı

Furkan Gulsen
3 min readOct 16, 2022

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…

--

--

Furkan Gulsen
Furkan Gulsen

Written by Furkan Gulsen

🧑‍💻 As a software engineer, I write about software, artificial intelligence, productivity, and everything I know