Load Balancer nedir ve ne işe yarar?

Bu flood’da iş yükünü dağıtarak uygulamaların ölçeklenmesini sağlayan Load Balancer (Yük Dengeleyici)’lardan bahsedeceğim.

Modern mimarilerinde artan trafiği karşılamak için mevcut kaynakları (CPU, memory) artırmak yerine yeni sunucu eklenmesi tercih edilmektedir. Mevcut kaynakları artırmak scale-up, yeni sunucular eklemekse scale-out olarak bilinir.

Trafik sunucuların önüne konan bir yük dağıtıcı ile karşılanarak eşit oranda (veya belirli kurallara göre) asıl işi yapacak olan sunuculara dağıtılır. Aşağıda bir web uygulamasının bir yük dengeleyici ile ölçeklendiği yapı resmedilmiştir.

Yük dengeleyiciler (LB — Load Balancer), yükü dağıttıkları sistemlerin sağlıklı olup olmadığını belirli aralıklarla kontrol ederek sağlıklı çalışmayan sunuculara trafiği yönlendirmekten imtina edebilirler. Bu sayede, yük dengeleyiciler sistemlerimizin ölçeklenmesini sağladıkları gibi yüksek erişilebilirliğini (HA — High Availability) sağlamak için de kullanılırlar. Problemli sunucuya yeni istek gönderilmez ve kullanıcıların problemden etkilenmemesi sağlanır.

Ek olarak, yük dengeleyiciler sayesinde uygulama güncellemeleri sistemde kesintiye sebep olmadan yapılabilir. HA durumuna benzer şekilde, öncelikle güncellenecek sunucuya LB’nin trafik yönlendirilmemesi sağlanır. Uygulama, sunucu üzerinde güncellendikten sonra LB tekrar sunucuya trafiği yönlendirmeye başlar. Bu süreç bütün sunucular için tekrarlandığında uygulamanın versiyonu servis kesintisine neden olmadan yükseltilmiş olur. Tabii tahmin edebileceğiniz gibi bu iş gerçek hayatta anlatıldığı kadar basit cereyan etmemektedir, sonraki flood’larda özel olarak bu konuya değineceğiz.

İdeal koşullarda LB’ler gelen istekleri sunuculara rastgele ya da Round-Robin yani eşit bir biçimde dağıtırlar. Yani bir kullanıcının ilk isteğini A sunucusu karşılarken başka bir isteğini B sunucusu karşılayabilir. Uygulama sunucusunda kullanıcı session'larının tutulduğu ideal olmayan örnek bir senaryoda ise bir kullanıcının LB tarafından sürekli aynı sunucuya indirilmesini isteyebiliriz. Bu noktada LB'de cookie veya IP'ye göre kullanıcılar sunuculara ilişkilendirilir. Aynı kullanıcının istekleri sürekli aynı sunucuya yönlendirilir ve buna Sticky Session adı verilir.

LB’ler birçok senaryoda kullanıcıdan gelen TCP bağlantısını kendi üzerlerinde sonlandırarak arkadaki sunucu ile aralarında yeni bir TCP bağlantısı açarlar ve iki bağlantı arasında trafiği koprülerler. Bu durumda uygulama sunucusunda istek yapan IP’yi loglamak istersek kullanıcı IP’si yerine LB’nin IP’sini loglamış oluruz. Uygulama sunucularının kullanıcıların IP’lerini öğrenmeleri gerektiğinde LB üzerinde X-Forwarded-For HTTP header'ının doldurulması için ayar yapılır. Böylece uygulama sunucuları LB'den gelen HTTP paketinde X-Forwarded-For header'ına bakarak LB IP'si yerine kullanıcının IP'sini elde edebilir.

Gerek yukarıda anlatılan senaryoda gerekse Sticky Session'ının cookie üzerinden yapılmak istendiği senaryoda LB'nin HTTP trafiğini anlaması yani HTTP paketini çözümlemesi gerekecektir, bu yapı LB'nin Layer 7'da çalışmasını zorunlu kılar. Bu tür LB'lere L7 LB adı verilir. Bunun yanında L3 (IP) ve L4 (UDP, TCP) LB'ler de vardır. L4 LB'ler sadece IP ve port bilgisinden hareket ederek yük dağıtımı sağlarlar. Uygulama (örneğin HTTP) özelinde bir parse işlemi yapmadıkları için L4 LB'ler, L7 LB'lara göre daha hızlı çalışırlar fakat daha az özellik sağlarlar.

HAProxy ve Nginx en bilinen yazılım tabanlı yük dağıtıcılardır. F5 ve Netscaler ise donanım tabanlı ünlü yük dağıtıcı markalarıdır. Donanım bazlı olan yük dağıtıcılar L4 modunda çalıştıkları zaman üzerlerinde bulunan ASIC donanımları sayesinde çok performanslı olarak yük dağıtım işlemini yapabilmektedirler. Yine donanım tabanlı olan yük dağıtıcılar, HTTPS konuşulan senaryoda SSL/TLS’i kendilerinde sonlandıp uygulama sunucusu ile HTTP konuşup uygulama sunucusunu SSL/TLS maliyetlerinden kurtarırlar. LB’ler üzerlerinde bulunan özelleştirilmiş devrelerle SSL/TLS’i uygulama sunucusundan çok daha efektif bir şekilde yapabilirler.

Son olarak LB’ler dağıtım tiplerini arkadaki sunuculara göre farklılaştırabilirler. Örneğin 4 Core ve 2 Core’lu iki sunucuya yönlendirme yapılıyorsa, yük ikisi arasında eşit bölünmektense Core sayısına orantılı olarak bölünebilir. LB’lerde, yeni bir isteğin yönlendirileceği sunucu belirlenirken Round-Robin yani eşit dağılım ya da Random yani rastgele dağılım seçilebilir. Rastgele dağılım herhangi bir hesap gerektirmemesinden ötürü bir miktar hızlı çalışacaktır.