Web Trafiği Yönetimi ve Çözüm Önerileri

Emeltemakcay
riseconsulting
Published in
16 min readAug 18, 2023

By Fatih Şentürk, Osman Nuri Kumlu

Hızla gelişen teknoloji ile birlikte şirketler verilerini dijital ortama taşımaya başlamış ve dünyanın herhangi bir yerinden verilere anında ulaşabilmenin yolu açılmıştır. Buna bağlı olarak da internet ortamından bu sistemlere erişim sağlayan müşterilerin (client) sayısı da artmış ve bu müşterilerin yoğun bir şekilde gönderdikleri web istekleri (request) sonucunda, sunucular üzerinde darboğaz, yavaşlık, erişilebilirlik gibi sorunların ortaya çıkmasına neden olmuştur.

Bu sorunların göz ardı edilmesi şirketler için zaman kaybı, maddi kayıplar, müşteri kaybı, itibar kaybı v.b gibi zararlara sebep olabilmektedir.

Bu makalemizde yoğun trafik alan web projelerinde bu trafiğin nasıl yönetilmesi gerektiğine dair bazı çözüm yöntemlerine değineceğiz. Makalemizde yer alan başlıklar şunlardır.

1. Sistem Darboğazı (Bottleneck) nedir?

2. Çözüme Yönelik İhtiyaç Analiz Süreci
a- Küçük ve Orta Ölçekli Projeler İçin
b- Orta ve Büyük Ölçekli Projeler İçin

3. Yazılım Projesinin Yapısı Nasıl Olmalı
a- Ön Bellekleme (Caching)
b- Mesaj Kuyrukları (Message Queues)
c- Asenkron ve Multithread Programlama
d- Profiling & Performance Tuning
e- Veritabanı Kümeleme (Database Clustering)
f- Yük Dengeleme (Load Balancing )

4. Sunucu Sanallaştırma Nedir? (Virtualizing)

5. Sunucu Ölçekleme Nedir (Scaling)
a- Sunucu Dikey Ölçekleme (Vertical Scaling)
b- Sunucu Yatay Ölçekleme (Horizontal Scaling)

6. Load Balancer Nedir?

7. Docker ve Swarm Çözümü

8. Mikroservisler için Ocelot ApiGateway Çözümü

1-) Sistem Darboğazı Nedir? (Bottleneck)

Sistemi oluşturan bileşenlerin maksimum çalışma kapasitelerindeki farklılıklardan dolayı, en az bir bileşenin, diğer bileşenlerin performansına ayak uyduramaması ve genel olarak sistemin tam kapasiteli performans ile çalışmasını engellemesi durumu olarak ifade edilebilir.

Sistem darboğazı kavramının ne olduğunu daha iyi anlayabilmek adına aşağıdaki örneği inceleyelim. Bu örnekte birbirleri ile eş zamanlı olarak çalışması gereken 3 İnşaat Ustamız bulunmaktadır.

· Duvar Ustası: İşe ilk olarak başlayıp, tuğlaları örecektir.

· Sıva ustası Örülen tuğlaların üzerine sıva yapacaktır. (Bu sıvanın anında kuruyan bir malzeme olduğu farzedilmiştir.)

· Boya ustası : Sıvanan (-ve anında kuruyan) duvarı boyayacaktır.

Ve bu ustaların performanslarına ait çalışma süreleri tablosu aşağıda verildiği gibidir.

Örnekteki değerlere bakarsak her ustanın kendi işini, kendisinden bir sonra işe başlayacak olan ustadan daha uzun sürede tamamladığını görürüz. Bu durumda Sıva Ustası ne kadar hızlı çalışırsa çalışsın kendisinden önce çalışan ve kendisine iş teslim edecek olan Duvar Ustası yavaş kaldığı için tuğlaların örülmesini beklemek zorunda kalacaktır. Aynı şekilde Boya Ustası da Sıva Ustasından daha hızlı çalışmaktadır ve duvarı boyayabilmek için sıva ustasının tuğlaları sıvamasını beklemek zorunda kalacaktır.

Bu takımın performansı sistemdeki en zayıf halkaya göre, yani duvar ustasının yapacağı işe göre belirlenecek ve maksimum verim azalacaktır. İşte bu durum sistem üzerinde oluşan bir “Darboğaz” olarak nitelendirilebilir.

Birbirlerini dengeleyen, bekleme süresinin en az olduğu ve maksimum verim sağlayacak olan bir çözüm için bu çalışma takımı üyeleri 4 Duvarcı + 2 Sıvacı + 1 Boyacı şeklinde düzenlenmelidir. (EKOK (8,4,2) = 8) Böylece hiçbir işçi boşta bekler durumda kalmayacak ve sistem maksimum performans sergileyecektir.

