Sunucu yük dengeleme mimarileri, Bölüm 1: Aktarım düzeyinde yük dengeleme

Sunucu grupları, sunucu grubunun istemcilere tek bir sunucu gibi görünmesini sağlayan bir teknik olan sunucu yük dengeleme yoluyla yüksek ölçeklenebilirlik ve yüksek kullanılabilirlik elde eder. Bu iki bölümlü makalede, Gregor Roth, açık kaynaklı çözümlere odaklanarak sunucu yük dengeleme mimarilerini araştırıyor. Bölüm 1, sunucu yük dengeleme temellerini ele alır ve aktarım düzeyinde sunucu yük dengelemesinin artılarını ve eksilerini tartışır. Bölüm 2, Bölüm 1'de tartışılan mimarilerin bazı sınırlamalarını ele alan uygulama düzeyinde sunucu yük dengeleme mimarilerini kapsar.

Birçok internet şirketi için giriş engeli düşüktür. İyi bir fikri olan herkes küçük bir uygulama geliştirebilir, bir alan adı satın alabilir ve gelen trafiği idare etmek için birkaç PC tabanlı sunucu kurabilir. İlk yatırım küçüktür, bu nedenle başlangıç ​​riski minimumdur. Ancak, başarılı bir düşük maliyetli altyapı hızla ciddi bir sorun haline gelebilir. Tüm gelen istekleri işleyen tek bir sunucu, işletme popüler hale geldiğinde yüksek trafik hacimlerini işleme kapasitesine sahip olmayabilir. Böyle bir durumda şirketler genellikle ölçek büyütmeye başlarlar : Daha fazla işlemcili daha büyük bir kutu satın alarak mevcut altyapıyı yükseltirler veya uygulamaları çalıştırmak için daha fazla bellek eklerler.

Bununla birlikte, ölçeği büyütmek yalnızca kısa vadeli bir çözümdür. Ve bu sınırlı bir yaklaşım çünkü yükseltme maliyeti, sunucu kapasitesindeki kazançlara göre orantısız bir şekilde yüksek. Bu nedenlerden dolayı çoğu başarılı İnternet şirketi, ölçeklendirme yaklaşımı izler . Uygulama bileşenleri, düşük maliyetli donanım ve işletim sistemlerine dayanan sunucu gruplarında birden çok örnek olarak işlenir. Trafik arttıkça sunucular eklenir.

Sunucu çiftliği yaklaşımının kendine özgü talepleri vardır. Yazılım tarafında, uygulamaları farklı sunucularda birden çok örnek olarak çalışabilecek şekilde tasarlamalısınız. Bunu, uygulamayı bağımsız olarak dağıtılabilen daha küçük bileşenlere bölerek yaparsınız. Uygulama bileşenleri durum bilgisiz ise bu önemsizdir. Bileşenler herhangi bir işlem durumunu korumadığından, herhangi biri aynı istekleri eşit şekilde işleyebilir. Daha fazla işlem gücü gerekiyorsa, sadece daha fazla sunucu ekler ve uygulama bileşenlerini kurarsınız.

Uygulama bileşenleri durum bilgili olduğunda daha zorlu bir sorun ortaya çıkar. Örneğin, uygulama bileşeni alışveriş sepeti verilerini tutuyorsa, gelen bir isteğin, talepte bulunan kişinin alışveriş sepeti verilerini tutan bir uygulama bileşeni örneğine yönlendirilmesi gerekir. Bu makalenin ilerleyen bölümlerinde, bu tür uygulama oturumu verilerinin dağıtılmış bir ortamda nasıl ele alınacağını tartışacağım. Ancak, karmaşıklığı azaltmak için çoğu başarılı İnternet tabanlı uygulama sistemi, mümkün olduğunda durum bilgisi olan uygulama bileşenlerinden kaçınmaya çalışır.

Altyapı tarafında, işlem yükü sunucu grupları arasında dağıtılmalıdır. Bu, sunucu yük dengeleme olarak bilinir. Yük dengeleme teknolojileri, örneğin ağ bağlantıları, CPU'lar veya sabit sürücüler gibi bileşenler arasında çalışma yaymak gibi diğer alanlarla da ilgilidir. Bu makale sunucu yük dengelemesine odaklanmaktadır.

Kullanılabilirlik ve ölçeklenebilirlik

