Bir yazılım yük dengeleyicisini ölçeklendirmek için tipik bir yöntem nedir?


22

Çoğu uygulama sunucusunun önünde SLB / ters proxy'li web uygulaması mimarilerini sık sık görüyorum.

SLB'ye bağlantı sayısı, tek bir SLB'nin etkili bir şekilde ele alınması için çok fazla kaynak gerektirdiğinde ne olur ? Somut ve üst düzey bir örnek için, 2 milyon kalıcı HTTP bağlantısı düşünün. Açıkçası, tek bir SLB bunun üstesinden gelemez.

Ölçekleme için önerilen konfigürasyon nedir dışarı bir SLB?

Bir LB grubu / kümesi oluşturmak tipik midir? Öyleyse, müşteri yükü LB grubu arasında nasıl yayılır?


z8000, Hangi yazılımı yük dengeleyici kullandığınızı söyleyebilir misiniz? Ayrıca, mümkünse yük dengeleme için hangi algoritmayı / protokolü kullanır.
Martin

Tercihim yok. Daha net olması için soruyu güncelledim.
z8000

Bir yük dengeleyicinin neden 2 milyon kalıcı HTTP bağlantısını yapamadığı açık değil.
womble

Yanıtlar:


10

Yük dengeleyiciler, diğer yük dengeleyiciler tarafından kolayca ölçeklenemez çünkü doğal olarak bağlantıları koruyan zincir üzerinde tek bir yük dengeleyici bulunur. Bununla birlikte, LVS veya HAProxy gibi dengeleyiciler Gbps aralığında saçma kapasitesine sahiptir. Tek bir yük dengeleyicinin (yazılım, donanım, ne olursa olsun) yeteneklerinin ötesine geçtikten sonra, yuvarlak DNS DNS gibi diğer tekniklere geçmeniz gerekir.


Sağ! Tek LB'ye sahip olmak "problem" dir. Verimliliğin genelde bir sorun olmayacağı konusunda hemfikirim. Ancak benim durumum sınırlı olan RAM gibi diğer kaynaklar konusunda endişeliyim. RAM bitmeden önce yalnızca bir SLB'de barındırılabilecek çok fazla bağlantı var.
z8000

HAProxy, GB RAM başına yaklaşık 20k-60k aktif seansta kullanılabilir. LVS'nin daha fazlasını yapabileceğine inanıyorum, çünkü tutulan oturum verileri daha küçük. RAM'iniz tükenirse, onu yükseltin veya round-robin DNS sistemi tarafından yönlendirilen başka bir yük dengeleyici kurun.
Hyppy

1
"Yük dengeleyiciler diğer yük dengeleyiciler tarafından kolayca ölçeklendirilemez" - aslında tek bir ASIC tabanlı L4 yük dengeleyici, çoğu kez mükemmel sonuçlar veren birkaç L7 HTTP tabanlı yük dengeleyicisinin önüne yerleştirilebilir. Aynı temel ilke sadece yazılım uygulamaları için de geçerlidir, örneğin nignx'ın önündeki Linux LVS.
Jesper M,

19

Tamam, zaten kabul edilmiş bir cevap var, fakat eklenmesi gereken bir şey var . Yük dengeleyici seviyesini ölçeklemenin en yaygın “klasik” yöntemleri (özel bir sıra ile değil):

  • DNS Round Robin , etki alanı için birden fazla IP adresi yayınlayacak. Her IP adresi için yüksek oranda kullanılabilir bir sunucu çifti uygulayın (bir IP adresini her zaman çalışır durumda tutmak için işbirliği yapan 2 sunucu.) Her IP, ya yük dengeleme yazılımı olan cihazları veya sunucuları kullanarak bir yük dengeleyici kümesine karşılık gelir. Gerektiğinde daha fazla yük dengeleyici çifti ekleyerek yatay olarak ölçeklendirin.

  • Yönlendirme veya güvenlik duvarı , yükü birden fazla yük dengeleyicisine yaymak için tweaks . Ön yönlendiriciye veya ön güvenlik duvarına , kaynak IP adresini birleştirerek , yük dengeleyiciler için birden fazla eşit maliyetli rotaya sahip olarak , gelen bağlantıları birkaç IP adresine (her biri bir yük dengeleyici çiftini temsil eder) yaymalarını sağlayın.

  • Bir HTTP seviyesi yük dengeleyici katmanının önünde bir IP seviyesi yük dengeleyici katmanı . IP-katmanlı yük dengeleme, ASIC'ler / silikonda uygulanabilir ve bazı şeyler için hızlı bir şekilde kötüleştirilebilir. Böylece, tek bir IP yük dengeleyici çifti genellikle birkaç HTTP / HTTPS seviyeli yük dengeleyicisine 'ayak uydurabilir' ve mimariyi güzel ve basit tutarken çoklu gigabit performans seviyeleri sağlayabilir.