Darboğaz konusuna bir başka örnek olarak : Bir süpermarkette tek bir kasanın açık olduğu ve tüm müşterilerin de o kasa önünde yığıldığı durumu verebiliriz. Bu durum da sistemin yetersiz kaynak sebebiyle aşağıdaki kum saati gibi bir dar boğaza düştüğünü ve ihtiyaçlara cevap veremediğini söyleyebiliriz. Bu sorunu çözmek için de ekstra kasiyer görevlendirip yeni kasalar açmalı ve müşteri yoğunluğunu bu kasalara eşit olarak dağıtarak darboğaz sorunu aşılmalıdır.

Bilişim dünyasındaki dar boğaz sorunları da gerçek hayatta karşımıza çıkan bu örneklerle benzerlik göstermektedir. Böyle sorunlar yaşandığında müşteriler şirketlere olan ilgilerini kaybedip alternatif çözümler bulma yoluna gidebilirler. Şirket de itibar kaybı ve maddi açıdan kayıplara uğrar. Unutmamak gerekir ki “Müşteriler asla beklemeyi sevmezler ve işlerinin bir an önce tamamlanmasını isterler”.Bu yüzden bu sorunların en ideal , en ekonomik yöntemle ve en hızlı bir biçimde çözülmesi gerekmektedir.

Şimdi web projelerinde bu tür sorunlara çözüm bulabilmek için dikkat etmemiz gereken konuları incelemeye başlayalım.

2-) Çözüme Yönelik İhtiyaç Analiz Süreci

Ele aldığımız sistemin üzerinde uygulanacak olan en uygun ve en ekonomik çözümü bulabilmek için öncelikle elimizdeki sistemin mevcut kapasitesinin ve maksimum müşteri yelpazesinin ne olduğuna bakmamız gerekmektedir. Bu veri sistem üzerinde yaşanabilecek maksimum web trafiğinin ne olabileceği konusunda bize fikir verir ve sistem üzerinde donanımsal güçlendirme yapabilmek adına uygun adımları atabilmemizi sağlar.

Ayrıca proje üzerinden kullanıcıya sunulan resim, rapor ve diğer sayfa verisi boyutlarının ihtiyaç düzeyindeki en küçük boyutlara indirgenmiş olunduğundan emin olmak gerekir. İhtiyaç olmayan verinin sayfalar arasında dolaşması gereksiz yere web trafiğine ve sistem kaynaklarının boşa harcanmasına neden olur.

Web Trafiği : Kullanıcı bilgisayarlardan, internet sunucuları üzerinde yapılan her bir istek ve bu isteğin sonucu kullanıcıya geri döndürülen cevap verisinin oluşturduğu trafiktir.

A-) Küçük ve Orta Ölçekli Projeler için :

Eğer günlük ziyaretçi sayısı 0–1000 arasında değişen ve “Küçük & Orta Ölçekli İşletme” olarak nitelendirilen bir proje üzerinde çalışıyorsak, muhtemelen sayfalarda sunulan verilerin boyutları da düşüktür. Eğer böyle bir projede web trafiği sorunu yaşanıyorsa, donanım yükseltmesi yapıp sistemi güçlendirerek bu sorununu çözebiliriz.

Aşağıdaki resimde bir hosting firmasının kullanıcılar için sunmuş olduğu hizmet paketleri bulunmaktadır.

Bu paketler genellikle yukarıda örneğini vermiş olduğumuz “Duvarcı — Sıvacı- Boyacı” probleminin çözümündeki mantığa göre birbirleriyle uyumlu olarak çalışmak üzere hesaplanmış ve kullanıcıların hizmetine sunulmuş paketlerdir.

Uygulamamız gereken çözüm, işletmemizin ihtiyaçlarına göre en uygun host paketini seçmek ve İşlemci(CPU), Bellek(RAM) ve Bant Genişliği artırımını yaparak sistemin gücünü ve hızını artırmak şeklinde olacaktır.

B-) Orta ve Büyük Ölçekli Projeler için :

Yüksek miktarda trafiğin yaşandığı ve yoğun bir şekilde veri akışının gerçekleştiği projelerde sunucu bilgisayarın donanımsal özelliklerinin daima en iyi seviyede olması gerekmektedir.

Fakat her ne kadar sunucunun donanımsal özellikleri maksimum seviyede olsa da, bu durum büyük projelerde darboğaz sorununun önlenmesi için her zaman tek başına yeterli olmayabilir. Yazılım projemizde veya sunucumuzda başka çözüm yöntemlerini denememiz gerekebilir.