Sunucu yük dengeleme, hizmet isteklerini bir grup gerçek sunucuya dağıtır ve bu sunucuların istemciler için tek bir büyük sunucu gibi görünmesini sağlar. Genellikle düzinelerce gerçek sunucu, tek bir sanal hizmeti uygulayan bir URL'nin arkasında bulunur.

Bu nasıl çalışıyor? Yaygın olarak kullanılan bir sunucu yük dengeleme mimarisinde, gelen istek, istemciye şeffaf olan özel bir sunucu yük dengeleyicisine yönlendirilir. Kullanılabilirlik veya mevcut sunucu yükü gibi parametrelere bağlı olarak, yük dengeleyici, isteği hangi sunucunun işlemesi gerektiğine karar verir ve bunu seçilen sunucuya iletir. Yük dengeleme algoritmasına gerekli giriş verilerini sağlamak için, yük dengeleyici ayrıca trafiğe yanıt verebildiklerini doğrulamak için sunucuların durumu ve yükü hakkında bilgi alır. Şekil 1, bu klasik yük dengeleyici mimarisini göstermektedir.

Şekil 1'de gösterilen yük dağıtıcı mimarisi, birkaç yaklaşımdan yalnızca biridir. Altyapınız için hangi yük dengeleme çözümünün en iyisi olduğuna karar vermek için kullanılabilirliği ve ölçeklenebilirliği göz önünde bulundurmanız gerekir .

Kullanılabilirlik, çalışma süresi ile tanımlanır - arızalar arasındaki süre. (Kapalı kalma süresi, arızayı tespit etme, onarma, gerekli kurtarma işlemini gerçekleştirme ve görevleri yeniden başlatma süresidir.) Çalışma süresi sırasında, sistem her isteğe önceden belirlenmiş, iyi tanımlanmış bir süre içinde yanıt vermelidir. Bu süre aşılırsa, istemci bunu bir sunucu arızası olarak görür. Temelde yüksek kullanılabilirlik, sistemdeki fazlalıktır: Bir sunucu arızalanırsa, diğerleri arızalı sunucunun yükünü şeffaf bir şekilde devralır. Bireysel bir sunucunun başarısızlığı istemci tarafından görünmez.

Ölçeklenebilirlik, sistemin yanıt süresi gibi hizmet kalitesi gereksinimlerini karşılayarak tek bir müşterinin yanı sıra binlerce eşzamanlı müşteriye de hizmet verebileceği anlamına gelir. Artan bir yük altında, yüksek ölçeklenebilir bir sistem, ek donanım kaynaklarının gücüyle orantılı olarak verimi neredeyse doğrusal olarak artırabilir.

Şekil 1'deki senaryoda gelen talebin sunucular üzerinden dağıtılmasıyla yüksek ölçeklenebilirliğe ulaşılmaktadır. Yük artarsa, yük dengeleyici darboğaz haline gelmediği sürece ek sunucular eklenebilir. Yüksek kullanılabilirliğe ulaşmak için, yük dengeleyici, istekleri aşırı yüklenmiş veya çalışmayan sunuculara iletmekten kaçınmak için sunucuları izlemelidir. Ayrıca, yük dengeleyicinin kendisi de yedekli olmalıdır. Bu noktayı bu makalede daha sonra tartışacağım.

Sunucu yük dengeleme teknikleri

Genel olarak, sunucu yük dengeleme çözümleri iki ana türdendir:

  • Taşıma düzeyinde yük dengeleme - DNS tabanlı yaklaşım veya TCP / IP düzeyinde yük dengeleme gibi - uygulama yükünden bağımsız olarak hareket eder.
  • Uygulama düzeyinde yük dengeleme, yük dengeleme kararları vermek için uygulama yükünü kullanır.

