Load Balancing, sunucu mimarilerinde artan trafiğin karşılanabilmesi için RAM, disk gibi mevcut kaynakların artırılması sonrası mimari içerisine yeni sunucuların eklenmesi sıklıkla tercih edilen bir yöntemdir. Bu yazımızda birden fazla sunucu üzerinden trafiğin dağıtılmasında kullanılan load balancing’den ya da bir diğer ifadesiyle yük dağıtım servislerinden bahsedeceğiz.
Load Balancing Nedir?
Load balancing (yük dengeleme-dağıtma), iş yükünü birden fazla sunucuya dağıtarak web sitelerinin, uygulamaların, veri tabanlarının ve diğer hizmetlerin performansını ve güvenilirliğini artırmak için yaygın olarak kullanılan yüksek kullanılabilir (high availability) altyapıların önemli bir bileşenidir.
Bu işlem ile sisteme gelen ziyaretçiler, sunucu grubu ya da sunucu havuzu olarak adlandırılabilecek sunucular arasında, eşit ya da belirlenen kurallar çerçevesinde verimli bir şekilde dağıtılmaktadır. Hem application (uygulama), hem de database (veri tabanı) sunucular arası yapılan bu yük dengeleme işlemlerini gerçekleştiren sistemler ise “load balancer” olarak adlandırılmaktadır.
Load balancing özelliği kullanılmayan bir sistemde kullanıcılar, doğrudan “alanadi.com” gibi bir web servisine erişmek istediklerini bu alan adının üzerinde çalıştığı tek bir web sunucusuna bağlanır. Haliyle bu server üzerinde oluşabilecek sorun durumunda kullanıcılar web sitesine erişemezler. Bunun yanı sıra eş zamanlı olarak pek çok kullanıcının siteye erişmeye çalışması durumunda da aşırı yük tek bir sunucu üzerinden karşılanamayacağı için yüklenme sürelerinde yavaşlama ve sonunda erişim kesintileri yaşanabilir.
Oluşan bu “single point of failure” durumu sistem mimarisine eklenecek en az bir ek sunucu ve load balancer ile ortadan kaldırılabilir. Tipik olarak load balancer arkasında çalışan sunucular aynı içeriklere sahip olacaklarından kullanıcılar hangi sunucudan erişim sağlarlarsa sağlasınlar aynı çıktı ile karşılaşırlar.
Load Balancing ile Hangi Trafik Türleri Dengelenebilir?
Load balancer’lar ile 4 temel trafik türü için dengeleme kuralları oluşturulabilmektedir.
HTTP: Standart HTTP dengelemesinde gelen istekler standart HTTP tekniklerine dayanarak yönlendirilir. Load balancer, backend sisteme orijinal istekle hakkında bilgi vermek için X-Forwarded-For, X-Forwarded-Proto ve X-Forwarded-Port başlıklarını ayarlar.
HTTPS: HTTPS dengeleme işlemlerinde HTTP dengeleme ile aynı süreç işletilmektedir. Aradaki tek fark HTTPS işlemlerindeki şifreleme süreçleridir. Bu şifreleme süreçleri iki farklı şekilde gerçekleştirilebilir. İlk yöntemde şifreleme SSL geçişi ile backend’e kadar korunur. İkinci yöntemde ise şifreleme ve şifre çözme yükü her bir sunucunun üzerinden alınarak load balancer’a yüklenir. Bu yapıda hem sunuculara daha az yük binmekte, hem de maliyetler azaltılabilmektedir. SSL’in load balancer üzerinde kurgulandığı bu işleme ise SSL Offload denir.
TCP: HTTP veya HTTPS kullanılmayan uygulamalar için TCP trafiği dengelenebilir. Örneğin, bir veri tabanı kümesine giden trafik tüm sunuculara yayılarak dengelenebilir.
UDP: Yakın bir zamanda bazı load balancer’lar DNS ve syslogd gibi UDP kullanan temel internet protokolleri için load balancing desteği eklediler.
Bu dengeleme kurallarında, load balancer üzerindeki protokol ve bağlantı noktası tanımlandıktan sonra bunların load balancer’ın backend’deki trafiği yönlendirmek için kullanacağı protokol ve bağlantı ile eşleşmesi sağlanır.
Load Balancing (Yük Dengeleme) Nasıl Çalışır?
Peki, load balancer’lar trafiğin yönlendirileceği backend sunucusunu nasıl seçer?
Load balancer’lar istekleri iletmek için 2 faktörlü bir kombinasyon kullanır. İlk olarak, seçebilecekleri sunucuların isteklere uygun şekilde yanıt verebileceğinden emin olurlar. Sonrasında ise yanıt verebilecek sunucular (healthy pool) arasından seçim yapmak için önceden yapılandırılmış kuralları kullanır.
Uygunluk Kontrolleri (Health Checks)
Load balancing uygulanan sistemlerde yük dengeleyiciler trafiği yalnızca sağlıklı olarak nitelendirilen backend sunucularına iletmelidirler. Bir sunucu uygunluk kontrolünde başarısız olursa ve bu nedenle isteklere yanıt veremezse havuzdan otomatik olarak kaldırılır ve uygunluk kontrolüne tekrar cevap verene kadar bu sunucuya trafik iletilmez.
Load Balancing Algoritmaları
Kullanılan yük dengeleme algoritmaları, trafiğin hangi backend sunucusuna iletileceğini belirleyen algoritmalardır. En sık kullanılan algoritmaları şu şekilde sıralayabiliriz:
Round Robin: Round robin, sunucuların sıralı olarak seçildiği ve trafiğin bu sıralama ile paylaştırıldığı algoritmalardır. Bu algoritmada load balancer, ilk istek için listesindeki ilk sunucuyu seçer ve sora sırayla listenin altına doğru devam eder. Listenin sonuna gelindiğinde ise tekrar üstten başlayarak sırayla aşağıya doğru seçim devam eder.
Least Connection: Least connection algoritmasında yük dengeleyici en az bağlantıya sahip sunucuyu seçer. Bu algoritma trafiğin daha uzun oturumlarla sonuçlandığı durumlarda önerilir.
Source (IP Hash): Source algoritmasında yük dengeleyici istemcinin IP adresini, hangi sunucunun isteği alacağını belirlemek için kullanır. Bu yöntem ile belirli bir kullanıcının sürekli olarak aynı sunucuya bağlanması sağlanır.
Neden Load Balancing Kullanılmalı?
- Load balancing ile erişilebilirlik ve sunucu sürekliliği en üst seviyeye çıkarılabilir. Bu sayede sunucu sistemi kullanıcılar için her zaman hazır ve çalışabilir durumda olur.
- Dönemsel olarak yaşanacak trafik artışlarında dahi gecikmeler ve erişim kesintileri yaşanmayacağı için kullanıcı deneyimi de gelişmeler gösterir.
- Kullanıcılar en uygun uygulama / veri tabanı kaynaklarına yönlendirileceği ve uygulama / veri tabanı optimizasyonu sağlanacağı için “single point of failure” riski ortadan kalkar.
Bonus bilgi: Hemen hemen tüm uygulamalar kodlama sürecinde load balancer arkasında çalışacak şekilde tasarlanmadığı için load balancer arkasına alınan sunuculara doğru gelen ziyaretçilerin session bilgileri sunucular arasında aktarılmadığı için session düşmesi veya kaybı yaşanmaktadır. Bu olumsuz durumun ortadan kalkması için en kısa yöntem sticky persistence ayarı yapılabilir. Olması gereken çözüm ise session’ları ortak bir sunucuda ya da veri tabanında toplamak şeklindedir.