İşe ilk olarak sunucu üzerinde çalışacak olan yazılım projemize göz atarak başlamamız gerekmektedir. Herhangi bir sorun varsa bu sorunun nereden kaynaklandığını iyi tespit etmeli ve nokta atışı yaparak aksaklığa sebep olan kısımlara müdahale etmek gerekmektedir. Yazılımın iyi bir şekilde tasarlandığından ve algoritmik olarak uygun bir şekilde kodlandığında, kod hatalarının en aza indirgenmiş olduğundan, veritabanı sorgularının performans kriteri göz önüne alınarak yazıldığından emin olmak gerekmektedir. Aksi taktirde sunucu bilgisayarınız her ne kadar güçlü olursa olsun, yazılım projeniz bu donanımı hoyratça kullanıp, kaynakları israf edebilir ve sizin uygulamaya çalıştığınız çözümü etkisiz kılabilir.

3-) Yazılım Projesinin Yapısı Nasıl Olmalı?

Web trafiğini yönetebilmek üzere tasarlanmış örnek bir proje aşağıdaki gibi olabilir.

Bu şemada gösterilen her birim; sistemin performansını artırmak, işleri en kısa sürede tamamlamak ve kullanıcıya süreç sonunda gereken veriyi en kısa sürede sağlamayı amaçlamaktadır. Gelin şimdi bu şema üzerindeki yapılara kısaca değinelim.

Caching (Ön bellekleme) : Sürekli olarak kullanılmakta olan verilerin tekrar istendiğinde kolayca bulunabilmesi ve kullanılabilmesi için geçici bir hafızaya kaydedilmesi işlemidir. Bu geçici hafıza RAM tabanlı çalışan Redis veritabanı olabileceği gibi tarayıcı penceresinde Cookie saklamak için kullanılan alan da olabilir. Her iki durumda da aynı verilerin veritabanı üzerinden tekrar tekrar çekilmesi önlenmeye çalışılmaktadır. Eldeki hazır veriler tekrar kullanılarak performans artışını sağlanmaya çalışılır.

Message Queue (Mesaj Kuyruklama): Mikroservisler arasında haberleşme için kullanılabilse de, birbiri ardına yapılması gereken yüzlerce işi belirli bir sıraya alarak düzene sokar ve işi yapacak yazılım süreçleri üzerine ani ve yoğun bir şekilde yük binmesini engeller. Böylece tıkanıklıkların önüne geçilir.

Mesaj Kuyruklama çalışmasına gerçek hayattan bir örnek vermemiz gerekirse : e-devlet.gov.tr üzerinden yapılan bir rapor isteği sonrasında sayfada “Rapor İsteğiniz Sıraya Alınmıştır, Hazırlandığında Size Bilgi Verilecektir!” şeklinde verilen mesajı örnek olarak gösterebiliriz.

Tüm Türkiye’den aynı özelliğe erişmek isteyen binlerce kullanıcının isteği Mesaj Kuyruklama Sistemi ile bir sıraya alınır ve sırası gelen kullanıcının raporu hazırlanır. Diğer kullanıcılar kendi sırası gelene kadar beklemektense sayfadan çıkıp başka işlerine yönelebilir. Rapor oluşturma işlemi tamamlandıktan sonra kullanıcıya gönderilen bilgi mesajının(mail, sms v.s) ardından, kullanıcı sayfayı tekrar açar ve hazırlanan raporunu görebilir. Mesaj Kuyrukları sayesinde sabırsız kullanıcıların F5 tuşuna basarak sayfayı sürekli yenilemesinin ve gereksiz yere web trafiği oluşturmasının da önüne geçilmiş olunur.

Asenkron ve Çok Kanallı(Multithreding) Programlama :
Kod akışının sırayla işlemediği, işlemlerin birbirini beklemek zorunda olmadığı, aynı anda birden fazla farklı işin yürütülebildiği programlama tekniğidir. Multithread ve asenkron programlama teknikleri uygun bir şekilde kullanıldığında CPU gücünün daha verimli kullanılmasını sağlayarak yazılımın daha verimli çalışmasını sağlamakta ve işlem süresini kısaltmaktadır.

Profiling & Performance Tuning : Veritabanı performans iyileştirmelerini kapsar. Sorgu optimizasyonları, CPU sürelerinin kısaltılması, I/O darboğazlarından çıkış yöntemleri, indekslemeler v.s bu kapsam içerisinde yer almaktadır. Bu iyileştirmelerin gerçekleştirilmesi esnasında veritabanı yöneticilerine büyük iş düşmektedir.

Veritabanı Kümeleme (Clustering) : Sisteme birden fazla veritabanı örneğini veya sunucusunu bağlama işlemidir. Genellikle veritabanları Master olarak adlandırılan tek bir veritabanı sunucusu tarafından yönetilir. Cluster sayesinde gelen istekler, ihtiyaç durumuna göre uygun veri kaynağına yönlendirme işlemi yapılır.