Yukarıda belirtilen farklı şekillerde tamamen derinlemesine gitmek çok uzun bir cevap gerektirir. Ancak genel olarak, yük dengeleyici katmanını ölçeklemek zor değildir, uygulama sunucusu katmanını ve özellikle de veritabanı katmanını ölçeklendirmek çok zordur.

Bir cihaz form faktörü (F5, Cisco, A10) veya genel bir sunucu (Windows / Linux + yazılımı) seçtiğinizden daha az önemli. Yük dengeleyici katmanını ölçeklendirirken göz önünde bulundurulması gereken önemli noktalar şunlardır:

  • Devlet dolusu ve vatansız. Yapışkan seanslara kesinlikle ihtiyacın var mı yoksa onsuz yaşayabilir misin? Durumda kalmamak her şeyi kolaylaştırır.
  • Yük dengeleme için 'donanım' (ASIC'ler) ve 'yazılım' (genel amaçlı sunucular). Her birinin avantajları ve dezavantajları vardır, yukarıda verilen HAProxy'ye genel bakış belgelerine bakın.
  • L3 / 4 (IP / TCP / IP) yük dengelemeye karşı L7 (HTTP) yük dengelemeye karşı. Yine, artıları ve eksileri, HAProxy doc iyi bir genel bakış sağlar.
  • SSL sonlandırması , burada, web düğümlerinde veya yük dengeleyici üzerinde.

Genel olarak, web siteniz çok genişlemeden önce bu konuda endişelenmenize gerek yoktur - fx nginx'e sahip tek bir modern sunucu, saniyede onbinlerce düz HTTP isteğini karşılayacaktır. Bu yüzden erken optimizasyon yapmayın, yapmadan önce bununla ilgilenmeyin.


DNS RR kullanarak gerçekten erişilebilir olması için her bir IP adresine aslında ihtiyacınız yoktur . Tarayıcılar, genel olarak, eğer bağlantı kuramadıklarında mevcutsa, başka bir IP'ye geri döner. Ancak herkese açık web servisleriniz varsa, her bir IP adresi için HA'ya ihtiyacınız olacaktır, çünkü birçok web servis kütüphanesi diğer IP'lere otomatik olarak başarısızlık yapmaz.
rmalayter

9

Bir HTTP yük dengeleme katmanını ölçeklendirmenin anahtarı, önce başka bir alt düzey (IP veya TCP) yük dengeleme katmanı eklemektir. Bu katman tamamen açık kaynak kodlu bir yazılımla oluşturulabilir, ancak modern yönlendiricilere sahipseniz daha iyi sonuçlar alırsınız.

Akışlar (TCP oturumları) olmalıdır karma gittikleri frontend karar vermek, bu tür kaynak / hedef IP ve TCP portları olarak başlıklarını kullanarak. Ayrıca, bir ön uç öldüğünde, kullanılmayı bıraktığından emin olmak için bir mekanizmaya ihtiyacınız vardır.

Çeşitli stratejiler var, milyonlarca kullanıcıya hizmet veren sitelerde prodüksiyonda kullandığım bir çiftin ana hatlarını çizeceğim, böylece fikir edinebilirsiniz. Her şeyi ayrıntılarıyla açıklamak çok uzun sürecek, ancak umarım bu cevap size başlamak için yeterli bilgi / işaretçi verecektir. Bu çözümleri uygulamak için, ağ oluşturma konusunda gerçekten bilgili birisine ihtiyacınız olacak.

Kuşkusuz, burada tarif ettiğimin uygulanması, diğer cevaplarda anlatılanlardan çok daha zordur, ancak büyük ölçeklenebilirlik sorunları ve% 99,9'dan daha fazla kullanılabilirlik gereksinimleri olan yüksek trafikli bir web siteniz varsa, bu gerçekten de son teknolojidir. . Zaten bir ağ mühendisine sahipseniz, dengeleme cihazlarına göre kurulum ve çalıştırma (hem capex hem de opex) daha düşük maliyetlidir ve neredeyse hiçbir ek ücret ödemeden daha fazla ölçeklendirilebilir (vs. Mevcut modelinizi aştığınızda pahalı bir cihaz).

İlk strateji: güvenlik duvarı ile

Muhtemelen, ISS'nizin bağlı olduğu birkaç yönlendiriciniz vardır. ISS'niz 2 bağlantı sağlar (aktif / pasif, VRRP kullanarak). Yönlendiricilerinizde, VRRP'yi de kullanırsınız ve ortak ağınıza giden trafiği bir güvenlik duvarına yönlendirirsiniz. Güvenlik duvarları ( FW 1ve FW 2altındaki) ayrıca aktif / pasiftir ve trafiği filtreler ve her bir akışı sağlıklı bir ön uç sunucusuna gönderir (HTTP yük dengeleyiciniz FE 1ve FE 2aşağıda).

      + -------------- + + -------------- +
      | ISS yönlendiricisi A | | ISS yönlendiricisi B |
      + -------------- + + -------------- +
             | |
           == # ======================== = = = (genel ağ)
             | |
      + --------------- + + --------------- +
      | Yönlendiriciniz A | | Yönlendiriciniz B |
      + --------------- + + --------------- +
             | |
           == # ===== # =========== # ===== # == (RFC 1918 özel ağ)
             | | | |
       + ------ + + ------ + + ------ + + ------ +
       | FW 1 | | FE 1 | | FE 2 | | FW 2 |
       + ------ + + ------ + + ------ + + ------ +

Hedef şu şekilde bir akışa sahip olmaktır:

  1. ISS, IP’lerinize giden trafiği aktif yönlendiricinize yönlendirir.
  2. Yönlendiricileriniz trafiği bir RFC 1918 adresi kullanan bir VIP'ye yönlendirir . Bu VIP, VRRP'ye benzeyen aktif güvenlik duvarına aittir. Güvenlik duvarı ihtiyaçlarınız için OpenBSD kullanıyorsanız , VRRP / HSRP'ye patentsiz bir alternatif olan CARP kullanabilirsiniz .
  3. Güvenlik duvarınız filtreyi uygular (örneğin, "bu özel IP adresine yalnızca 80 / tcp ve 443 / tcp izin verir").
  4. Güvenlik duvarınız ayrıca bir yönlendirici olarak da işlev görür ve paketleri sağlıklı bir arayüze iletir.
  5. Frontend'iniz TCP bağlantısını sonlandırır.

Şimdi sihir 4. ve 5. adımda gerçekleşiyor, o yüzden ne yaptıklarını daha ayrıntılı olarak görelim.

Güvenlik duvarınız ön kısımların listesini ( FE 1ve FE 2) bilir ve bunlardan birini akışın belirli bir yönüne göre seçer (örneğin, kaynak IP ve bağlantı noktasını diğer başlıklar arasında alarak). Ancak, trafiği sağlıklı bir uç uca yönlendirdiğinden emin olması gerekir, aksi takdirde trafiği kararacaksınız. Örneğin OpenBSD kullanıyorsanız, kullanabilirsiniz relayd. Nerelaydbasit: tüm ön uçlarınızı (örneğin, onlara bir prob HTTP isteği göndererek) sağlık kontrolü yapar ve bir ön uç sağlıklı olduğunda, güvenlik duvarının belirli bir akış paketinin bir sonraki sekmesini seçmek için kullandığı bir tabloya ekler. . Bir ön uç sağlık kontrollerini geçemezse, tablodan çıkarılır ve artık hiçbir paket gönderilmez. Bir paketi bir ön uca iletirken, tüm güvenlik duvarı, paketin hedef MAC adresini, seçilen ön uç ile aynı olacak şekilde değiştirir.

5. adımda, kullanıcıdan gelen paketler yük dengeleyiciniz tarafından alınır (Varnish, nginx veya her neyse). Bu noktada, paket hala genel IP adresinize yönlendirilmiştir, bu yüzden VIP (ler) ini geridöngü arabirimine takmanız gerekir. Buna DSR (Doğrudan Sunucu Dönüşü) denir , çünkü ön uçlarınız TCP bağlantısını sonlandırır ve güvenlik duvarı yalnızca tek yönlü trafiği görür (yalnızca gelen paketler). Yönlendiriciniz giden paketleri doğrudan ISS'nin yönlendiricilerine yönlendirecektir. Bu, HTTP trafiği için özellikle iyidir, çünkü istekler, yanıtlardan daha küçük olma eğilimindedir; Sadece açık olmak gerekirse: Bu bir OpenBSD'ye özgü bir şey değildir ve yoğun trafik çeken web sitelerinde yaygın olarak kullanılmaktadır.

Sorunlar:

  • DSR kullandığınız için son kullanıcılar doğrudan ön uç sunucularınıza bağlanır. Belki de zaten durum buydu, ancak değilse, yeterince güvenli olduklarından emin olmalısınız.
  • OpenBSD kullanıyorsanız, çekirdeğin tek iş parçacıklı olduğuna dikkat edin, böylece tek bir CPU çekirdeğinin performansı bir güvenlik duvarının verimini sınırlayacaktır. NIC türünüze ve gördüğünüz paket oranına bağlı olarak bir sorun olabilir. Bu sorunu çözmenin yolları var (aşağıda daha fazlası).

İkinci strateji: güvenlik duvarı olmadan

Bu strateji daha etkilidir ancak kurulumu zordur, çünkü sahip olduğunuz yönlendiricilerin özelliklerine daha fazla bağlıdır. Buradaki fikir yukarıdaki güvenlik duvarını atlamak ve yönlendiricilerin güvenlik duvarlarının yaptığı tüm işleri yapmasını sağlamaktır.

Bağlantı noktası başına L3 / L4 ACL'leri, BGP ve ECMP'yi ve İlke Tabanlı Yönlendirmeyi (PBR) destekleyen yönlendiricilere ihtiyacınız olacaktır . Yalnızca high-end router'lar bu özellikleri desteklemektedir ve BGP'yi kullanmak için genellikle ekstra lisans ücretleri vardır. Bu genellikle donanım yük dengeleyicilere göre hala daha ucuzdur ve ölçeklendirilmesi de çok kolaydır. Bu üst düzey yönlendiricilerle ilgili iyi bir şey, hat oranı olma eğiliminde olmalarıdır (örneğin, 10GbE arayüzlerinde bile bağlantıyı her zaman en üst düzeye çıkarabilirler, çünkü aldıkları tüm kararlar donanımda ASIC'ler tarafından verilmektedir).

ISS'nizin bulunduğu bağlantı noktalarında, güvenlik duvarında bulunan ACL'yi uygulayın (örneğin, "bu özel IP adresine yalnızca 80 / tcp ve 443 / tcp izin verin"). Ardından, ön uçlarınızın her birinin yönlendiricinizle bir BGP oturumu sürdürmesini sağlayın. Mükemmel OpenBGPD'yi (ön uçlarınız OpenBSD'de ise) veya Quagga'yı kullanabilirsiniz . Yönlendiriciniz, trafiği sağlıklı olan ön uçlara ECMP olarak kaydedecektir (çünkü BGP oturumlarını sürdürmektedirler). Yöneltici ayrıca PBR kullanarak trafiği uygun şekilde yönlendirir.

Hassaslaştırmalar

  • Güvenlik duvarı çifti çözümüyle, güvenlik durumlarını TCP durumlarını güvenlik duvarları arasında senkronize edebilirseniz, böylece bir güvenlik duvarı arızalandığında her şey diğerine sorunsuz bir şekilde geçemez. Bunu ile başarabilirsiniz pfsync.
    • pfsyncGenellikle güvenlik duvarlarınızdaki paket oranını iki katına çıkaracağını unutmayın .
    • HTTP durumsuz bir protokoldür, bu nedenle güvenlik duvarı yerine çalışma sırasında tüm bağlantıları sıfırlarsanız kullanmadığınız için dünyanın sonu değildir pfsync.
  • Tek bir güvenlik duvarını aşarsanız, trafiğinizi birden fazla güvenlik duvarı çiftine yönlendirmek için yönlendiricinizdeki ECMP'yi kullanabilirsiniz.
  • Birden fazla güvenlik duvarı çifti kullanıyorsanız, hepsini aktif / aktif hale getirebilirsiniz. Bunu, güvenlik duvarlarının yönlendiricilerle BGP oturumunu sürdürmesini sağlayarak elde edebilirsiniz, tıpkı ön uçların güvenlik duvarları olmadan 2. tasarımda tutmaları gerekir.

Örnek relaydyapılandırma

Ayrıca bkz. HOWTO, https://calomel.org/relayd.html.

vip = "1.2.3.4" # Genel IP adresiniz
               # (birden fazla olabilir, ancak buna gerek yok)
FE1 = "10.1.2.101"
FE2 = "10.1.2.102"
Fe3 = "10.1.2.103"
fe4 = "10.1.2.104" # İstediğiniz sayıda önyüze sahip olabilirsiniz.
int_if = "em0"
tablo <fe> {$ fe1 deneme 2, $ fe2 deneme 2, $ fe3 deneme 2, $ fe4 deneme 2
tablo <fallback> {127.0.0.1}

web trafiği yönlendir
        $ vip port 80'de dinle
        oturum zaman aşımı 60
        <fe> adresine gidin http "/healthcheck.html" digest "(healthcheck.html sha1sum)" "$ int_if
}

2

Şahsen o noktada daha basit, daha az yapılandırılabilir donanım yük dengeleyicisine gidiyorum - Cisco'nun ACE / ASA'ları, Foundry ServerIrons, hatta Zeus ZXTM'ler (çok ağır yükler için tasarlanmış bir SW LB) gibi şeyler.


Başka bir deyişle, ölçek büyütmek ? Böyle bir LB hala bazı bağlantılarda (vb.) Maksimuma çıkarılacaktır. Sonra ne? Bu gerçekten benim sorum. Teşekkürler!
z8000

1
Gerçekten büyük siteler yalnızca bir tür DNS round-robin formunda çalışan çok sayıda ağır iş LB kullanıyor - çoğu için yeterince iyi ve yüz milyonlarca bağlantıyı idare edebiliyor. Tabii ki neden bu kadar çok bağlantının açık kalması gerektiği sorusu var ...
Chopper3

Bu dahili RRDNS mi demek istiyorsun? Düzgün, bunu düşünmedim. Ynt: bağlantıları aç ... Olaylar arka uçta bir yerde gerçekleştiği için zamanla bağlı istemcilere güncelleme göndermek isteyen bir uygulamanın seçeneklerini araştırıyorum. Özel bir TCP sunucusu veya bir SLB'nin arkasındaki birçok açık HTTP bağlantısı arasında kaldım. Yorumlarınız için teşekkür ederim.
z8000

Dış RRDNS olması gerektiğini düşünüyorum. Örneğin, Twitter.com, yükü sunuculara dağıtacak olan birçok büyük LB'den birine istekleri çözmek ve dağıtmak için RRDNS kullanır.
Robert

Evet Robert, haklısın, örneğin, site bazında RR yapmak için Cisco GSS kutularını kullanıyoruz.
Chopper3

1

Muhtemelen sürekli yanıtlar göndermek için bu kadar çok açık bağlantı kurmak yerine, uygulamanızı müşterilerin periyodik olarak sunucularınızı gerektiği sıklıkta sorgulayacağı şekilde kodlayın.

Yaptığınız şey aslında bu milisaniyede bir yanıt gerektiriyor mu yoksa bir sonraki yoklama dönemine kadar bir müşteri 15/20 saniye bekleyebilir mi?


0

Tipik bir yaklaşım, gerekli yükü kaldıracak kadar büyük bir küme oluşturmak ve deterministik yük dengeleme yapabilen bir SLB kullanmaktır (kalıcı bağlantılar için).

CARP gibi bir şey, hangi arka uç web sunucusunun isteği yerine getireceğini belirlemek için istekte bulunan IP'nin bir karma değerini kullanır; bu, yük dengeleyicinizin önünde bir güvenlik duvarı veya NAT varsa, belirleyici olmalıdır ancak çok kullanışlı olmamalıdır. Linux'ta çalışıyorsanız, IPVS
gibi faydalı bir şey de bulabilirsiniz .


Sazan hakkında iddia ettikleri şey, çalışma şeklinden çok uzakta, nereden başlayacağımı bilemiyorum! IPVS'den bahsettiğiniz için +0.
3molo

@ 3molo ... ha? bkz. net.inet.carp.arpbalance, linux.com/archive/feed/35482 adresinde "..CARP, bir isteğin kaynak IP'sini kaynaklandırır. Ardından, isteği işlemek için mevcut havuzdan sanal bir ana bilgisayar seçmek için kullanılır. ."
Paul,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.