Web uygulamanızı ölçeklendirme: temel adımlar

Yayınlanan: 2022-09-13

İşletmeniz için uygulamalar oluşturmak yeterli değil, onları optimize etmeniz gerekiyor. Etkili bir yol ölçeklendirmektir. Bu makalede kod optimizasyonu, mimari optimizasyonu ve genel olarak ölçeklenebilir web uygulamalarının nasıl oluşturulacağını öğreneceksiniz.

optimize etme

Gearheart, kendinize aşağıdaki soruları sormanızı önerir:

  • veritabanı sorguları optimal mi (EXPLAIN analizi, indekslerin kullanımı)?
  • veriler doğru bir şekilde saklanıyor mu (SQL vs NoSQL)?
  • önbelleğe alma kullanılıyor mu?
  • FS'ye veya veritabanına gereksiz istek yok mu?
  • veri işleme algoritmaları optimal mi?
  • ortam ayarları optimal mi: Apache/Nginx, MySQL/PostgreSQL, PHP/Python?

Bu soruların her biri ayrı bir makalede ele alınabilir, bu nedenle bunların bu makale çerçevesinde ayrıntılı olarak ele alınması açıkça aşırıdır. Bir uygulamayı ölçeklendirmeye başlamadan önce, çalışmasını mümkün olduğunca optimize etmenin son derece arzu edildiğini anlamak önemlidir - aslında, o zaman hiçbir ölçeklendirme gerekmeyebilir.

ölçekleme

Uygulamanızı zaten optimize ettiğinizi, ancak yine de yükü kaldıramadığınızı varsayalım. Bu durumda bariz çözüm, mevcut kaynakları artırarak uygulamanın genel performansını artırmak için uygulamayı birden çok ana bilgisayara dağıtmaktır. Bu yaklaşıma resmi olarak uygulamayı "ölçeklendirme" denir. Daha doğrusu ölçeklenebilirlik, bir sistemin kendisine sunulan kaynak miktarını artırarak performansını artırma yeteneğidir.

İki tür ölçeklenebilirlik vardır: dikey ve yatay. Dikey ölçeklenebilirlik, bir düğüm (ana bilgisayar) içinde kaynaklar (CPU, bellek, disk) ekleyerek uygulama performansının artırılması anlamına gelir. Yatay ölçeklendirme, dağıtılmış uygulamalar için tipiktir ve başka bir düğüm ekleyerek uygulama performansının artırılması anlamına gelir.

En kolay yolun basit bir donanım yükseltmesi (işlemci, bellek, disk) olduğu açıktır – yani dikey ölçeklendirme. Ayrıca, bu yaklaşım uygulamada herhangi bir değişiklik gerektirmez. Bununla birlikte, dikey ölçeklendirme hızla sınırına ulaşır, bundan sonra geliştirici ve yöneticinin uygulamanın yatay ölçeklendirmesine geçmekten başka seçeneği kalmaz.

Uygulama Mimarisi

Çoğu web uygulaması önceden dağıtılmıştır, çünkü mimarileri en az üç katmana ayrılabilir: web sunucusu, iş mantığı (uygulama), veri (veritabanı, statik).

Bu katmanların her biri ölçeklenebilir. Yani sisteminizde aynı host üzerinde bir uygulama ve veritabanı varsa ilk adım kesinlikle bunları farklı hostlarda ayırmak olmalıdır.

darboğaz

Sistemin ölçeklenmesine geçilirken yapılacak ilk şey, katmanlardan hangisinin “darboğaz” yani sistemin geri kalanından daha yavaş olduğunu belirlemektir. Başlangıç ​​olarak, CPU/bellek tüketimini değerlendirmek için top (htop) ve disk tüketimini değerlendirmek için df, iostat gibi önemsiz yardımcı programları kullanabilirsiniz. Ancak, xdebug, oprofile vb. gibi yardımcı programları kullanarak uygulamanın profilini çıkarabileceğiniz bir savaş yükü öykünmesi (AB veya JMeter kullanarak) olan ayrı bir ana bilgisayar sağlanması arzu edilir. Dar veritabanı sorgularını belirlemek için pgFouine gibi yardımcı programları kullanabilirsiniz (elbette, bunu savaş sunucusundan alınan günlüklere dayanarak yapmak daha iyidir).

Genellikle uygulamanın mimarisine bağlıdır, ancak genel olarak bir darboğaz için en olası adaylar veritabanı ve koddur. Uygulamanız çok sayıda kullanıcı verisini işliyorsa, darboğaz büyük olasılıkla statik depolama olacaktır.

Veritabanı ölçeklendirme