Bu sistemin en temel 2 avantajı bulunmaktadır.

· Hata toleransı sağlar: Herhangi bir sunucu hatası durumunda, işlemler diğer sunucu üzerinden devam edebildiği için kullanıcıya arka plandaki bu hata durumu hissettirilmez

· Yük dengeleme ve performans artışı: Gelen istek sorguları en uygun veri kaynağına otomatik olarak yönlendirildiği için yük dengesi sağlanır ve kullanıcıya en kısa sürede veri sağlanır.

Load Balancing (Yük Dengeleme) : Sunucu mimarilerindeki sınırlı sistem kaynaklarına rağmen artan yükün/trafiğin/isteğin karşılanabilmesi için sunucu üzerinde mevcut kaynakların donanımsal olarak arttırılmasına, sisteme aynı özellikte yeni sunucuların dahil olmasına ve birden fazla sunucu arasında kaynakların orantılı bir şekilde kullanılabileceği vaziyette trafiğin dağıtılmasına Load Balancing(Yük Dengeleme) denir.

Bu makalemizin ana konusunu da Load Balancing başlığı oluşturmaktadır.

Load Balancing sürecinin nasıl işlediğini anlayabilmek için öncelikle sunucular üzerinde sanallaştırma ve ölçekleme kavramlarının ne olduğundan biraz bahsedelim.

4-) Sunucu sanallaştırma nedir?
Fiziksel tek bir Sunucu bilgisayarının kaynaklarını (CPU, Ram, Disk v.s) daha verimli bir şekilde kullanabilmek için, sistemi yazılımsal olarak birden fazla parçaya bölme işlemine “sanallaştırma(virtualization)” denir. Bölünen her bir parçaya Virtual Machine (Sanal Makine) ismi verilir. Bu sanal makinelerin her biri üzerine farklı işletim sistemleri kurulabilir. Sanal makineler sanki tek başlarına bir sunucu bilgisayarmış gibi davranır. Bir sanal sunucu üzerinde kurulan yazılımlar veya uygulamalar diğer sanal sunucu üzerindeki yazılım veya uygulamanın çalışmasını engellemediği ve herhangi bir çakışmaya neden olmadığı için yazılımın kopyalarını farklı sanal makineler üzerine dağıtarak çoklu bir biçimde kullanabiliriz.

Aşağıdaki resimde sanallaştırma yapılmadan kullanılan sunucu ile sanallaştırma yapılan sunucunun mimari yapıları gözükmektedir.

Sanallaştırma yapılmayan bilgisayarda (A sunucusu) tüm uygulamaları tek bir işletim sistemi yönetmektedir. Sağdaki bilgisayarda (B sunucusu) ise sanallaştırma işlemi sonrası sunucu birden fazla sanal alana bölünmüş ve her bir sanal alan içerisinde birbirinden bağımsız işletim sistemleri kurularak bu işletim sistemleri üzerine farklı uygulamalar kurulmuştur.

Böylece fiziksel olarak tek bir sunucu bilgisayarına sahip olmamıza rağmen sanki birden fazla sunucuya sahipmişiz gibi çalışabiliriz. Bu yapı ayrıca donanım kaynaklarının daha verimli kullanılabilmesine de olanak sağlar.

Ayrıca bu sanallaştırma yapısı, her bir sanal makine üzerinde aynı uygulamanın birer kopyasını yerleştirmemize ve olası bir yoğunluk durumunda bu uygulamalar üzerinde yükleri eşit olarak dağıtmamıza olanak sağlamaktadır. Yani bir çeşit load balancing olayına imkan tanımaktadır.( Web projemizin her bir kopyasını sanal sunucular üzerine yükleyip, IP yapılandırmasıyla gelen müşteri isteklerini bu kopyalardan uygun olana yönlendirebiliriz.)

Bu sanallaştırmanın bir başka türünü Docker ile yapabilmekteyiz. Makalemizin ilerleyen kısımlarında bu konuya değineceğiz.

5-) Sunucu ölçekleme(Scaling) nedir?

Sunucu bilgisayarının donanımının yetersiz kalması durumunda, sunucuya yeni donanımlar ekleyerek sunucuyu veya sistemi güçlendirme işlemine “Sunucu ölçekleme” denir.

Sunucu ölçekleme işlemi, yatay ve dikey olarak 2 şekilde yapılmaktadır.

a. Sunucu Bilgisayarı Dikey Ölçekleme (Vertical Scaling)

