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 1
ve FW 2
altı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 1
ve FE 2
aş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:
- ISS, IP’lerinize giden trafiği aktif yönlendiricinize yönlendirir.
- 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 .
- Güvenlik duvarınız filtreyi uygular (örneğin, "bu özel IP adresine yalnızca 80 / tcp ve 443 / tcp izin verir").
- 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.
- 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 1
ve 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
. Nerelayd
basit: 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
.
pfsync
Genellikle 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 relayd
yapı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
}