Mar
31
2011

Hiçbirşey Paylaşma Mimarisi – (The Shared-Nothing Architecture)

PHP, Java, ASP.NET ve Perl (mod_perl) gibi diğer platformlara göre daha iyi ve daha kolay ölçeklenebilir olmasıyla ön plana çıkmıştır. Aslında pek aynı görüşte olmama rağmen sizlere neden böyle olduğunu anlatmak istiyorum. Ancak öncelikle ölçeklenebilirliği (scalability) açıklayacağım ve çok fazla karıştırıldığı hız (speed) kavramından farkını ortaya koymaya çalışacağım.

İnsanlar genellikle kendi ürünlerinin çok hızlı çalıştığını çünkü ürünlerinin kolaylıkla ölçeklenebilir olduğunu söylerler. Ancak bu yanlış bir ifadedir. Ölçeklenebilirlik, ağır yük altındaki sisteme yeni bir donanım ekleyerek sistemin performansını artırabilmek olarak tanımlanır. Bir başka deyişle, yeni bir işlemci daha ekleseniz ve belleği iki katına çıkarırsanız “the slashdot load” ile başa çıkabilir misiniz ? İkinci bir sunucu daha eklerseniz uygulamanız hala çalışmaya devam edecek mi ? İkinci bir sunucu daha eklerseniz aynı anda oluşan istekleri cevaplama sayınız da iki katına çıkar mı ? Uygulamanız yük altında değilken bile bir isteği 2 saniyede cevaplarken, rakip uygulamalar aynı isteği bir saniyeden daha az sürede gerçekleştiriyorsa  bu onların daha iyi ölçeklenebilir bir uygulama geliştirdiklerinden değil, hızdandır.

Java web uygulamarının koşması için ortam sağlayan containerların, sağladıkları en önemli özelliklerden birisi de istekler (request) arasındaki nesneleri hafızada tutabilmek. Yani oturumlar (session).  Oturum içerisinde tamamen hafıza olacak şekilde bir sayı nesnesini oluşturup, her bir istekde bir artarmasını sağlayabiliyoruz. Ve istediğimiz cevabın içerisinde (response) kullanabiliyoruz. Peki bu sizce ne kadar verimli ve hızlı ? Sadece Java değil, ASP.NET, Perl ve hatta bir çok platform bu özelliği sağlıyor. Bir çoğumuzun bildiği gibi bu özelliğin kullanılmasında ki amaç nesnelerin oturumlar içerisinde fiziksel bellek üzerinde tutularak veritabanına daha az sorgu yapılmasını sağlamaktır. Peki fazla sayıdaki istekle çalışan sistemler de oturumları kullanmak sizce bellek kullanımını artırarak, cevaplayabildiğimiz isteklerin sayısını düşürebilir mi ? Oturumları kullanmanın yarattığı bir sorun daha var, sanırım birçoğunuz tahmin ettiniz bile, evet, ölçeklenebilirlik.

“Cache-Coherence” olarak isimlendirilen bu sorun, verinin bellekte tutulması ile ölçeklenebilirlik arasındaki büyük bir problemdir. Bir sunucunuz var ve gelen trafiği yeterince kaldıramıyor diye siz iki sunucu daha eklediniz. Ve bu üç sunucunuzun önüne de bir yük dengeleyici (Load Balancer) eklediniz. Yük dengeleyici gelen istekleri bu üç sunucunuza paylaştırarak gelen trafiğin tüm sunucularınızın üzerine yayacak. Buraya kadar herşey güzel.

 

 

İki sunucu daha ekliyoruz ve önlerine de bir yük dengeleyici ekledikten sonra yük dengeleyici gelen istekleri sunucular üzerine yaymaya başlıyor :

 

 