Bu ölçekleme yönteminde tek bir sunucu üzerinde ekstra donanım(CPU, RAM, DISK v.s) ekleyerek sunucunun gücünün artırılması hedeflenmektedir. Veya aynı sunucuyu daha büyük ve daha güçlü başka bir sunucu ile tamamen değiştirme işlemi de dikey ölçekleme olarak nitelendirilir. Sunucunun gücünün artırılması, gelen isteklerin daha kısa sürede cevaplanmasını sağlayacağı için web trafiğinin rahatlamasına katkı sağlar. (Makalemizin başında küçük ve orta ölçekli işletmeler için belirttiğimiz host paketinin yükseltilmesi çözümünü kendi projemiz için bir çeşit dikey ölçekleme işlemi gibi düşünebiliriz.)

Bu tür bir ölçekleme, tek bir cihaz üzerinde güçlendirme çalışması yapıldığı için teknik açıdan kolay bir şekilde uygulanabilmektedir. Lisanslama ücretleri düşüktür. Fakat yetersiz kalan kaynaklar sonucunda sürekli olarak RAM,CPU takviyesi yapılması gerektiği için maliyetli olabilir. Ayrıca yaşanacak herhangi bir donanım arızası, elektrik kesintisi gibi durumlarda sunucu bilgisayarımız devre dışı kalırsa tüm sistemimiz de devre dışı kalacaktır. Bu yüzden kullanıcılara/müşterilere sürekli hizmet verebilmesi açısından büyük bir risk taşımaktadır.

b. Sunucu Bilgisayarı Yatay Ölçekleme (Horizontal Scaling)

Talebi karşılamak için mevcut sisteme(network, cloud v.s) ek kaynaklar(yeni sunucu bilgisayarlar v.s) ilave etme işlemine “Yatay Ölçekleme” denir. Yani tek bir sunucu bilgisayarına tüm sorumluluğu yüklemek yerine birden fazla sunucu bilgisayarına yük dağıtımı yapılmaktadır.

Yatay ölçekleme ile dikey ölçeklemenin farkını şu şekilde izah edebiliriz :

Örneğin karanlık bir odayı aydınlatmak için kullandığımız ampulün yetersiz olduğunu farzedelim. Bu sorunu çözmek için 2 yol izleyebiliriz.
1-) Mevcut ampulü daha büyük ve daha güçlü başka bir ampul ile değiştirebiliriz. (Dikey Ölçekleme) Böylece eskisine nazaran daha büyük olan ampul, daha fazla ışık verir ve odayı daha iyi aydınlatır.

2-) Mevcut ampulün yanına başka ampuller de ilave ederek bu ampullerin birlikte yayacağı ışık ile odanın karanlığını giderebiliriz. (Yatay Ölçekleme) Hatta bu ampulleri odanın değişik yerlerine yayarak (coğrafi konum) ışığın odada daha dengeli bir şekilde dağıtılmasını sağlayabiliriz.

Her iki yöntemin de kendine göre avantaj ve dezavantajları bulunmaktadır. Yukarıdaki ampul örneğinden de anlaşılacağı üzere dikey ölçeklemenin bakımı teknik olarak daha kolaydır. Eski ampulü çıkarırsınız ve yeni takacağınız ampul ile yolunuza devam dersiniz. Fakat dikey ölçeklemenin dezavantajı şudur: Eğer herhangi bir şekilde ampulünüz patlarsa yani sunucu bilgisayarınızda herhangi bir sorun yaşanırsa o zaman tüm sisteminiz çöker ve odanız karanlığa gömülür.

Aynı şeyleri yatay ölçekleme için düşünürsek, yatay ölçeklemede ampullerden birisinin patlaması durumunda diğer ampuller yanmaya devam edeceği için sunucu bilgisayarlarınızdan birinin çökmesi, elektrik kesintisi sebebiyle devre dışı kalması veya kapanması durumunda, diğer bilgisayarlar çalışmaya devam eder ve çöken bilgisayarın görevini üstlenerek müşteri ile aradaki bağın kopması önlenir. Yani projemiz herhangi bir kesinti yaşamaksızın internet ortamındaki hizmetine devam edebilir.

Yatay ölçeklemenin dezavantajı ise teknik bakımı daha zor ve maliyetli olmasıdır. Ampul örneği üzerinden gidecek olursak, her bir ampul için ayrı bir ampul yuvası gerekmekte( yani ek masraf) ve o ampullerin birbirleri ile uygun bir biçimde kablolanması(networking) gerekmektedir. Yani dikey ölçeğe göre biraz daha masraflıdır.

Gerek yatay ölçekleme gerekse dikey ölçeklemenin amacı sistemin gücünü artırmak ve internet üzerinden gelecek isteklere daha hızlı bir şekilde cevap verebilmektir.