Yük dengeleme çözümleri ayrıca yazılım tabanlı yük dengeleyiciler ve donanım tabanlı yük dengeleyiciler olarak sınıflandırılabilir. Donanım tabanlı yük dengeleyiciler, belirli bir kullanım için özelleştirilmiş, uygulamaya özel tümleşik devreleri (ASIC'ler) içeren özel donanım kutularıdır. ASIC'ler, genel amaçlı bir işletim sisteminin ek yükü olmadan ağ trafiğinin yüksek hızda iletilmesini sağlar. Donanım tabanlı yük dengeleyiciler genellikle taşıma düzeyinde yük dengeleme için kullanılır. Genel olarak, donanım tabanlı yük dengeleyiciler, yazılım tabanlı çözümlerden daha hızlıdır. Dezavantajları maliyetleridir.

Donanım yük dengeleyicilerin aksine, yazılım tabanlı yük dengeleyiciler standart işletim sistemlerinde ve PC'ler gibi standart donanım bileşenlerinde çalışır. Yazılım tabanlı çözümler, Şekil 1'deki gibi özel bir yük dengeleyici donanım düğümü içinde veya doğrudan uygulama içinde çalışır.

DNS tabanlı yük dengeleme

DNS tabanlı yük dengeleme, erken sunucu yük dengeleme yaklaşımlarından birini temsil eder. İnternetin etki alanı adı sistemi (DNS), IP adreslerini bir ana bilgisayar adıyla ilişkilendirir. Tarayıcınıza bir ana bilgisayar adı (URL'nin bir parçası olarak) yazarsanız, tarayıcı, DNS sunucusunun ana bilgisayar adını bir IP adresine dönüştürmesini ister.

DNS tabanlı yaklaşım, DNS'nin Liste 1'deki DNS arama örneğinde gösterildiği gibi birden çok IP adresinin (gerçek sunucular) tek bir ana bilgisayar adına atanmasına izin verdiği gerçeğine dayanmaktadır.

Liste 1. Örnek DNS araması

>nslookup amazon.com Server: ns.box Address: 192.168.1.1 Name: amazon.com Addresses: 72.21.203.1, 72.21.210.11, 72.21.206.5

DNS sunucusu bir round-robin yaklaşımı uygularsa, belirli bir ana bilgisayarın IP adreslerinin sırası her DNS yanıtından sonra değişir. Genellikle tarayıcılar gibi istemciler bir DNS sorgusundan döndürülen ilk adrese bağlanmaya çalışır. Sonuç, birden çok istemciye verilen yanıtların sunucular arasında dağıtılmasıdır. Şekil 1'deki sunucu yük dengeleme mimarisinin aksine, ara yük dengeleyici donanım düğümü gerekmez.

DNS, yükün farklı konumlardaki veri merkezleri arasında dağıtılması gereken küresel sunucu yük dengelemesi için verimli bir çözümdür. Genellikle DNS tabanlı küresel sunucu yük dengeleme, yükü özel bir veri merkezi içinde dağıtmak için diğer sunucu yük dengeleme çözümleriyle birleştirilir.

Uygulaması kolay olmasına rağmen, DNS yaklaşımının ciddi dezavantajları vardır. DNS sorgularını azaltmak için, istemci DNS sorgularını önbelleğe alma eğilimindedir. Bir sunucu kullanılamaz hale gelirse, istemci önbelleği ve DNS sunucusu, ölü bir sunucu adresi içermeye devam edecektir. Bu nedenle, DNS yaklaşımı yüksek kullanılabilirliği uygulamak için çok az şey yapar.

TCP / IP sunucu yük dengeleme

TCP / IP sunucu yük dengeleyicileri, düşük seviyeli katman anahtarlamada çalışır. Popüler bir yazılım tabanlı düşük seviyeli sunucu yük dengeleyicisi, Linux Sanal Sunucusudur (LVS). Gerçek sunucular dış dünyaya tek bir "sanal" sunucu olarak görünür. Bir TCP bağlantısından gelen istekler, IP Sanal Sunucu (IPVS) kodunu içerecek şekilde yamalanmış bir Linux çekirdeği çalıştıran yük dengeleyici tarafından gerçek sunuculara iletilir.

Yüksek kullanılabilirliği sağlamak için çoğu durumda, pasif modda bir yük dengeleyici düğümü ile bir çift yük dengeleyici düğümü ayarlanır. Bir yük dengeleyici başarısız olursa, her iki yük dengeleyicide çalışan kalp atışı programı, pasif yük dengeleyici düğümünü etkinleştirir ve Sanal IP adresinin (VIP) devralınmasını başlatır. Yük dengeleyiciler arasındaki yük devretmeyi yönetmekten kalp atışı sorumlu olsa da, gerçek sunucuların sağlığını izlemek için basit gönderme / bekle komut dosyaları kullanılır.

İstemciye şeffaflık, yük dengeleyiciye atanan bir VIP kullanılarak sağlanır. Müşteri bir talepte bulunursa, önce istenen ana bilgisayar adı VIP'ye çevrilir. İstek paketini aldığında, yük dengeleyici, istek paketini hangi gerçek sunucunun işlemesi gerektiğine karar verir. İstek paketinin hedef IP adresi, gerçek sunucunun Gerçek IP'sine (RIP) yeniden yazılır. LVS, istekleri gerçek sunuculara dağıtmak için çeşitli planlama algoritmalarını destekler. Genellikle, DNS tabanlı yük dengelemeye benzer şekilde, sıralı zamanlama kullanmak üzere ayarlanır. LVS ile, yük dengeleme kararı TCP seviyesinde (OSI Referans Modelinin Katman 4'ü) verilir.

İstek paketini aldıktan sonra, gerçek sunucu onu ele alır ve yanıt paketini döndürür. Yanıt paketini yük dengeleyici aracılığıyla döndürülmeye zorlamak için, gerçek sunucu VIP'yi varsayılan yanıt yolu olarak kullanır. Yük dengeleyici yanıt paketini alırsa, yanıt paketinin kaynak IP'si VIP (OSI Model Layer 3) ile yeniden yazılır. Bu LVS yönlendirme moduna, Ağ Adresi Çevirisi (NAT) yönlendirmesi denir. Şekil 2, NAT yönlendirmesini kullanan bir LVS uygulamasını gösterir.

LVS, Direct Server Return gibi diğer yönlendirme modlarını da destekler. Bu durumda yanıt paketi, gerçek sunucu tarafından doğrudan istemciye gönderilir. Bunu yapmak için VIP'nin tüm gerçek sunuculara da atanması gerekir. Sunucunun VIP'sini ağ için çözümlenemez hale getirmek önemlidir; aksi takdirde yük dengeleyiciye erişilemez hale gelir. Yük dengeleyici bir istek paketi alırsa, isteğin MAC adresi (OSI Model Katman 2) IP adresi yerine yeniden yazılır. Gerçek sunucu istek paketini alır ve işler. Kaynak IP adresine bağlı olarak yanıt paketi, yük dengeleyiciyi atlayarak istemciye doğrudan gönderilir. Web trafiği için bu yaklaşım, dengeleyici iş yükünü önemli ölçüde azaltabilir. Tipik olarak, istek paketlerinden çok daha fazla yanıt paketi aktarılır. Örneğin, bir Web sayfası talep ederseniz, genellikle yalnızca bir IP paketi gönderilir. Daha büyük bir Web sayfası istenirse,İstenen sayfayı aktarmak için birkaç yanıt IP paketi gereklidir.

Önbelleğe almak

LVS gibi düşük seviyeli sunucu yük dengeleyici çözümleri, uygulama düzeyinde önbelleğe alma veya uygulama oturumu desteği gerekirse sınırlarına ulaşır. Önbelleğe alma, aynı verileri tekrar tekrar getiren pahalı işlemlerden kaçınmak için önemli bir ölçeklenebilirlik ilkesidir. Önbellek, önceki bir veri getirme işleminden kaynaklanan gereksiz verileri tutan geçici bir depodur. Bir önbelleğin değeri, verileri alma maliyetine karşı isabet oranı ve gerekli önbellek boyutuna bağlıdır.

Yük dengeleyici planlama algoritmasına bağlı olarak, bir kullanıcı oturumunun istekleri farklı sunucular tarafından ele alınır. Sunucu tarafında bir önbellek kullanılıyorsa, başıboş istekler sorun haline gelecektir. Bununla başa çıkmanın bir yolu, önbelleği küresel bir alana yerleştirmektir. memcached, birden çok makinede büyük bir önbellek sağlayan popüler bir dağıtılmış önbellek çözümüdür. Belirli bir önbellek girişi için önbellek sunucusunu (arka plan programı) belirlemek için tutarlı karma kullanan bölümlenmiş, dağıtılmış bir önbellektir. Önbellek anahtarının karma koduna bağlı olarak, istemci kitaplığı her zaman aynı karma kodunu aynı önbellek sunucusu adresine eşler. Bu adres daha sonra önbellek girişini saklamak için kullanılır. Şekil 3, bu önbelleğe alma yaklaşımını göstermektedir.

Liste 2 spymemcached, birden çok makinede mesajları memcachedönbelleğe almak için Java ile yazılmış bir istemci kullanır HttpResponse. spymemcachedKütüphane uygular Sadece tarif gerekli istemci mantığı.

Liste 2. memcached tabanlı HttpResponse önbelleği