What is Persistence?
Ignite Persistence veya Native Persistence, kalıcı depolama sağlamak için tasarlanmış bir dizi özelliktir. Etkinleştirildiğinde, Ignite her zaman tüm verileri diskte depolar ve mümkün olduğu kadar çok veriyi işlenmek üzere RAM'e yükler. Örneğin, 100 giriş varsa ve RAM'in yalnızca 20'sini depolama kapasitesi varsa, 100'ün tamamı diskte depolanır ve daha iyi performans için RAM'de yalnızca 20'si cache’e alınır.
Persistence kapatıldığında ve hiçbir harici depolama(external storage) kullanılmadığında, Ignite saf bir in-memory storage gibi davranır.
Persistence etkinleştirildiğinde, her server node, yalnızca o node’a atanan partitionları(yedeklemeler etkinleştirilmişse backuppartitionları dahil) içeren bir veri alt kümesini sürdürür.
Persistence işlevi aşağıdaki özelliklere dayalıdır:
- Veri bölümlerini(partition) diskte depolama
- Write-ahead logging (WAL)
- Checkpointing
- Data Capture
- İşletim sistemi swap kullanımı
Persistence etkinleştirildiğinde, Ignite her partition’u diskte ayrı bir dosyada depolar. Partition dosyalarının veri formatı, hafızada tutululan verilerin formatı ile aynıdır. Partition yedeklemeleri etkinleştirilirse, bunlar da diske kaydedilir. Veri partitionlarına ek olarak, Ignite indexleri ve meta verileri de depolar.
Persistence, veri bölgesi başına yapılandırılır. Kalıcı depolamayı etkinleştirmek için veri bölgesi yapılandırmasında persistenceEnabled
özelliğinin true
olarak aayrlanması yeterlidir. Aynı anda hem in-memory veri bölgelerine hem de persist veri bölgelerine sahip olunabilir.
Persistence etkinleştirildiğinde, node kullanıcı verilerini, dizinleri ve WAL dosyalarını {IGNITE_WORK_DIR}/db dizininde depolar. Bu dizine depolama dizini denir.
Write Ahead Log(WAL)
WAL, bir node’da gerçekleşen tüm veri değiştirme işlemlerinin(silmeler dahil) günlüğüdür. RAM’de bir sayfa güncellendiğinde güncelleme doğrudan partition dosyasına yazılmaz, WAL’ın kuyruğuna eklenir.
WAL’ın amacı, tek bir node’un veya tüm cluster’ın çöktüğü senaryolar için bir kurtarma mekanizması sağlamaktır. Çökme veya yeniden başlatma durumunda, cluster WAL’ın içeriğine bağlı olarak her zaman en son başarıyla kaydedilen işleme geri yüklenebilir.
WAL birkaç dosyadan(active segments olarak adlandırılır) ve bir arşivden oluşur. Active segments sırayla doldurulur ve döngüsel bir sırayla üzerine yazılır. Birinci segment dolduğunda içeriği WAL arşivine kopyalanır. Birince segment kopyalanırken ikinci segment aktif bir WAL dosyası gibi işlem görür ve uygulama tarafından gelen tüm güncellemeleri kabul eder. Varsayılan olarak 10 active segment vardır.
Wal Modes
3 WAL modu vardır. Her mod, performansı nasıl etkilediği konusunda farklılık gösterir ve farklı tutarlılık(consistency) garantileri sağlar.
Mod | Açıklama | Consistency(Tutarlılık) Garantileri |
---|---|---|
FSYNC | Değişikliklerin, her atomik yazma veya transactional commit için diskte kalıcı olması garanti edilir. | Veri güncellemeleri, herhangi bir işletim sistemi veya process çökmesinden veya elektrik kesintisinden sonra asla kaybolmaz. |
LOG_ONLY | Varsayılan mod. |
Değişikliklerin, her atomik yazma veya transactional commit için OS buffer’ına veya memory-mapped(bellek eşlemeli) bir dosyaya boşaltılması garanti edilir. Bellek eşlemeli dosya yaklaşımı varsayılan olarak kullanılır ve IGNITE_WAL_MMAP sistem özelliği falseolarak ayarlanarak kapatılabilir. | Veri güncellemeleri bir process çökmesinden sonra kaybolmaz. | | BACKGROUND | IGNITE_WAL_MMAP özelliği etkinleştirildiğinde (varsayılan), bu mod, LOG_ONLY modu gibi davranır. Bellek eşlemeli dosya yaklaşımı devre dışı bırakılırsa, değişiklikler node’un dahili buffer’ında kalır ve periyodik olarak diske boşaltılır. Flush sıklığı, walFlushFrequency parametresi aracılığıyla belirtilir. | IGNITE_WAL_MMAP özelliği etkinleştirildiğinde (varsayılan), LOG_ONLY moduyla aynı garantileri sağlar. Aksi takdirde, bir process çökmesi veya diğer kesintiler durumunda son veri güncellemeleri kaybolabilir. | | NONE | Bu modda WAL devre dışıdır. Değişiklikler, yalnızca node’u gracefully kapattığınızda kalıcı olur. Cluster’ı devre dışı bırakmak ve node’u kapatmak için Ignite.active(false) özelliği kullanılabilir. | Veri kaybı meydana gelebilir. Güncelleme işlemleri sırasında bir node aniden sonlandırılırsa, diskte depolanan verilerin senkronizasyon dışı kalması veya bozulması çok olasıdır. |
WAL Archive
WAL arşivi, bir çökmeden sonra node’u kurtarmak için gerekli olabilecek WAL segmentlerini depolamak için kullanılır. Arşivde tutulan segmentlerin sayısı, tüm segmentlerin toplam boyutunun WAL arşivinin belirtilen boyutunu aşmayacağı şekildedir.
Varsayılan olarak, WAL arşivinin maksimum boyutu (diskte kapladığı toplam alan), checkpointing buffer boyutunun 4 katı olarak tanımlanır. Bu değer konfigürasyonda değiştirilebilir.
WAL arşiv boyutunun varsayılandan daha düşük bir değere ayarlanması performansı etkileyebilir ve production’da kullanılmadan önce test edilmelidir.
Changing WAL Segment Size
Varsayılan WAL segment boyutu (64 MB), WAL'ın segmentler arasında çok sık geçiş yapmasına neden olduğundan ve switching/rotation maliyetli bir işlem olduğundan, yüksek yük senaryolarında verimsiz olabilir. Daha büyük bir WAL segmenti boyutu, WAL dosyalarının ve WAL arşivinin toplam boyutunu artırma pahasına, yüksek yükler altında performansı artırmaya yardımcı olabilir.
Konfigürasyonda WAL segment dosyalarının boyutu değiştirilebilir. Değer 512KB
ile 2GB
arasında olmalıdır.
- ⌨️ XML Config
<bean class="org.apache.ignite.configuration.IgniteConfiguration" id="ignite.cfg">
<property name="dataStorageConfiguration">
<bean class="org.apache.ignite.configuration.DataStorageConfiguration">
<!-- set the size of wal segments to 128MB -->
<property name="walSegmentSize" value="#{128 * 1024 * 1024}"/>
<property name="defaultDataRegionConfiguration">
<bean class="org.apache.ignite.configuration.DataRegionConfiguration">
<property name="persistenceEnabled" value="true"/>
</bean>
</property>
</bean>
</property>
</bean>
Disabling WAL
Daha iyi performans elde etmek için WAL'ı devre dışı bırakmanın mantıklı olduğu durumlar vardır. Örneğin, server ayağa kalkarken ilk veri yükleme sırasında WAL'ı devre dışı bırakmak ve preload tamamlandıktan sonra etkinleştirmek yararlıdır.
WAL'ın devre dışı bırakılması veya etkinleştirilmesi yalnızca kararlı(stable) topolojide yapılmalıdır: tüm baseline node’lar cluster’da mevcut olmalıdır, bu işlem süresince hiçbir node cluster’a katılmamalı veya cluster’dan ayrılmamalıdır. Aksi takdirde, cache tutarsız durumda kalabilir. Böyle bir durumda, etkilenen cache(ler)in imha edilmesi önerilir.
WAL devre dışı bırakılırsa ve bir node yeniden başlarsa, o node’daki kalıcı depolama alanından tüm veriler kaldırılır. Bu, WAL olmadan node çökmesi veya yeniden başlatma durumunda veri tutarlılığının garanti edilemeyeceği için uygulanmaktadır.
WAL Archive Compaction
WAL Arşivi tarafından kaplanan alanı azaltmak için WAL Arşivi sıkıştırma etkinleştirilebilir. Varsayılan olarak, WAL Arşivi son 20 checkpoint için segmentler içerir (bu sayı değiştirilebilir). Sıkıştırma etkinleştirilirse, 1 checkpoint eski olan tüm arşivlenmiş segmentler ZIP formatında sıkıştırılır. Segmentlere ihtiyaç duyulursa (örneğin, verileri node’lar arasında yeniden dengelemek için), bunlar RAW formatına sıkıştırılmamış haldedir.
Disabling WAL Archive
Bazı durumlarda, örneğin WAL segmentlerinin arşive kopyalanmasıyla ilişkili ek yükü azaltmak için WAL arşivleme devre dışı bırakılmak istenebilir. Ignite'ın verileri WAL segmentlerine, segmentlerin arşive kopyalanmasından daha hızlı yazdığı bir durum olabilir. Bu, node’un çalışmasını dondurabilen bir I/O darboğazı(bottleneck) oluşturabilir. Bu tür sorunlarla karşılaşılırsa, WAL arşivlemeyi devre dışı bırakmak sorunu çözebilir.
Arşivlemeyi devre dışı bırakmak için WAL yolunu ve WAL arşiv yolunu aynı değere ayarlamak yeterlidir. Bu durumda Ignite, segmentleri arşive kopyalamaz; bunun yerine WAL klasöründe yeni segmentler oluşturur. WAL Arşiv boyutu ayarına bağlı olarak, WAL büyüdükçe eski segmentler silinir.
WAL Records Compression
Veri güncellemelerini temsil eden fiziksel ve mantıksal kayıtlar, kullanıcı işlemi onaylanmadan önce WAL dosyalarına yazılır. Ignite, yerden tasarruf etmek için diske yazılmadan önce bellekteki WAL kayıtlarını sıkıştırabilir.
Checkpointing
Checkpointing, kirli sayfaları(dirty pages) RAM'den diskteki partition dosyalarına kopyalama işlemidir. Kirli sayfa, RAM'de güncellenen ancak ilgili partititon dosyasına yazılmamış bir sayfadır (ancak güncelleme WAL'a eklenmiştir).
Bir checkpoint oluşturulduktan sonra, tüm değişiklikler diskte saklanır ve node çöküp yeniden başlatıldığında kullanılabilir.
Checkpoint oluşturma ve write-ahead logging, verilerin dayanıklılığını(durability) ve bir node arızası durumunda kurtarmayı(recovery) sağlamak için tasarlanmıştır.
Bu işlem, sayfaları diskte en güncel durumda tutarak disk alanını tutumlu bir şekilde kullanmaya yardımcı olur. Bir checkpoint geçildikten sonra, o noktadan önce oluşturulan WAL segmentlerini silmekte bir sakınca yoktur.