Projemizin kopyalarını (-veya mikroservis parçalarını) bu sunucular üzerindeki sanal makinelere (Virtual Machine veya Docker üzerine) kurarak internet ortamından gelen iş yükünü bu kopyalar üzerinde paylaştırmak “yükü dengelemesi (load balancing)” kavramına karşılık gelir.

Peki aynı anda gelen binlerce müşteri bağlantısının hangi sunucu üzerindeki hangi kopya yazılıma yönlendirileceğine kim karar verecek? Cevap : Load Balancer (Yük Dengeleyici)

6-) Load Balancer (Yük Dengeleyici) Nedir

İnternet ortamından gelen Müşteri(client) isteklerini Sunucu(server) üzerindeki kopya yazılımlar üzerinde dağıtmakla görevli olan ve yükü dengeleme işi yapan yapılara Load Balancer(Yük Dengeleyici) adı verilir.

Load Balancer’i kavşakta bekleyen trafik polislerine benzetebiliriz. Trafik polisi yolda bir tıkanıklık olduğunda, sürücüleri uygun bir yola yönlendirerek trafiğin rahatlamasını sağladığı gibi, Load Balancer yapıları da internet ortamından gelen istekleri o an en uygun durumda bulunan sunucuya yönlendirir. Böylece sunucular üzerinde bir iş paylaşımı yapılarak her bir sunucunun üzerindeki iş yükü hafifletilmiş olur.

Load Balancer istemci bilgisayarlar ile web sunucular arasında bir ara katman olarak yer alır ve bir köprü vazifesi gördüğü için güvenlik artırılmış olur.

Load Balancerler sadece yazılım tabanlı, sadece donanım tabanlı veya hem yazılım hem donanımın ortaklaşa çalıştıkları bir yapıda olabilir.

Load Balancer Türleri

· Donanım Tabanlı (Hardware Based)

· Yazılım Tabanlı (Software Based)

· Sanal (Virtual ) : Yazılım + Donanım tabanlı çalışma şeklidir.

· Bulut Tabanlı (Cloud)

Örnek bir Load Balancer donanımı aşağıdakine benzemektedir.

Yazılım tabanlı Load Balancer’lere örnek olarak şunları sayabiliriz:

· NGINX

· Microsoft Azure Load Balancer

· Avi Vantage

· HAProxy

· LoadMaster

Load Balancer’ler ile Http, Https, TCP ve UDP tipindeki web trafikleri yönetilebilir.

Load Balancer Nasıl Çalışır?

Load Balancer sistemi kurulduktan sonra kendisine bir IP adresi verilir. Daha sonra Load Balancer’in bu IP adresi ile bağlantılı olacak şekilde kendisine Virtual IP’ler yani sanal IP ler bağlanır. Load Balancer, internet ortamından gelen isteği aldığında kendi algoritmik yapısı ile en uygun sunucunun hangisi olduğunu tespit eder ve isteği bu sunucuya yönlendirir.

Yani bu durumda web projemizin birer kopyasının bu sunuculardan her birinde yer alacağını ve internet üzerinden gelen yoğun isteklerin load balancer üzerinden geçerek en uygun durumda bulunan sunucuya ve dolayısıyla bu sunucudaki kopya web projesine aktarılacağını düşünebiliriz. Böylece yoğun bir şekilde gelen müşteri isteklerini tek bir projenin kaldırması yerine, ortaklaşa yük paylaşımı yapılarak isteğin daha kısa sürede karşılanması sağlanır.

Load Balancer’ler, kendilerine bağlı olan sunucuların durumlarını sürekli olarak kontrol ederek herhangi bir kaynak sorunu v.s yaşayıp yaşamadığına bakar. Problem yaşanan sunuculara yönlendirme yapmazlar. Yani arka planda yaşanan sıkıntılar müşteri tarafına yansıtılmamış olur. Bu işleme Health Checks (Uygunluk Kontrolü) denmektedir.

UYARI : Load Balancing uygulanmış bir sistemde kullanıcı session bilgileri sunucular arasında paylaştırılmadığı için kullanıcının bir sonraki isteğinin farklı bir sunucuya yönlenmesi durumunda session düşmesi yaşanabilmektedir. Böyle bir durumda session bilgilerinin ortak bir sunucuda veya veritabanında tutulması gerekebilir.

7-) DOCKER — SWARM ÇÖZÜMÜ

Web trafiğini yönetebilmek için yukarıda bahsettiğimiz Ölçekleme(Scaling), Sanallaştırma(Virtualizing) ve load balancer kullanmanın maliyetlerinin yüksek olması, teknoloji dünyasını yeni bir çözüm arayışı içerisine itmiştir. Ve bu çözüm de 2013 ‘de Docker ile gelmiştir.

Docker Nedir?

