Caching (Önbelleğe Alma)

Yük dengeleme, sayısı gitgide artan serverlar üzerinde yatay ölçekleme yapmanıza yardımcı olur fakat önbelleğe alma(caching) var olan kaynaklarınızdan daha fazla faydalanmanızı sağlar ve erişilmesi güç ürün gerekliliklerine ulaşmayı kolaylaştırır. Önbelleğe alma(caching), referans prensibi sayesinde avantaj sağlar. Diğer bir deyişle, yakın zamanda istenen bir veri yeniden istenebilir. Programlamanın hemen hemen her katmanında kullanılmaktadır: donanım, işletim sistemi, web tarayıcılar, web uygulamaları vs. Önbelleğe alma(caching) kısa süreli hafızaya benzer: sınırlı alanı olmasına karşın orijinal veri kaynağından daha hızlıdır ve en son erişilen öğeleri barındırır. Mimarinin her seviyesinde bulunabilir fakat genellikle veriyi alt seviyelere gerek kalmadan hızlıca geri getirmek için kullanıldığı önyüze en yakın seviyede kullanılır.

Bir istek katmanı düğümüne, doğrudan önbellek yerleştirmek yanıt verinin yerel olarak depolanmasını sağlar. Servise her istek gönderiminde, düğüm eğer mevcut ise hızlıca yerel ve önbelleğe alınmış veriyi döner. Önbellekte mevcut değilse, istek düğümü veriyi diskte sorgular. Bir istek katmanı düğümündeki önbellek, hem oldukça hızlı olan bellekte hem de network depolamadan daha hızlı olan düğümün yerel diskinde bulunabilir. Peki bu durum birçok düğüme genişletilirse ne olur? İstek katmanının birçok düğüme genişletilmesi durumunda her bir düğümün kendi önbelleği olması halen daha muhtemeldir. Ancak, yük dengeleyiciniz istekleri düğümlere rastgele dağıtırsa aynı istek farklı düğüme giderek önbellek kayıplarını arttıracaktır. Bunun önlenmesi için iki seçenek vardır: genel önbellek ve dağıtık önbellek.

Dağıtık bir önbellekte, her bir düğüm önbelleğe alınmış verinin bir kısmını barındırır. Tipik olarak, önbellek tutarlı hashing özelliğini kullanarak bölünür ve bir istek düğümü, belirli bir veri birimini araması halinde verinin erişilip erişilemeyeceğini belirlemek için dağıtık önbellekte nereye bakmasını gerektiğini hemen öngörebilir. Bu durumda, her bir düğüm önbelleğin küçük bir birimini kapsar ve kaynağa gitmeden önce veri için başka bir düğüme istek gönderir. Bu nedenle, dağıtık önbelleğin yararlarından birisi de istek havuzuna düğümler eklenerek önbellek hafızasının kolaylıkla artırılabilmesidir. Dağıtık önbelleğin dezavantajı ise eksik bir düğümün çözüme kavuşturulmasıdır. Bazı dağıtık önbellekler bunu verinin farklı düğümler üzerinde çok sayıda kopyasını depolayarak yapar. Ancak, bu durum istek katmanından düğüm eklendiğinde veya çıkarıldığında karmaşık bir hal alabilir. Bir düğüm yok olsa veya bir kısmı kaybolsa dahi istekler kaynaktan bulunabilir. Böylelikle bir felakete mahal verilmesine gerek kalmaz!

Adından da anlaşılacağı üzere genel önbellek tüm düğümlerin aynı tek önbellek hafızasını kullanmasıdır. Buna server ekleme, belli dosyaların depolanması dahildir. Bu şekilde ana bellektekinden daha hızlı işlem yapılabilir ve tüm istek katmanı düğümlerinden erişim daha kolay sağlanabilir. Her bir istek düğümü önbellekte yerel bir düğümde yaptığı gibi önbelleği sorgular. Bu tarz bir önbelleğe alma şeması tek bir önbelleğe istemci ve istek sayısı arttıkça ekstra yük binebileceğinden karmaşık olabilir fakat bazı mimarilerde –özellikle genel önbelleği hızlandıran veya önbelleğe alınması gereken sabitlenmiş veri seti olarak özelleştirilen donanımlarda- oldukça faydalıdır. Aşağıdaki diyagramda tanımlanan iki tür genel önbellek bulunmaktadır. Birincisinde, önbelleğe alınmış bir yanıt önbellekte bulunamadığı zaman önbellek bu eksik birimi alt bellekten kurtarmakla yükümlüdür. İkincisiyse, önbellekte bulunmayan herhangi bir verinin kurtarılması istek düğümünün görevidir.

image

Genel önbellek kullanan çoğu uygulama önbelleğin kendi tahliyesini kontrol ederek istemcilerden gelen aynı veri için istek yığını oluşmasını önlemek amacıyla veri getirdiği ilk yöntemi kullanmaktadır. Ancak, ikinci yöntemin daha kullanışlı olduğu bazı durumlar da mevcuttur. Örneğin, önbellek çok büyük dosyalar için kullanılıyorsa, düşük önbellek isabet oranı önbelleğin tampon görevi oluşturarak önbellek kayıplarının aşırı yük bindirmesini önleyebilir ve önbellekte oldukça büyük miktarda total veri setine (veya sıcak veri) yer açar. Bir diğer örnek ise önbellekte depolanan dosyaların statik olduğu ve tahliye edilmediği bir mimaridir (bu durum veri gecikmesine ait uygulama gerekliliklerinden kaynaklanabilir- belirli bilgi birimlerinin, uygulamanın tahliye stratejisi veya hot spotları önbellekten daha iyi tespit ettiği büyük veri setlerinde hızlı olması gerekebilir).

CDNler yüksek miktarda statik medya yayınlayan siteler için kullanılan bir önbellek türüdür. Tipik bir CDN kurulumunda, istek öncelikle CDN’e statik medyaya ait bir birim sorar ve eğer bu birim yerel olarak ulaşılabilir ise CDN tarafından gönderilir. Eğer ulaşılabilir değilse CDN dosya için arkayüz serverları sorgular ve yerel olarak önbelleğe alarak istemciye erişimini sağlar. Eğer kurduğumuz sistem kendi CND’si için yeterince büyük değilse statik medyayı Nginx gibi hafif bir http serverı kullanan ayrı bir alt domain üzerinden (static.yourservice.com gibi) yayınlayarak serverlarımızdaki DNSi sonrasında bir CDN’ e aktarabilir ve ilerideki geçişleri kolay hale getirebiliriz.

Önbelleğe alma oldukça faydalı bir şey olmasına rağmen bazen önbelleği kaynakla (örneğin veri tabanı) uyumlu tutmak için onarıma gerek duyulabilir. Eğer veri tabanındaki veri değiştirilirse, önbelleğe alma işleminin geçersiz kılınması gerekir. Eğer kılınmazsa uygulamada tutarsızlıklar görülebilir.

Bu sorunun çözülmesi önbelleği geçersiz kılma olarak bilinir, bunun için kullanılan üç ana şema bulunmaktadır: