Memory Architecture
Ignite bellek mimarisi, verilerin ve indexlerin hem bellekte hem de diskte depolanmasına ve işlenmesine olanak tanır ve diskin dayanıklılığı(durability) ile bellek içi performans elde edilmesine yardımcı olur.
Çok katmanlı(multi-tiered) depolama, Linux gibi işletim sistemlerinin sanal belleğine benzer şekilde çalışır. Bu iki mimari türü arasındaki önemli bir fark, çok katmanlı depolama, diski her zaman verilerin üst kümesi olarak ele alır (persistence etkinse), yani çökmelere ve yeniden başlatmalara karşı hayatta kalabilir. Sanal bellek ise diski, process durduğunda silinen bir swap olarak kullanır.
Çok katmanlı mimari, sabit boyutlu sayfalara(page) bölünmüş, sayfa tabanlı bir bellek mimarisidir. Sayfalar, RAM'de (Java heap dışında) yönetilen off-heap bölgelerde depolanır ve diskte özel bir hiyerarşide düzenlenir.
Ignite, hem bellekte hem de diskte aynı binary veri yapısını korur. Bu, verileri bellek ve disk arasında taşırken maliyetli bir işlem olan serialization işlemi ihtiyacını ortadan kaldırır.
Aşağıdaki resim, çok katmanlı depolamanın mimarisini göstermektedir.
Memory Segments
Her data region(veri bölgesi) bir başlangıç boyutuyla başlar ve büyüyebileceği maksimum bir boyuta sahiptir. Region, sürekli bellek bölümleri tahsis ederek maksimum boyutuna genişler.
Bellek segmenti, işletim sisteminden ayrılan sürekli bir bayt dizisi veya fiziksel bellektir. Dizi, sabit boyutlu sayfalara bölünmüştür. Aşağıdaki resimde gösterildiği gibi, segmentte yer alabilen birkaç sayfa türü vardır.
Data Pages
Bir veri sayfası, uygulama tarafından cachelere koyulan girişleri saklar. Genellikle tek bir veri sayfası, belleği olabildiğince verimli kullanmak ve bellek parçalanmasını önlemek için birden çok key/value girişi içerir. Cache’e yeni bir giriş eklendiğinde, Ignite tüm key/value girişinin sığabileceği en uygun sayfayı arar. Ancak, bir girişin toplam boyutu DataStorageConfiguration.setPageSize(..)
özelliği aracılığıyla yapılandırılan sayfa boyutunu aşarsa, giriş birden fazla veri sayfasını kaplar.
Tek bir sayfaya sığmayan birçok cache girişi varsa, sayfa boyutu yapılandırma parametresini artırmak mantıklıdır.
Bir güncelleme sırasında bir giriş boyutu, veri sayfasında bulunan boş alanın ötesine genişlerse, Ignite, güncellenmiş girişi almak için yeterli alana sahip yeni bir veri sayfası arar ve girişi oraya taşır.
Memory Defragmentation
Ignite, otomatik olarak bellek birleştirme(memory defragmentation) gerçekleştirir. Zaman içinde, tek bir veri sayfası farklı CRUD işlemleriyle birden çok kez güncellenebilir. Bu, sayfanın ve tüm belleğin parçalanmasına(fragmantation) yol açabilir. Bellek parçalanmasını en aza indirmek için Ignite, bir sayfa çok parçalı hale geldiğinde sayfa sıkıştırmayı(page compaction) kullanır.
Sıkıştırılmış bir veri sayfası aşağıdaki resimdeki gibi görünür:
- Sayfa, internal kullanım için gerekli bilgileri depolayan bir
header
’a sahiptir. Tüm key/value girişleri her zaman sağdan sola eklenir. Resimde, sayfada saklanan üç giriş (sırasıyla 1, 2 ve 3) vardır. Bu girişlerin farklı boyutları olabilir. - Girdilerin sayfa içindeki konumlarına yapılan
offset
'ler (veya referanslar) soldan sağa saklanır ve her zaman sabit boyuttadır. Offsetler, bir sayfadaki key/value girişlerini aramak için işaretçiler olarak kullanılır. - Ortadaki boşluk boş bir alandır(free space) ve kümeye daha fazla veri gönderildiğinde doldurulur.
Zamanla 2. girişin kaldırıldığını ve bunun da sayfada sürekli olmayan bir boş alana neden olduğunu varsayalım:
Parçalanmış(fragmanted) bir sayfa böyle görünür. Bununla birlikte, sayfada bulunan tüm boş alana ihtiyaç duyulduğunda veya bir miktar parçalanma eşiğine(fragmentation threshold) ulaşıldığında, sıkıştırma(compaction) işlemi sayfayı birleştirerek yukarıdaki ilk resimde gösterilen, boş alanın sürekli olduğu duruma getirir. Bu işlem otomatiktir ve kullanıcı tarafından herhangi bir işlem yapılmasını gerektirmez.
Data Regions
Ignite, bir cache veya cache grubu için kullanılabilen RAM miktarını kontrol etmek için veri bölgeleri(data region) kavramını kullanır. Veri bölgesi, RAM'de cache’e alınmış verilerin bulunduğu mantıksal genişletilebilir bir alandır. Bölgenin başlangıç boyutunu ve kaplayabileceği maksimum boyutu kontrol edebilirsiniz. Veri bölgeleri, boyuta ek olarak cacheler için persistence(kalıcılık) ayarlarını denetler.
Varsayılan olarak, node’un kullanabileceği RAM'in %20'sini alabilen bir veri bölgesi vardır ve oluşturulan tüm cacheler bu bölgeye yerleştirilir; ancak n kadar veri bölgesi eklenebilir. Birden çok veri bölgesine sahip olmak istenilebilecek birkaç neden vardır:
- Veri bölgeleri, bir cache için kullanılabilir RAM miktarını veya cache sayısını yapılandırmaya olanak tanır.
- Persistence parametreleri veri bölgesi başına yapılandırılır. Hem yalnızca bellek içi(in-memory) cache’lere hem de içeriklerini diskte depolayan cachelere sahip olmak isteniyorsa, farklı persistence ayarlarına sahip iki (veya daha fazla) veri bölgesi yapılandırılması gerekir: biri in-memory cacheler ve diğeri persist cacheler için.
- Eviction policy(tahliye ilkeleri) gibi bazı bellek parametreleri, veri bölgesi başına yapılandırılır.
Cache Warm-up Strategy
Ignite, yeniden başlatmalarda memory→disk warm-up işlemine tabi tutmak gerektirmez. Bir cluster’a bağlanır bağlanmaz, harici uygulama onu sorgulayabilir ve üzerinde işlem yapabilir. Aynı zamanda bellek warm-up özelliği, verilerin sorgulanmadan önce belleğe yüklenmesini tercih eden düşük gecikmeli uygulamalar için tasarlanmıştır.
Şu anda, Ignite warm-up stratejisi, indexlerden başlayarak, boş alan bitene kadar Ignite'ın tüm veya belirli veri bölgelerine veri yüklenmesini içerir. Hem tüm bölgeler için (varsayılan olarak) hem de her bölge için ayrı ayrı yapılandırılabilir.
Eviction Policies
Peristence kapalıyken, Ignite tüm cache veri girişlerini off-heap bellekte tutar ve yeni veriler geldikçe sayfaları ayırır. Bir bellek sınırına ulaşıldığında ve Ignite bir sayfa ayıramadığında, OutOfMemory hatalarını önlemek için verilerin bir kısmının bellekten temizlenmesi gerekir. Bu işleme eviction(tahliye) denir. Eviction, sistemin belleğinin tükenmesini önler, ancak bunu veri kaybı ve tekrar ihtiyacınız olduğunda veriyi yeniden yüklemek zorunda kalma pahasına yapar.
Eviction aşağıdaki durumlarda kullanılır:
- Persistence kapalıyken off-heap bellek için
- Ignite harici bir depolama ile kullanıldığında off-heap bellek için
- On-heap cacheler için
- Eğer yapılandırılmışsa near-cacheler için
Persistence açıkken, Ignite yeni bir sayfa ayıramadığında off-heap belleği boşaltmak için page replacement(sayfa değiştirme) adı verilen benzer bir işlem kullanılır. Aradaki fark, verilerin kaybolmamasıdır(çünkü kalıcı depolamada saklanır) ve bu nedenle veri kaybından çok verimlilik kaybı yaşanabilir.
Replacement Policies
Persistence açıkken ve Ignite'ın diskte depoladığı veri miktarı, veri bölgesi için ayrılan off-heap bellek miktarından fazla olduğunda, bir sayfayı diskten tamamen dolu off-heap belleğine önceden yüklemek(preload) için başka bir sayfanın diske boşaltılması gerekir. Bu işleme page rotation(sayfa döndürme) veya page replacement(sayfa değiştirme) denir.
Ignite’a bir sayfa gerektirdiğinde, bu sayfayı off-heap bellekte bulmaya çalışır. Sayfa şu anda off-heap bellekte değilse (bir sayfa hatası oluşur), bu sayfa diskten preload işlemine tabi tutulur. Aynı zamanda, off-heap bellek dolduğunda, değiştirilmek üzere başka bir sayfa seçilmelidir (diskte saklanmak ve çıkarılmak üzere).
Ignite, değiştirilecek sayfaları bulmak için üç algoritmayı destekler:
- Random-LRU algoritması
- Segmented-LRU algoritması
- CLOCK algoritması