Docker, sanallaştırılmış ortamlarda uygulama geliştirmek, dağıtmak ve yönetmek için kullanılan açık kaynaklı bir platformdur. Uygulamalar Container adı verilen “sanallaştırılmış” bir yapı içerisinde paketlenirler ve bu yazılımın çalışması için gereken bütün ek bileşenleri de barındırır. Docker sistemi yazılım ortamındaki bilinmezlikleri ortadan kaldırdığı için geliştiricilerin “uyumluluk” sorunları ile uğraşması da gerekmez.

Docker Container’leri, makalemizin başlarında belirttiğimiz Sanal Makinelerden(Virtual Machine) daha hafif ve daha az kaynak tükettiği için daha verimli çalışır. Üstelik de Docker, sanal makinelere göre daha az maliyetlidir.

Sanal makine kullanımı ile Docker kullanımı arasındaki farkı aşağıdaki gibi görebiliriz.

Klasik sunucu sanallaştırma işlemi esnasında sunucu diski farklı bölümlere bölünmüş ve her bir bölüme de ayrı bir işletim sistemi kurulmuştur. Uygulamalar bu işletim sistemi üzerinde çalışmaktadır. (App A uygulamasının, App B ile doğrudan haberleşmesinin bir yolu yoktur. )

Docker kullanıldığı durumda ise sunucuda tek bir işletim sistemi bulunmakta ve bu işletim sistemi üzerine kurulan Docker platformu, işletim sistemi ile uygulamalar arasında bir ara katman vazifesi görmektedir.

Docker tanıtımının yapıldığı yukarıdaki resimde App A, App B olarak gösterilen kısımlar aslında Container isimleridir. Çalıştırılacak olan uygulamalar da bu containerlerin içerisine yerleştirilir. XYZ adında bir uygulamamız varsa bu uygulamayı Docker içindeki App-A, App-B, App-C …. App-F containerlerinin içerisine yerleştirerek aynı uygulamanın birden fazla kopya ile çalışmasını sağlayabiliriz.

Yani farklı isimlendirilmiş ve içerisinde bizim web projemizin bulunduğu n adet containeri çalıştırarak bu kopya projeler üzerinde load balancing işlemi uygulayabiliriz. Mevcut durumda docker üzerinde kurduğumuz bu sistem aşağıdaki resimdeki gibi gözükecektir.

Birbirinden farklı Containerler içerisine yerleştirdiğimiz birbirinin aynı web uygulamamızı yönetmek için Docker ile bütünleşik olarak gelen SWARM kullanılmaktadır.

Swarm, yoğun bir şekilde gelen sunucu yüklerini bizim istediğimiz ölçüde ve şekilde dağıtmayı sağlayan ve sistemde herhangi bir sorun oluştuğunda da sistemin sürekli olarak çalışır vaziyette kalmasını sağlayan bir altyapı oluşturmamıza olanak tanır.

Oluşturduğumuz yapı içerisinde eğer containerlerden herhangi birisi çalışmayı durdurursa, Swarm ile bu containerin otomatik olarak tekrar çalışmasını sağlayabiliriz. Aynı zamanda Swarm bize Scaling(Ölçekleme) ve Load Balancing (Yük Dağıtma) imkanları da sağlar.

Swarm’ın yönettiği containerlerin aynı sunucu bilgisayar üzerinde olması gerekmez. Swarm birbirinden farklı yerlerde bulunan sunucular üzerinde kurulmuş olan docker containerleri de yönetebilir.

Swarm ile containerlerin hangi makinede çalışacağı, hangi container’den kaç adet kopya üretileceği ve eğer containerlerden biri çalışmayı durdurduğunda (çöktüğünde) onun yerine kopya containerin hangi sunucu üzerinden alınıp tekrar ayağa kaldırılacağı, yük dağılımının (load balancing) nasıl yapılacağı ayarlanabilir.

Kopya uygulamalar için containerler oluşturup, SWARM yardımı ile Load Balancing işlemine tabi tutmak web trafiğini yönetebilmek için kullanılan çözüm yollarından biridir.

8-) MİKROSERVİSLER İÇİN OCELOT API GATEWAY ÇÖZÜMÜ

Ocelot, .Net uygulamalarında kullanabileceğimiz mikroservis odaklı bir Api Gateway kütüphanesidir. Client’lerden gelen istekleri Ocelot içerisinde tanımlanmış olan API’lere yönlendirme işlemi yapar.

Ocelot, kendi içerisinde barındırdığı yapı ile birbirinin kopyası olan API’ler üzerinde Load Balancing işlemi de yapabilmektedir. Bu da sistemin üzerindeki yük dengesini ayarlamada bize yardımcı olmaktadır.

