Yük Dengeleyici Nedir ve Neden İhtiyacınız Var?
Web sitenizin aniden bir trafik dalgasıyla karşılaştığını varsayalım. Yalnızca bir sunucunuz varsa, bu sunucu hızla doygunluğa ulaşır ve kullanıcılar 503 Service Unavailable hatası veya ciddi yavaşlıkla karşılaşır. Klasik çözüm, birkaç sunucuyu bir yük dengeleyicinin arkasına yerleştirmektir. Yük dengeleyici (Load Balancer), gelen trafiği birden fazla sunucu arasında dağıtan (yazılımsal veya donanımsal) bir cihazdır; böylece hiçbir sunucu kapasitesinin üzerinde yüklenmez.
Yük dengeleyicinin ana kullanım amacı "sadece trafiği dağıtmaktan" çok daha fazlasıdır. İyi bir yük dengeleyici aynı anda üç şeyi yapmalıdır: uygun algoritmaya göre yük dağıtımı, sunucuların sürekli sağlık kontrolü (Health Check) ve ardışık istekleri olan kullanıcılar için oturum yönetimi (Session Persistence). Bu üçünden herhangi biri olmadan altyapınız pratikte istikrarsız olacaktır.
Bu makalede, basit ama doğru bir dille yük dengeleyici türleri, yük dağıtım algoritmaları, sağlık kontrolü yapılandırması ve oturum yönetimi teknikleri hakkında bilgi edineceksiniz. Ölçeklenebilir bir altyapı tasarlıyorsanız, bu rehber doğru kararı vermenize yardımcı olacaktır.
Yük Dengeleyici Türleri: Donanımsal, Yazılımsal ve DNS
Yük dengeleyiciler üç ana kategoriye ayrılabilir. Her birinin seçimi bütçenize, ölçeğinize ve teknik gereksinimlerinize bağlıdır.
Donanımsal Yük Dengeleyici
F5 BIG-IP veya Citrix ADC gibi fiziksel cihazlar, yük dağıtımı için özel olarak tasarlanmıştır. Ana avantajları çok yüksek performans ve SSL sonlandırma ile 7. katman güvenlik duvarı gibi gelişmiş özelliklerdir. Ancak satın alma ve bakım maliyetleri yüksektir ve ölçeklenebilirlikleri donanımla sınırlıdır. Küçük ve orta ölçekli işletmeler için genellikle ekonomik bir seçenek değildir.
Yazılımsal Yük Dengeleyici
NGINX, HAProxy ve Traefik gibi normal bir sunucuya kurulan araçlar. Bu seçenek, startuplar ve orta ölçekli şirketler için en popüler tercihtir. HAProxy özellikle 4. katman (TCP/UDP) ve 7. katman (HTTP/HTTPS) yük dağıtımı için oldukça güçlüdür. NGINX, yük dengeleyici olmasının yanı sıra web sunucusu ve ters vekil (reverse proxy) rolünü de üstlenebilir. Kurulumları ve yapılandırmaları nispeten basittir ve iyi dokümantasyona sahiptirler.
DNS Yük Dengeleyici
Bu yöntemde, yük dağıtımı için DNS kullanılır. Bir alan adı birden fazla IP'ye yanıt verir ve istemci rastgele birini seçer. AWS Route 53 veya Cloudflare gibi hizmetler bu yöntemi kullanır. Avantajı basitlik ve ek altyapı gerektirmemesidir, ancak ciddi dezavantajları vardır: sunuculardan biri çökerse, DNS, TTL süresi dolana kadar IP'sini döndürmeye devam eder. Ayrıca yük dağıtımı üzerinde hassas kontrol sağlamaz ve oturuma duyarlı uygulamalar için uygun değildir.
Modern bulut altyapılarında genellikle yazılımsal yük dengeleyici (iç trafik için) ve DNS (bölge düzeyinde yük devretme için) kombinasyonu kullanılır. Yeni bir hizmet başlatmayı düşünüyorsanız, HAProxy veya NGINX ile başlamanızı öneririm; bu araçlar ServerNet bulut sunucularına da kolayca kurulabilir.
Yük Dağıtım Algoritmaları: Hangisi Sizin İçin Uygun?
Her yük dengeleyicinin kalbi, her isteğin hangi sunucuya gönderileceğine karar veren algoritmadır. Yanlış algoritma seçimi, bazı sunucuların aşırı yüklenmesine ve bazılarının boş kalmasına neden olabilir. Şimdi en önemli algoritmaları inceleyelim.
Round Robin ve Ağırlıklı Round Robin
En basit algoritma olan Round Robin, istekleri sunucular arasında döngüsel olarak dağıtır: ilk istek A sunucusuna, ikincisi B'ye, üçüncüsü C'ye ve sonra tekrar A'ya gider. Bu yöntem, eşit kapasiteye sahip sunucular için idealdir. Ancak sunucular farklı kapasitelere sahipse, Ağırlıklı Round Robin kullanın. Her sunucuya bir ağırlık atarsınız; örneğin A sunucusu ağırlık 3 ve B sunucusu ağırlık 1 ise, her 4 istekten 3'ü A'ya ve 1'i B'ye gider.
HAProxy'de yapılandırma örneği:
backend web_servers
balance roundrobin
server web1 192.168.1.10:80 weight 3 check
server web2 192.168.1.11:80 weight 1 check
En Az Bağlantı (Least Connections)
Bu algoritma, isteği o anda en az aktif bağlantıya sahip sunucuya gönderir. Uzun süren istekleri olan uygulamalar (dosya yükleme veya WebSocket gibi) için çok uygundur. HAProxy'de balance leastconn komutuyla etkinleştirilir. Bu yöntem Round Robin'den daha akıllıdır, ancak bağlantı sayılarının sürekli izlenmesini gerektirir.
IP Hash ve Kaynak IP Yakınlığı
Bu yöntemde, istemcinin IP adresi bir hash sayısına dönüştürülür ve buna göre belirli bir sunucu seçilir. Ana avantaj, kullanıcının her zaman ilk bağlandığı sunucuya yönlendirilmesidir. Bu, oturumu sunucuda tutan uygulamalar (bellekte oturumla giriş yapma gibi) için faydalıdır. Ancak istemci sayısı azsa, yük dağıtımı dengesiz olabilir.
Daha Gelişmiş Algoritmalar
Bazı yük dengeleyiciler, En Az Yanıt Süresi (Least Response Time) veya dağıtık önbellekler için kullanılan Tutarlı Hash (Consistent Hashing) gibi daha karmaşık algoritmalara sahiptir. Bu algoritmalar genellikle ticari araçlarda veya bulut hizmetlerinde bulunur. Başlangıç için Round Robin ve Least Connections yeterlidir.
Yaygın hata: Birçok geliştirici Round Robin'in her koşul için uygun olduğunu düşünür. Ancak sunuculardan biri daha yavaşsa, istekler aynı hızda ona gönderilir ve o sunucunun kullanıcıları kötü bir deneyim yaşar. Yavaş veya çökmüş sunucuların otomatik olarak döngüden çıkarılması için her zaman sağlık kontrolü kullanın.
Sağlık Kontrolü: Hizmet İstikrarını Garanti Etme
Sağlık kontrolü olmayan bir yük dengeleyici yalnızca kör bir dağıtıcıdır. Bir sunucu çökerse, yük dengeleyici yine de istekleri ona gönderir ve kullanıcılar hata görür. Sağlık kontrolü, yük dengeleyicinin sunucuların sağlığını periyodik olarak kontrol ettiği ve sağlıksız sunucuları döngüden çıkardığı bir mekanizmadır.
Sağlık Kontrolü Türleri
- TCP Kontrolü: Yük dengeleyici, belirli bir bağlantı noktasına (örneğin 80 veya 443) bir TCP bağlantısı kurar. Bağlantı başarılıysa sunucu sağlıklıdır. Bu en basit yöntemdir ancak yalnızca bağlantı noktasının açık olup olmadığını kontrol eder, uygulamanın gerçekten çalışıp çalışmadığını değil.
- HTTP Kontrolü: Yük dengeleyici, belirli bir yola (örneğin
/health) bir HTTP isteği gönderir ve yanıtın 200 koduyla dönüp dönmediğini kontrol eder. Bu yöntem daha doğrudur ve veritabanına veya diğer hizmetlere bağlantı durumunu da kontrol edebilir. - Özel Betik Kontrolü: Özel ihtiyaçlar için, uygulamanın sağlığını tam olarak kontrol eden bir betik yazabilirsiniz. Örneğin, mesaj kuyruğunun dolup dolmadığını kontrol edebilir.
NGINX'te HTTP sağlık kontrolü yapılandırma örneği:
upstream backend {
server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
}
server {
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout http_502;
}
}
Bu örnekte, bir sunucu 30 saniyede üç kez hata verirse geçici olarak döngüden çıkarılır. proxy_next_upstream parametresi, ilk sunucu 502 hatası döndürürse isteğin bir sonraki sunucuya gönderilmesini sağlar.
Önemli not: Sağlık kontrolü yolunu, uygulamanın gerçek durumunu gösterecek şekilde tasarlayın. Yalnızca veritabanına bağlanmayan basit bir HTML sayfası döndürürseniz, veritabanı kesilmiş bir sunucu hâlâ sağlıklı görünebilir. Kritik hizmetlere bağlantıyı da kontrol eden /healthz gibi özel bir uç nokta oluşturun.
Oturum Yönetimi (Session Persistence)
Birçok web uygulaması, kullanıcı oturum bilgilerini sunucuda saklar. A sunucusuna bağlanan bir kullanıcının bir sonraki isteği B sunucusuna giderse, oturumu kaybolur ve yeniden giriş yapmak zorunda kalır. Bu sorunu çözmek için oturum yönetimi kullanılır; buna Yapışkan Oturum (Sticky Session) veya Oturum Yakınlığı (Session Affinity) de denir.
Yapışkan Oturum Uygulama Yöntemleri
- Çerez Tabanlı: Yük dengeleyici, kullanıcının tarayıcısına
SERVERIDadında bir çerez yerleştirir. Sonraki isteklerde kullanıcı bu çerezi gönderir ve yük dengeleyici buna göre kullanıcıyı aynı sunucuya yönlendirir. Bu yöntem HAProxy'decookie SERVERID insert indirectseçeneğiyle etkinleştirilir. - Kaynak IP Yakınlığı: Daha önce açıkladığımız IP Hash algoritması. Basittir, ancak kullanıcılar bir NAT veya vekil arkasındaysa hepsi aynı IP'ye sahip olur ve tek bir sunucuya yönlendirilir.
- Oturum Çoğaltma: Kullanıcıyı bir sunucuya yapıştırmak yerine, oturumu tüm sunucular arasında kopyalarsınız. Bu yöntem karmaşıktır ancak daha iyi ölçeklenebilirlik sağlar. Bunun için Redis veya Hazelcast gibi araçlar kullanılır.
HAProxy'de Yapışkan Oturum örneği:
backend web_servers
balance roundrobin
cookie SERVERID insert indirect nocache
server web1 192.168.1.10:80 cookie web1 check
server web2 192.168.1.11:80 cookie web2 check
Yaygın hata: Tüm uygulamalar için Yapışkan Oturum kullanmak. Uygulamanız durumsuzsa (stateless) (yani oturumu Redis veya veritabanında saklıyorsa), Yapışkan Oturum'a ihtiyacınız yoktur ve kullanmak yalnızca yük dağıtımını kötüleştirir. Her zaman önce uygulama mimarisini inceleyin.
Özet ve Pratik Öneriler
Yük dengeleyici ve uygun algoritma seçimi ihtiyaçlarınıza bağlıdır. Başlangıç için şu yolu öneriyorum:
- Küçük bir altyapınız varsa (5 sunucudan az), HAProxy ve Round Robin algoritmasıyla başlayın.
- Yalnızca bir sunucunuz olsa bile sağlık kontrolünü ilk günden etkinleştirin.
- Uygulamanızda oturum varsa, önce onu durumsuz hale getirmeye çalışın (Redis ile). Olmuyorsa Yapışkan Oturum kullanın.
- Çok yüksek trafik için, yük dengeleyiciyi Active-Passive olarak kurun ki yük dengeleyicinin kendisi de tek hata noktası olmasın.
Son olarak, yük dengeleyicinin ölçeklenebilir altyapının yalnızca bir bileşeni olduğunu unutmayın. İzleme, önbellekleme ve veritabanı optimizasyonu da aynı derecede önemlidir. Yeni başlıyorsanız, HAProxy ve NGINX gibi açık kaynaklı araçlar akıllıca bir seçimdir ve ServerNet bulut hizmetlerinde kolayca dağıtılabilir. Doğru yapılandırmayla altyapınız, trafik dalgalanmalarından endişe etmeden istikrarlı kalabilir.
Yorumlar 0
Henüz yorum yok — ilk siz olun!