Proxy sunucularda yük dengeleme, gelen istemci isteklerini birden fazla backend sunucuya dağıtarak kaynak kullanımını optimize eder, verimi en üst düzeye çıkarır, yanıt süresini en aza indirir ve yüksek erişilebilirlik sağlar. Bu mekanizma, trafiği mevcut kaynaklara akıllı biçimde yönlendirerek tek bir sunucunun darboğaz ya da tek hata noktası hâline gelmesini önler.
Proxy sunucular, özellikle de ters proxy'ler, istemci cihazları ile bir grup backend uygulama sunucusunun arasında konumlanır. Bir istemci istek gönderdiğinde proxy bu isteği yakalar ve yapılandırılmış algoritmalara ile sunucu sağlık durumuna göre isteği backend sunuculardan birine iletir. Bu soyutlama katmanı, modern dağıtık sistemlerde web trafiğinin verimli yönetimi için kritik önemdedir.
Yük Dengelemenin Faydaları
Yük dengelemeyi bir proxy sunucu üzerinden uygulamak, sistem mimarisi ve performansı açısından birkaç kritik avantaj sunar:
- Yüksek erişilebilirlik ve hata toleransı: Trafik dağıtıldığı için bir backend sunucu arızalandığında yük dengeleyici istekleri otomatik olarak sağlıklı kalan sunuculara yönlendirir ve hizmet kesintisi yaşanmaz.
- Ölçeklenebilirlik: Sistemler daha fazla backend sunucu eklenerek yatay olarak ölçeklenebilir. Yük dengeleyici yeni sunucuları havuza sorunsuzca dâhil eder; böylece altyapı, kesinti olmadan artan trafiği karşılayabilir.
- Daha iyi performans: İstekler daha az meşgul olan veya daha fazla kapasitesi bulunan sunuculara dağıtılır; bu da daha hızlı yanıt süreleri ve daha iyi bir kullanıcı deneyimi anlamına gelir.
- Verimli kaynak kullanımı: Yük dengeleme, tüm backend sunuculardaki işlem kaynaklarının etkin kullanılmasını sağlar ve bazı sunucular aşırı yüklenirken diğerlerinin boş kalmasını engeller.
Yük Dengeleme Algoritmaları
Bir proxy sunucunun gelen istekleri nasıl dağıtacağını farklı algoritmalar belirler. Algoritma seçimi; oturum kalıcılığı, sunucu kapasitesi ve trafik desenleri gibi uygulamaya özgü gereksinimlere bağlıdır.
Round Robin
İstekler backend havuzundaki her sunucuya sırayla dağıtılır. Bu, sunucu yükünü veya kapasitesini dikkate almayan basit ve durum tutmayan (stateless) bir yöntemdir.
- Artıları: Uygulaması kolaydır, istekleri zaman içinde eşit dağıtır.
- Eksileri: Sunucunun işlem süresini veya mevcut bağlantılarını hesaba katmaz; işlem süreleri değişkense bir sunucu aşırı yüklenebilir.
- Kullanım senaryosu: Tüm istekler için benzer işlem sürelerine sahip, eşit kapasiteli sunucular için uygundur.
Least Connection
Proxy, yeni istekleri en az etkin bağlantıya sahip sunucuya yönlendirir. Bu algoritma dinamiktir ve her sunucunun güncel iş yükünü dikkate alır.
- Artıları: Yükü Round Robin'e göre daha akıllı dağıtır, uzun ömürlü bağlantılarda etkilidir.
- Eksileri: Proxy'nin etkin bağlantıların durumunu tutmasını gerektirir; bağlantı işleme süreleri çok değişkense en iyi seçim olmayabilir.
- Kullanım senaryosu: Sohbet servisleri veya long polling API'leri gibi bağlantı süreleri değişken uygulamalar.
IP Hash
İstemcinin IP adresi bir hash üretmek için kullanılır ve bu hash, isteği hangi backend sunucunun alacağını belirler. Böylece belirli bir istemci her zaman aynı sunucuya bağlanır ve oturum kalıcılığı sağlanır.
- Artıları: Sunucu tarafında oturum yönetimi veya çerez gerektirmeden oturum yapışkanlığını garanti eder.
- Eksileri: İstemcinin IP'si değişirse farklı bir sunucuya yönlendirilebilir; belirli IP'lerden gelen trafik orantısız yüksekse dağılım dengesiz olabilir.
- Kullanım senaryosu: Kullanıcı oturumlarının tek bir sunucuda kalması gereken, duruma bağlı uygulamalar ve istemci IP'lerinin görece sabit olduğu durumlar.
Weighted Round Robin / Weighted Least Connection
Bunlar temel karşılıklarının genişletilmiş biçimleridir: Sunuculara kapasitelerine göre (ör. CPU, bellek, ağ bant genişliği) bir ağırlık atanır. Ağırlığı yüksek sunucular isteklerin orantılı olarak daha büyük bir bölümünü alır (Weighted Round Robin) veya en az bağlantıya sahip sunucu seçilirken önceliklendirilir (Weighted Least Connection).
- Artıları: Farklı sunucu kapasitelerini hesaba katar, güçlü sunucuların daha fazla yük almasını sağlar.
- Eksileri: Ağırlıkların doğru yapılandırılmasını gerektirir; hatalı yapılandırma darboğaza yol açabilir.
- Kullanım senaryosu: Donanım özellikleri veya işlem gücü farklı backend sunucuların bulunduğu ortamlar.
Least Response Time
Proxy, istekleri sağlık kontrollerine ya da önceki isteklere en hızlı yanıt veren sunucuya yönlendirir. Bu algoritma performansı önceliklendirir.
- Artıları: En hızlı genel yanıt için optimize eder, gerçek zamanlı sunucu performansına uyum sağlar.
- Eksileri: Sunucu yanıt sürelerinin sürekli izlenmesini gerektirir; bu da proxy'ye ek yük getirir.
- Kullanım senaryosu: Gecikmeyi en aza indirmenin birinci öncelik olduğu, performans açısından kritik uygulamalar.
URL Hash / İçerik Tabanlı Yönlendirme
İstekler; URL yolu, sorgu parametreleri veya HTTP başlıkları gibi istek içindeki belirli öğelere göre yönlendirilir. Bu sayede belirli istek türleri özelleşmiş backend servislerine iletilebilir.
- Artıları: Mikroservis mimarilerini ve ayrıntılı trafik yönetimini mümkün kılar.
- Eksileri: Yapılandırması ve yönetimi daha karmaşıktır; proxy'nin derin paket incelemesi yapmasını gerektirir.
- Kullanım senaryosu: Mikroservisler, API gateway'ler veya belirli içerik türlerinin ayrılmış sunuculara yönlendirilmesi (ör. görsellerin bir medya sunucusuna, API çağrılarının bir API sunucusuna).
Sağlık Kontrolleri ve Failover
Etkili yük dengeleme, backend sunucuların sağlık durumunun sürekli izlenmesine dayanır. Proxy'ler bir sunucunun çalışır durumda ve istekleri karşılayabilir olup olmadığını belirlemek için sağlık kontrolleri yapar.
- Mekanizma: Sağlık kontrolleri genellikle backend sunuculara düzenli aralıklarla istek göndermeyi içerir (ör. TCP sondaları, belirli bir uç noktaya HTTP GET istekleri).
- Tespit: Bir sunucu zaman aşımı süresi içinde yanıt vermezse veya hata durumu döndürürse (ör. HTTP 5xx), proxy onu sağlıksız olarak işaretler.
- Failover: Sağlıksız sunucular etkin sunucu havuzundan otomatik olarak çıkarılır, böylece onlara istek gönderilmez. Sunucu toparlanıp sağlık kontrollerinden geçtiğinde havuza otomatik olarak yeniden eklenir.
Bu otomatik failover mekanizması, yüksek erişilebilirliğin korunması ve hizmetin kesintisiz sürmesi için kritiktir.
Yük Dengeleme İçin Proxy Sunucu Türleri
Yük dengeleme kavramı geniş bir alanda uygulanabilse de, istemci isteklerinin birden fazla backend sunucuya dağıtılması bağlamındaki asıl uygulaması genellikle ters proxy'ler tarafından üstlenilir.
Ters Proxy'ler
Ters proxy'ler bir veya birden fazla web sunucusunun önünde konumlanır. İstemci isteklerini yakalayıp uygun backend sunucuya ileterek bir ağ geçidi gibi çalışırlar. Backend servislerin yük dengelemesinde yaygın kullanım senaryosu budur.
- Örnekler: Nginx, HAProxy, Envoy, Apache (mod_proxy_balancer ile).
İleri (Forward) Proxy'ler
İleri proxy'ler istemciler tarafından dış kaynaklara erişmek için kullanılır. Yük dengeleme yapabilseler de bu genellikle giden istekleri birden fazla çıkış düğümüne dağıtmak veya farklı dış servislere erişimi yönetmek içindir; kurumun kendi backend sunucularına gelen gelen istekleri dengelemek için değil. Bu makalenin ana odağı ters proxy ile yük dengelemedir.
Yaygın Proxy Sunucularla Pratik Uygulama
Nginx Örneği
Nginx, performansı ve güçlü özellik seti sayesinde ters proxy ve yük dengeleme için popüler bir tercihtir.
http {
upstream backend_servers {
# Round Robin (varsayılan)
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
# Least Connection
# least_conn;
# server backend1.example.com;
# server backend2.example.com;
# Weighted Round Robin
# server backend1.example.com weight=3;
# server backend2.example.com weight=1;
}
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
Bu Nginx yapılandırmasında upstream bloğu bir backend sunucu grubu tanımlar. server bloğu içindeki proxy_pass direktifi ise your_domain.com için gelen tüm istekleri bu backend_servers grubuna yönlendirir ve Nginx burada yapılandırılmış yük dengeleme algoritmasını uygular.
HAProxy Örneği
HAProxy, özellikle yüksek trafikli siteler için uygun, yüksek performanslı bir TCP/HTTP yük dengeleyici ve proxy sunucusudur.
frontend http_front
bind *:80
default_backend http_back
backend http_back
balance roundrobin # Veya leastconn, source (IP hash için) vb.
option httpchk GET /health
server app1 192.168.1.10:80 check
server app2 192.168.1.11:80 check
server app3 192.168.1.12:80 check
Bu HAProxy yapılandırması, 80 numaralı portu dinleyen ve trafiği http_back backend'ine ileten bir frontend tanımlar. backend bloğu yük dengeleme algoritmasını (balance roundrobin) belirtir ve tek tek backend sunucuları listeler. option httpchk GET /health satırı, her sunucu için sağlık kontrolü olarak /health adresine bir HTTP GET isteği yapılandırır.
Yük Dengeleme Algoritmalarının Karşılaştırması
| Algoritma | Açıklama | Artıları | Eksileri | En iyi kullanım senaryosu |
|---|---|---|---|---|
| Round Robin | Her sunucuya sırayla dağıtım. | Basit, zaman içinde eşit dağılım. | Sunucu yükünü/kapasitesini yok sayar, aşırı yüklenme riski. | Homojen sunucular, stateless uygulamalar. |
| Least Connection | En az etkin bağlantıya sahip sunucuya. | Yükü güncel etkinliğe göre dağıtır, uzun bağlantılarda daha iyi. | Durum takibi gerektirir, bağlantı işleme süreleri değişkendir. | Uzun ömürlü bağlantılar, dinamik iş yükleri. |
| IP Hash | İstemcinin IP adresi hash'ine göre. | Çerez olmadan oturum yapışkanlığı sağlar. | Belirli IP'ler yoğun trafik üretirse dağılım dengesizleşir. | Durum tutan uygulamalar, sabit istemci IP'leri. |
| Weighted Round Robin | Sıralı, ancak ağırlığı yüksek sunucular daha fazla alır. | Farklı sunucu kapasitelerini hesaba katar. | Doğru ağırlıklandırma gerekir, hatalı yapılandırma darboğaz yaratır. | İşlem gücü/kaynakları farklı sunucular. |
| Least Response Time | Sağlık kontrollerine en hızlı yanıt veren sunucuya. | En hızlı performans için optimize eder, anlık yüke uyum sağlar. | Sürekli izleme nedeniyle daha yüksek ek yük. | Performans açısından kritik uygulamalar, düşük gecikme ihtiyacı. |
| URL Hash / içerik tabanlı | URL yoluna, başlıklara veya diğer istek verilerine göre. | Mikroservisleri, ayrıntılı trafik yönetimini mümkün kılar. | Yapılandırması karmaşık, daha derin paket incelemesi gerektirir. | Mikroservisler, API gateway'ler, özelleşmiş içerik yönlendirmesi. |
İleri Düzey Yük Dengeleme Kavramları
Oturum Kalıcılığı (Sticky Sessions)
Kullanıcı oturum verilerinin belirli bir backend sunucuda tutulduğu durum tutan uygulamalarda, aynı istemciden gelen sonraki isteklerin de aynı sunucuya yönlendirilmesi kritiktir. Buna oturum kalıcılığı veya sticky session denir.
- Yöntemler:
- Çerez tabanlı: Proxy, istemcinin tarayıcısına, ilk yönlendirildiği backend sunucuya ilişkin bilgi içeren bir çerez yerleştirir. Sonraki istekler bu çerezi taşır ve proxy onları doğru sunucuya yönlendirebilir.
- IP Hash: Yukarıda açıklandığı gibi, istemcinin IP adresine göre yönlendirme yapışkanlık sağlar; ancak IP değişirse veya birden çok kullanıcı aynı IP'yi paylaşırsa (ör. bir NAT arkasında) sınırlamaları vardır.
SSL Sonlandırma
SSL sonlandırma (veya SSL offloading), proxy sunucunun gelen HTTPS trafiğinin şifresini çözüp backend sunuculara düz HTTP olarak iletmesidir.
- Faydaları:
- Performans: CPU yoğun SSL/TLS şifre çözme işini backend sunuculardan alır ve onların uygulama mantığına odaklanmasını sağlar.
- Basitleşen backend: Backend sunucuların SSL sertifikalarını veya şifrelemeyi yönetmesi gerekmez, yapılandırmaları sadeleşir.
- Merkezî sertifika yönetimi: Tüm SSL sertifikaları proxy üzerinde merkezî olarak yönetilir.
Önbellekleme
Birçok proxy sunucu aynı zamanda önbellek proxy'si olarak da çalışabilir. Sık erişilen içerikleri (ör. statik dosyalar, görseller, CSS, JavaScript) saklayarak proxy, bunları isteği bir backend sunucuya iletmeden doğrudan istemcilere sunabilir.
- Faydaları:
- Backend yükünde azalma: Backend sunuculara ulaşan istek sayısını belirgin biçimde düşürür.
- Daha iyi yanıt süreleri: Önbellekten sunulan içerik, backend'den getirmeye kıyasla genellikle çok daha hızlıdır.
- Daha az bant genişliği kullanımı: Proxy ile backend sunucular arasında daha az veri aktarılması gerekir.