Örnek olarak bir mikroservis yapımızın olduğunu ve bu yapıdaki API’ler arasında Product API’sinin müşteriler tarafından yoğun bir şekilde kullanıldığını farzedelim. Bu durumda Product Apisinin kopyasından birkaç adet oluşturup farklı portlardan yayın yapacak şekilde ayarlanır. Ocelot üzerinde gerekli tanımlamaları yapıldığında, Ocelet olası bir yoğunluk durumunda aşağıdaki gibi yükü kopya mikroservisler üzerinde dağıtarak load balancing işlemini gerçekleştirir.

Fakat Ocelot’un bu Load Balancing durum bizim makalemizin üst kısımlarında bahsettiğimiz Hardware&Software Load Balancing işlemi ile karıştırılmamalıdır. Çünkü Ocelot yük dengeleme işlemini Hardware&Software tabanlı yük dağıtma işleminden bir sonraki katmanda yapmaktadır. Yani 2nci kez yük dengeleme işlemi yapmaktadır.

Ocelot oldukça düşük maliyetli bir çözümdür. Eğer projemiz monolit yapıda ise, bu projeyi mikroservis mimarisine göre yeniden uyarlayıp daha sonra Ocelot ile load balancing işlemi yapabilir ve web trafiğini ekonomik yoldan kolayca yönetebiliriz.

Detaylı Bilgi : https://ocelot.readthedocs.io/en/latest/introduction/bigpicture.html

Özet ve Son Söz

Web trafiğinin yönetimi zorlu bir süreçtir. Trafiğe neden olan şeyin ne olduğundan emin olmak gerekir. Bu bazen bir hacker saldırısı bile olabilir ve güvenlik protokokolleri uygulanarak sorun giderilir.

Biz bu makalemizi yazarken internet ortamından gelen isteklerin gerçek müşteriler tarafından geldiğini ve sistemlerin bu isteklere cevap vermekte zorlandıklarını varsayarak yazdık. Buna göre uygulanması gereken adımlar özetle şu şekilde olabilir.

· İşe yazılım projemizi inceleyerek başlamak gerekir. Kaynak israfına neden olan bir yerin olup olmadığı kontrol edilir ve bu alanlar üzerinde iyileştirmeler yapılır. Yüksek miktarda veri çeken sayfalar, boyut ayarlaması yapılmamış resimler boşuna kaynak israfına neden olur. Bu sorunların giderilmesi gerekmektedir.

· Yazılımımız Asenkron Programlama, Mesaj Kuyruklama, Caching v.s gibi teknolojiler kullanarak performans odaklı çalışacak şekilde güncellenebilir ve web trafiği bu şekilde yönetilebilir.

· Yavaşlık veritabanı kısmında yaşanıyorsa veritabanı indexleme, kümeleme ve diğer performans artırma yöntemleri uygulanmalı. Veritabanı yapılarının(Tablo, view, Stored Procedure v.s) yanlış kurgulanması ve sorguların ihtiyaç olan veriden daha fazlasını getirecek şekilde çekilmeye çalışılması veritabanında yavaşlıklara neden olur.

· Eğer yazılım tarafında her şey yolunda ve olması gerektiği gibi ise ve buna rağmen yavaşlık hissediliyorsa bu taktirde sahip olduğumuz sunucunun gücünün artırılması yoluna gidilebilir. Küçük uygulamalar için daha iyi bir host paketi satın alınabilir veya sunucu yönetimi bizim elimizde ise Yatay ve Dikey Ölçekleme ile sunucunun gücü artırılabilir. (Scaling)

· Web uygulamamızın kopyalarını Virtual Machine veya Docker Container üzerindeki alanlara yerleştirip Load Balancing uygulaması ile internet ortamından gelen trafiğin uygun sunucudaki uygun kopya yazılım üzerine aktarılması ve bu sayede müşteriye daha hızlı cevap verilmesi sağlanabilir. Proje Bulut(Cloud) ortamına taşınabilir.

· Yazılım parçalarını mikroservislere bölebilir, bu mikroservis parçalarının kopyalarından birkaç kopya oluşturarak ApiGateway yardımı ile yükü bu kopya mikroservisler üzerine dağıtabiliriz. Yani Load Balancing işlemini mikroservisler için kullanabiliriz.

Veya bu makalemizde bahsettiğimiz konuların haricinde bambaşka bir çözüm yöntemi de uygulanabilir. Asıl olan, geleceğe yönelik ihtiyaçlara da cevap verebilecek şekilde esneklik sağlayan, genişletilebilir, en sağlam, en ekonomik, en hızlı ve en iyi çözümü uygulayabilmektir.

Bu yazı Rise Technology Voltran Ekibi tarafından hazırlanmıştır.

--

--