Yukarıda belirtildiği gibi, modern uygulamalardaki darboğaz genellikle veritabanıdır. Bununla ilgili sorunlar genellikle iki sınıfa ayrılır: performans ve büyük miktarda veri depolama ihtiyacı.

Veritabanındaki yükü birkaç ana bilgisayara bölerek azaltabilirsiniz. Aralarında eş zamanlı veya eşzamansız çoğaltma ile master/slave şemasının uygulanmasıyla çözülebilecek akut bir senkronizasyon zorluğu vardır. PostgreSQL için, eşzamanlı çoğaltma için Slony-I'yi ve zaman uyumsuz çoğaltma için PgPool-II veya WAL (9.0) kullanabilirsiniz. Okuma ve yazma isteklerini bölme sorununu çözmek ve köleler arasındaki yükü dengelemek için özel bir veritabanı erişim katmanı (PgPool-II) yapılandırabilirsiniz.

İlişkisel veritabanları durumunda büyük miktarda veri depolama endişesi, bölümleme (PostgreSQL'de “bölümleme”) veya veritabanını Hadoop DFS gibi dağıtılmış bir veritabanına yerleştirme yoluyla çözülebilir.

Her iki çözümü de PostgreSQL'in yapılandırılmasıyla ilgili mükemmel kitapta okuyabilirsiniz.

1.Ancak, büyük miktarda veri depolamak için en iyi çözüm, çoğu NoSQL veritabanlarının (örn. MongoDB) doğal bir avantajı olan parçalamadır.

2.Ayrıca, sorgunun ayrıştırılması/optimize edilmesi, veri yapısı bütünlüğünün kontrol edilmesi vb. için ek yük eksikliği nedeniyle NoSQL veritabanları genel olarak SQL kardeşlerinden daha hızlı çalışır. İlişkisel ve NoSQL veritabanlarını karşılaştırma konusu da oldukça kapsamlıdır ve hak ediyor. ayrı bir makale.

3. Ayrı olarak, JOIN seçimleri olmadan MySQL kullanan Facebook deneyimi de dikkate değerdir. Bu strateji, yükü veritabanından koda aktarırken, veritabanını çok daha kolay ölçeklendirmelerine olanak tanır; bu, aşağıda açıklanacağı gibi, veritabanından daha kolay ölçeklenir.

Kod Ölçeklendirme

  • Ölçeklendirme kodunun karmaşıklığı, ana bilgisayarlarınızın uygulamanızı çalıştırmak için kaç tane paylaşılan kaynağa ihtiyaç duyduğuna bağlıdır. Sadece oturumlar mı olacak yoksa önbellekleri ve dosyaları paylaşmanız mı gerekecek? Her iki durumda da yapılacak ilk şey, uygulamanın kopyalarını aynı ortamla birden çok ana bilgisayarda çalıştırmaktır.
  • Ardından, bu ana bilgisayarlar arasında yük/istek dengelemesini ayarlamanız gerekir. Bunu hem TCP (HAProxy), HTTP (nginx) hem de DNS üzerinde yapabilirsiniz.
  • Gearheart'ın bahsettiği bir sonraki adım, statik dosyaları, önbelleği ve web uygulaması oturumlarını her ana bilgisayarda kullanılabilir hale getirmektir. Oturumlar için ağ üzerinden çalışan bir sunucu kullanabilirsiniz (örneğin, Memcached). Bir önbellek sunucusu olarak, aynı Memcached'i, ancak elbette farklı bir ana bilgisayarda kullanmak mantıklıdır.
  • Statik dosyalar, NFS/CIFS aracılığıyla veya dağıtılmış FS (HDFS, GlusterFS, Ceph) kullanılarak bazı paylaşılan dosya depolarından monte edilebilir.

Dosyaları bir veritabanında (örneğin, Mongo GridFS) depolamak da mümkündür, böylece kullanılabilirlik ve ölçeklenebilirlik sorununu çözer (NoSQL veritabanı ölçeklenebilirlik sorununun parçalama yoluyla çözüldüğü dikkate alınarak).

Ayrı ayrı belirtmekte fayda var, birden çok ana bilgisayara dağıtım sorunu. Kullanıcının "Güncelle" ye tıklayarak uygulamanın farklı sürümlerini görmediğinden nasıl emin olunur? Bence en basit çözüm, güncellenmemiş ana bilgisayarları yapılandırma yük dengeleyicisinden (web sunucusu) hariç tutmak ve güncellemeler yapıldıkça sırayla açmak olacaktır. Ayrıca kullanıcıları çerez veya IP ile belirli ana bilgisayarlara bağlayabilirsiniz. Güncelleme, veritabanında önemli değişiklikler gerektiriyorsa, en kolay yol projeyi geçici olarak kapatmaktır.