Yük dengeleme
- 9 dakika
Trafik arttığında yeni VM'leri çevrimiçi duruma getirerek ölçeği genişletmek, talebi karşılama açısından verimli bir ölçeklendirme stratejisidir. VM'lerin hızlı bir şekilde sağlanabilmesi, esneklik elde etmeyi sağlayan temel özelliklerdendir. Ancak ek sunucuları çevrimiçi yapmak, trafik bu sunucular arasında dağıtılmadıkça yararlı olmaz. Bu durum, sistemin artan yükü karşılamasına yardımcı olur. Bu nedenle yük dengeleme; bir göreve adanmış kaynak sayısını dinamik olarak ayarlayabildiğinden esneklik açısından kritik önemdedir.
Yük dengeleme için iki temel gereksinim vardır. Bunlardan birincisi, paralel işleme sayesinde performansın artırılmasıdır. Tek bir sunucunun belirli bir zaman aralığında 5.000 istek işlemesi halinde kusursuz bir yük dengeleme ile 10 sunucu aynı zamanda 50.000 isteği işlemesi mümkündür. İkincisi ise yük dengeleme gerçekleştirilen kaynakların daha yüksek kullanılabilirlik sunmasıdır. Yük dengeleyici, belirli bir isteği yoğun yük altındaki bir sunucuya yönlendirmek yerine yükü daha az olan bir sunucuya yönlendirebilir. Ayrıca yük dengeleyici, çevrimdışı olan sunucuları tespit ederek istekleri diğer sunuculara iletebilir.
Yük dengeleme nedir?
İyi bilinen yük dengeleme biçimlerinden biri, hepsini bir kez deneme DNS olarak bilinen yöntemdir. Çoğu büyük çaplı web hizmeti, istekleri çok sayıdaki sunucuya dağıtmak için bu yöntemi kullanmaktadır. Bu yöntemde her biri benzersiz bir IP adresine sahip olan birden fazla ön uç sunucusuna aynı DNS adı atanır. Google gibi büyük şirketler, her bir web sunucusundaki istek sayısını dengelemek için her bir DNS girişi için IP adreslerinden oluşan bir havuz oluşturur ve bunu yönetir. bir istemci istekte bulununca (örneğin, www.google.com) Google'ın DNS'i havuzdan kullanılabilir adreslerden birini seçer ve istemciye gönderir. IP adreslerini göndermek için kullanılan en basit strateji, her bir DNS yanıtından sonra adres listesinin değiştirildiği hepsini bir kez deneme kuyruğunu kullanmaktır.
Bulut kullanılmaya başlamadan önce DNS yük dengeleme, uzak mesafe bağlantılarının gecikme süresini azaltmak için kullanılan temel yöntemlerden biriydi. DNS sunucusundaki dağıtıcı, istemciye coğrafi açıdan en yakın olan sunucunun IP adresiyle yanıt verecek şekilde programlanıyordu. Bunu yapmanın en kolay yolu, havuzdaki IP adreslerinden istemcinin IP adresine sayısal olarak en yakın olanıyla yanıt vermekti. IP adresleri global hiyerarşiyle dağıtılmadığından bu yöntem pek güvenilir değildi. Günümüzde kullanılan gelişmiş teknikler, IP adreslerini İnternet Hizmet Sağlayıcılarının (İSS) fiziksel haritalarına göre konumlarla eşleştiren yazılımlardan faydalanmaktadır. Bu eşleme, yüksek maliyetli bir yazılım araması şeklinde uygulandığından bu yöntem daha iyi sonuçlar vermektedir ancak işlem maliyetleri yüksektir. Ancak DNS arama işlemi yalnızca istemci sunucuya ilk kez bağlandığında gerçekleştirildiğinden yavaş arama maliyetleri amorti edilmektedir. Sonraki tüm iletişimler doğrudan istemci ile gönderilen IP adresine sahip olan sunucu arasında gerçekleştirilir. Şekil 9'da bir DNS yük dengeleme şeması örneği gösterilmiştir.
Şekil 9: Bulut ortamında yük dengeleme.
Bu yöntemin dezavantajı, sunucuda bir hata olması durumunda farklı bir IP adresine yapılacak geçişin, DNS önbelleğindeki Yaşam Süresi (TTL) yapılandırmasına bağlı olmasıdır. DNS girişleri genellikle uzun ömürlü olur ve güncelleştirmelerin yayılması bir haftayı aşabilmektedir. Bu da sunucu hatalarını istemciden hızlıca "gizlemenin" zor olması anlamına gelir. Önbellekteki bir IP adresinin geçerlilik (TTL) süresini düşürmek bu konuda fayda sağlar ancak bunun sonucunda performans düşer ve arama sayısı artar.
Modern yük dengeleme yöntemlerinde genellikle gelen isteklerin arka uç sunucularına gönderilmesi için ayrılmış örnek (veya örnek çifti) kullanılır. Yük dengeleyici, belirtilen bağlantı noktasına gelen her bir istek için trafiği dağıtım stratejisine bağlı olarak arka uç sunucularından birine yönlendirir. Yük dengeleyici bunu yaparken uygulama protokolü üst bilgileri (örneğin, HTTP üst bilgileri) gibi bilgiler dahil olmak üzere istek meta verilerini korur. Bu durumda her istek yük dengeleyiciden geçtiği için bilgilerin eskimesi söz konusu değildir.
Tüm ağ yük dengeleyici türleri, istekleri bağlam ile birlikte arka uç sunucularına yönlendirir ancak yanıtı istemciye geri gönderme aşamasında iki temel stratejiden biri kullanılabilir1:
Ara Sunucu: Bu yaklaşımda yük dengeleyici, yanıtı arka uçtan alır ve istemciye geri gönderir. Yük dengeleyici, standart bir web ara sunucusu olarak davranır ve ağ iletişiminin iki yarısında da (isteğin istemciye iletilmesi ve yanıtın geri gönderilmesi) rol alır.
TCP İletimi: Bu yaklaşımda istemci ile TCP bağlantısı arka uç sunucusuna devredilir ve sunucu, yanıtı yük dengeleyiciden geçirmeden doğrudan istemciye gönderir.
TCP İletimi stratejisi, Şekil 10'da gösterilmiştir.
Şekil 10: Dağıtıcıdan arka uç sunucusuna TCP İletim mekanizması.
Yük dengelemenin avantajları
Yük dengelemenin avantajlarından biri, sistemdeki hataların maskelenmesine yardımcı olmasıdır. İstemciye birden fazla kaynağı temsil eden tek bir uç noktanın gösterilmesi durumunda bağımsız kaynaklarda oluşan hatalar, isteklerin diğer kaynaklara yönlendirilmesiyle istemciden gizlenir. Ancak bu durumda yük dengeleyicinin kendisi tek hata noktası haline gelir. Herhangi bir nedenle hata vermesi halinde tüm arka uç sunucuları çalışıyor olsa dahi hiçbir istemci isteği işleme alınmaz. Bu nedenle yüksek kullanılabilirlik elde etmek için yük dengeleyiciler genellikle çiftler halinde dağıtılır.
Daha da önemlisi yük dengeleme, iş yüklerini buluttaki farklı işlem kaynaklarına dağıtarak yanıt hızını artırır. Bulutta tek bir işlem örneğine sahip olmanın getirdiği birçok sınırlama vardır. Artan iş yükleriyle birlikte kaynak sayısının artırılması gibi performansla ilgili fiziksel sınırlamalara, önceki modüllerde yer verilmişti. Yük dengeleme kullanıldığında büyük iş yüklerinin birden fazla kaynağa dağıtılmasıyla her bir kaynağın istekleri bağımsız ve diğerlerine paralel bir şekilde gerçekleştirmesi ve uygulamanın toplam performansını artırması mümkündür. Ayrıca iş yükünü karşılayacak sunucu sayısı arttığından yük dengeleme ortalama yanıt sürelerini de kısaltır.
Durum denetimleri, başarılı yük dengeleme stratejileri oluşturma açısından oldukça önemlidir. Bir yük dengeleyicinin, kullanılamaz duruma gelen kaynakları tespit etmesi önemlidir. Bu sayede bu kaynaklara trafik iletmeyi durdurabilir. Yük dengeleyicinin sunuculara İnternet Denetim İletisi Protokolü (ICMP) istekleriyle "ping gönderdiği" ping-yanıt izleme yöntemi, belirli kaynakların durumunu denetlemek için kullanılan en popüler taktiklerden biridir. Bazı yük dengeleme stratejileri, trafik gönderirken kaynakların durumunun yanı sıra performans, gecikme süresi ve CPU kullanımı gibi farklı ölçümleri de dikkate alır.
Yük dengeleyicilerin genellikle yüksek kullanılabilirlik garantisi vermesi gerekir. Bunu yapmanın en kolay yolu, birden fazla yük dengeleme örneği (her biri benzersiz IP adresine sahip olan) oluşturmak ve bunları tek bir DNS adresine bağlamaktır. Herhangi bir nedenden dolayı bir yük dengeleyicinin başarısız olması durumunda yerini bir başkası alır ve tüm trafik, yük devretme örneğine devredilir. Bu sayede performans minimum düzeyde etkilenmiş olur. Aynı anda yeni bir yük dengeleyici örneği, başarısız olanın yerini alacak şekilde yapılandırılabilir ve DNS kayıtlarının hemen güncelleştirilmesi gerekir.
Yük dengeleyiciler, istekleri arka uç sunucularına dağıtmaya ek olarak sunucuların üzerindeki yükü azaltmaya ve genel performansı artırmaya yönelik mekanizmalardan da faydalanır. Bu mekanizmalardan bazıları şunlardır:
SSL yük boşaltması: HTTPS bağlantıları üzerinden gerçekleştirilen trafik şifrelendiğinden performans üzerindeki etkisi daha fazladır. Tüm isteklerin Güvenli Yuva Katmanı (SSL) üzerinden sunulması yerine istemci ile yük dengeleyici arasındaki bağlantı SSL üzerinden, sunuculara yapılan yönlendirme istekleri ise şifrelenmemiş HTTP üzerinden yapılabilir. Bu teknik, sunuculardaki yükü önemli ölçüde azaltır. Ayrıca yönlendirme istekleri açık bir ağ üzerinden yapılmadığı sürece güvenlik de sağlanmış olur.
TCP arabelleğe alma: Yük dengeleyici bağlantıları yavaş olan istemcileri boşaltarak bu istemcilere yanıt sunan sunucuları rahatlatmaya yönelik bir stratejidir.
Önbelleğe alma: Bazı senaryolarda yük dengeleyici, sunucuların yükünü azaltmak için çoğu popüler isteğe (veya statik içerik gibi sunuculara gitmeden işlenebilecek isteklere) yönelik bir önbellek tutabilir.
Trafik şekillendirme: Bir yük dengeleyici bu tekniği kullanarak trafiği sunucu yapılandırmasına iyileştirme amacıyla paket akışını geciktirebilir veya paket önceliklerini değiştirebilir. Bu, bazı istekler için hizmet kalitesini etkiler ancak gelen yüklerin karşılanmasını sağlar.
Yük dengeleme işleminin gerçekleştirilebilmesi için yük dengeleyicinin ağır yük altında olmaması gerektiğini unutmayın. Aksi takdirde yük dengeleyici, performans sorunu haline gelir. Neyse ki yük dengeleyiciler, aldıkları istekler üzerinde çok az işlem gerçekleştirir ve isteklerin yanıtlara dönüştürülmesi işlemi arka uç sunucular tarafından gerçekleştirilir.
Tarafsız gönderme
Bulutta kullanılan birçok farklı yük dengeleme stratejisi vardır. En yaygın türlerden biri, basit bir hepsini bir kez deneme algoritması kullanarak trafiği tüm düğümlere eşit bir şekilde dağıtan tarafsız gönderme yöntemidir. Bu yöntemde sistem kaynaklarının kullanımı veya istek yürütme süresi dikkate alınmaz. Bu yaklaşım, sistemdeki her bir düğümü çalıştırmaya yöneliktir ve uygulaması en kolay yöntemlerden biridir.
AWS, Elastic Load Balancer (ELB) hizmetinde bu yaklaşımı kullanmaktadır. ELB, trafiği bağlı EC2 örnekleri arasında dengeleyen yük dengeleyiciler sağlar. Yük dengeleyiciler de temelde trafik yönlendirmek için özel bir hizmet çalıştıran EC2 örnekleridir. Yük dengeleyicinin arkasındaki kaynakların ölçeği genişletildiğinde, yeni kaynakların IP adresleri yük dengeleyicinin DNS kaydında güncelleştirilir. Bu işlem için hem izleme hem de sağlama süresine ihtiyaç duyulduğundan, tamamlanması birkaç dakika sürer. Yük dengeleyici daha fazla yükü karşılamaya hazır hale gelene kadar geçen ölçeklendirme süresine yük dengeleyicinin "ısınma" süresi denir.
AWS yük dengeleyiciler ayrıca durum denetimi gerçekleştirme amacıyla iş yükü dağıtmak üzere kendilerine bağlanmış olan kaynakları izler. Tüm kaynakların iyi durumda olduğundan emin olmak için bir ping-yanıt mekanizması kullanılır. ELB kullanıcıları, gecikme süresini ve yeniden deneme sayısını belirleyerek durum denetimi parametrelerini yapılandırabilir.
Karma tabanlı dağıtım
Bu yaklaşımda, bir oturum boyunca aynı istemciden gelen isteklerin her seferinde aynı sunucuya yönlendirilmesi amaçlanır. Bunun için her bir isteği tanımlayan bir meta veri karması oluşturulur ve bu karma kod kullanılarak sunucu seçimi gerçekleştirilir. Karma oluşturma işleminin doğru şekilde yapılması durumunda istekler, sunuculara nispeten eşit bir şekilde dağıtılır. Bu yaklaşımın avantajlarından biri, oturum algılamalı uygulamalar için uygun olmasıdır. Oturum verilerini veritabanı veya Redis önbelleği gibi paylaşılan bir veri deposuna yazmak yerine bellek içinde depolayabilir. Dezavantajı ise her bir istek için karma oluşturulması ve bunun sonucunda az da olsa bir gecikme süresi yaşanmasıdır.
Azure Load Balancer, yük dağıtımı için karma tabanlı bir mekanizma kullanır. Bu mekanizma kaynak IP adresi, kaynak bağlantı noktası, hedef IP adresi, hedef bağlantı noktası ve protokol türünü dikkate alarak her bir istek için bir karma oluşturur ve bu sayede normal koşullarda aynı oturuma ait olan tüm paketlerin aynı arka uç sunucusuna ulaşmasını sağlar. Bağlantıların sunuculara rastgele bir şekilde dağıtılması için karma işlevi seçilir.
Diğer yük dengeleme stratejileri
Belirli bir sunucunun bir isteği (veya bir istek kümesini) işleme konusunda zorlandığı durumlarda, hepsini bir kez deneme veya karma tabanlı gönderme algoritmalarını kullanan yük dengeleyiciler bu sunucuya istek göndermeye devam edecektir. Farklı kaynaklarda yük dengeleme gerçekleştirirken kapasiteyi dikkate alan daha gelişmiş stratejiler de mevcuttur. Kapasiteyi izlemek için en yaygın şekilde kullanılan iki ölçüm şunlardır:
İstek yürütme süresi: Bu ölçümü temel alan stratejilerde öncelik zamanlama algoritması kullanılır ve istekler için hedef seçme aşamasında istek yürütme süreleri dikkate alınır. Bu yaklaşımı kullanmanın temel zorluğu, yürütme sürelerini doğru şekilde ölçmektir. Yük dengeleyici, isteklerin sunuculara gönderildiği zamanla yanıtın döndürüldüğü zaman arasındaki farkı depolayan bir bellek içi tablo kullanarak (ve bunu sürekli güncelleştirerek) yürütme süreleriyle ilgili tahminde bulunabilir.
Kaynak kullanımı: Bu ölçümü temel alan stratejilerde, düğümler arasındaki kullanımı dengelemek için CPU kullanım oranları dikkate alınır. Yük dengeleyici, kaynakların kullanım oranına göre düzenlenmiş olan sıralı bir liste tutar ve aldığı her bir isteği en düşük yüke sahip olan kaynağa yönlendirir.
Yük dengeleme, ölçeklenebilir bulut hizmetleri sağlama açısından kritik öneme sahiptir. Trafiğin arka uç kaynakları arasında etkili bir şekilde dağıtılması için verimli bir yöntem kullanılmadığı sürece kaynakların ihtiyaç duyulduğunda oluşturulması ve gerek kalmadığında kullanımdan kaldırılması ile sağlanan esneklik oldukça sınırlı olur.
Başvurular
- ^ Aron, Mohit and Sanders, Darren and Druschel, Peter and Zwaenepoel, Willy (2000). "Küme tabanlı ağ sunucularında ölçeklenebilir içerik kullanan istek dağıtımı." 2000 Yıllık USENIX teknik konferansının bildirileri.