Her sunucunun kendi önbelleği var, tek bir sunucu üzerinde bu oldukça faydalı, ancak iki veya daha fazla sunucu ile çalışıyorsanız sıkıntı başlıyor. Örneğin bir istek sonucunda bir sunucu üzerinde oluşturulan veya veritabanından çekilen bir nesne sunucunun üzerinde bellekte veya önbellekte bulunuyor. Bu nesne diğer sunucular üzerinde bulunmuyor. Aynı nesne için yapılan daha sonraki istekler eğer diğer sunuculara yönlendirilecek olursa bu nesne için yine veritabanına gidilecek yada yeniden oluşturulacak ve bir önceki istekle güncellenmiş olandan daha eski durumdaki nesneyle çalışılmış olacak. Sunucularda ki bellekler ve önbellekler eşit durumda değiller ve tutarlı çalışmıyorlar. Bu senaryoda aslında durum okadar da vahim değil, bellekteki ve önbellekteki verilerin önceden belirlenen veya trafiğe göre belirlenecek sıklıkta veritabanına yazılmasıyla (flush) kolaylıkla çözülebilir. Ancak bazı durumlar varki, gerçekten içinden çıkamayacağımız ciddi sorunlarla karşılaşabiliriz. Örneğin, bir ağ dosya sistemi düşünün. Çok kullanılan dosyaların yerel olarak  önbelleklenmesi performansı ciddi olarak artıracaktır. Ancak bu dosyalardan bir tanesi başka biri tarafından değiştirildiğinde ne olacak ? Siz hala eski dosya ile çalışmaya devam ediyor olacaksınız. Performansı artırmak isterken, uygun şekilde tasarlamamış sistemlerde önbellekleme ciddi bir ölçeklenebilirlik problemi oluşturabilir.

Çözüm, ilk olarak PHP’nin yaratıcısı Rasmus Lerdorf ‘in bir röportajından öğrendiğim hiçbirşey paylaşma mimarisi (the shared-nothing architecture). Nasıl bir mimari bu ? Adı üstünde bu mimaride hiçbirşey paylaşılmıyor. Veriler ve nesneler paylaşılmıyor, en azından web sunucu içerisinde. Oturumlar var ve paylaşılıyorlar ama ölçeklendirilmesi çok kolay olan ya veritabanı yada ağ dosya sistemi üzerinden (NFS, SMB) paylaşılıyorlar. Sunucu üzerinde bellekte veya önbellekte tutulan hiçbirşey yok, uygulamanızı istediğiniz kadar sunucuyla ölçeklendirebilirsiniz. Bu mimaride veritabanı sunucusu bir noktada tabi ki bir dar boğaz (bottleneck) haline gelebilir, ancak veritabanlarının çok iyi ölçeklenebilir olduklarını unutmayın. Belki MySQL bu konuda çok iyi değil, ancak Oracle tahmin edemeyeceğiniz oranlarda ölçeklendirilebilir, yani tek sınırı paranız :)

Öyleyse, PHP, Java, ASP.NET ve Perl (mod_perl) ‘e göre daha iyi ölçeklenebilir diyebilir miyiz ? Hayır, bu doğru olmaz. Ama PHP ölçeklenebilimeye kendiliğinden hazırdır. PHP, verinin ve nesnelerin paylaşılmasına izin vermez, ve siz kendi ellinizle aktif hale getirmediğiniz sürece işletim sürecinde önbellekleme yapmaz. Java, ASP.NET ve Perl (mod_perl) verinin ve nesnelerin paylaşılmasına izin verirler ve tamamen sizin kontrolünüzdedir, ne yaptığınızdan emin olmalısınız, sorumluluk size aittir. Bir başka deyişle: bu platformlar üzerinde ölçeklenemeyen (non-scalable) uygulamalar geliştirmek kolaydır.

Orjinal Makale : http://zef.me/883/the-share-nothing-architecture

 

Yorum yapabilirsiniz..

En son haber ve ücretsiz eğitimlere ulaşmak için üye olabilirsiniz