DevVeri.com

Boğulacaksan büyük veride boğul!

Hazelcast – Veri Dağıtım Sanatı

Hazelcast kümeleme ve yüksek ölçeklenebilir bir veri dağıtım platformudur. Bundan daha iyi bir tanım ise sitesinde karşımıza çıkan “The Art of Data Distribution” yani “Veri Dağıtım Sanatı” olabilir, çünkü Hazelcast gerçekten ilham verici bir proje. 2008 yılında Türk yazılımcılar Talip Öztürk ve Fuad Malikov tarafından geliştirilmeye başlanan proje, açık kaynaklı ve ticari sürüm olarak ikiye ayrılıyor ve geliştirilmeye devam ediyor. Şu anda Ericsson, Turkcell Teknoloji, Atlassian, Sahibinden.com, Avea gibi bir çok firmada kullanılmakta.

Telekom, finans, internet gibi sektör uygulamalarında sıklıkla veriye anlık erişim ihtiyacı sözkonusudur. Bu gibi durumlarda veritabanları hız açısından, önbellek (cache) ise aktif verinin hafızaya sığmayacak kadar büyük olmasından dolayı yetersiz kalabilir. İşte Hazelcast burada devreye giriyor. Hazelcast JVM’leri bir küme içerisinde bir araya getirerek hafızaya yerleştirilmiş veritabanı (in-memory database) olarak çalışıyor. Veri erişimi SQL dili ile yapılmadığı için Hazelcast de bir NoSQL veritabanı diyebiliriz.

Hazelcast’in yeteneklerinin hepsini bir yazıda anlatmak mümkün olamayacağı için bu yazıda sadece genel bir çerçeve çizmeye çalışacağım.

Hazelcast JVM’leri bir araya getirme özelliği sayesinde standart Java kütüphanesindeki Queue, Map, Set, List gibi sınıflar küme üzerinde dağıtık halde çalışabilir hale gelir ve farklı instance’lar arasında ortak olarak kullanılabilirler. Yani A instance’ında Hazelcast’de paylaştırılmış bir map objesine bir eleman eklediğinizde aynı elemana B instance’ından erişebilirsiniz. Aynı şekilde dağıtık Lock objesi ile farklı instance’lar arasında senkronizasyon mekanizması çok rahat bir şekilde geliştirilebilir. A instance’ında lock ettiğiniz bir bloğa B instance’ında gelindiğinde B instance’ı A’nın işinin bitmesini bekleyecektir. Bunlar gibi dağıtık ExecutorService ile görevler küme üzerindeki instance’lara dağıtılarak çok daha hızlı şekilde çalıştırılabilir, Topic ile sunucular arası mesajlaşma geliştirilebilir vs.

Hazelcast verileri saklarken verilerin kaybolmasına engel olmak için farklı instance’larda verilerin yedeğini de tutar. Bu sayede instance’lardan birisinde bir problem olursa yedekleri de bulunduğundan dolayı küme bundan etkilenmez, veri kaybı yaşanmaz.

Hazelcast yazma ve okuma işlemlerinde veri bütünlüğünü garanti eder. Yani bir yazma işlemi başarılı bir şekilde tamamlandığında bu işlem gerçekten kümenin tamamında geçerlidir. Farklı bir instance’dan verinin eski haline erişmek sözkonusu olmaz. Aynı şekilde bir okuma işlemi kümenin tamamında her zaman verinin en güncel haline erişir.

Hazelcast verileri küme içerisinde dengeli olacak şekilde dağıtır. Bu sayede bir instance’a yüklenilmesi, diğer instance’ların yan gelip yatması sözkonusu olmaz. Ayrıca kümeye yeni bir instance eklendiğinde veriler zaman içerisinde dinamik olarak yeni gelen sunucuya dağılmaya başlar, bu sayede bir süre sonra küme içindeki veri dengelenmiş olur.

Hazelcast küme içerisinde dağılmış verileri okuma işlemlerinde öncelikli olarak varsa lokal instance’dan yapar. Bu sayede ağ trafiğini minimuma indirir.

Hazelcast mevcut bir java sürecinin (process), yani bir java uygulamasının içerisinden çalışabilir. Ayrıca bağımsız (standalone) tek bir süreç olarak çalışabilir. Küme içerisindeki herhangi bir instance’dan tüm verilere erişilebilir. Farklı işlemler için farklı süreçler ya da okuma yazma yapabilmek için ayrı ayrı instance’lara bağlanmaya gerek yoktur.

Hazelcast konfigürasyonu süper kolaydır. Hiçbir konfigürasyon bulunmadığı durumda bile varsayılan ayarlarla ayağa kalkabilir. Tek bir hazelcast.xml dosyası ile konfigürasyon yapılabilir. Hazelcast instance’ları birbirlerini otomatik olarak ağ üzerinde keşfederek birleşip küme oluşturabilirler. Diğer dağıtık cache uygulamalarında küme oluşturmak için yapılması gereken sürüyle konfigürasyon Hazelcast’de çok basittir. Ayrıca en güzel özelliklerinden birisi de programatik olarak da konfigürasyon yapabilmenin kolaylığıdır. Programatik olarak küme üzerindeki olayları (event) yönetebilmek de mümkündür. Bu sayede küme üzerine tam kontrol geliştiricinin elindedir.

Mevcut web uygulamarının war dosyası üzerinde yapılan ufak bir işlem sonrasında HttpSession Hazelcast üzerinde tutulabilecek şekilde ayarlanabilir. Bu sayede yük dağıtımında sticky session özelliği kullanılmak zorunda kalmaz, her istek farklı sunuculara düşebilir şekilde ayarlanarak uygulama ölçeklendirilebilir hale gelir.

Hazelcast Java ile geliştirilmiş olsa da farklı platformlar tarafından da rahatlıkla kullanılabilir. Java ve C# kütüphaneleri dışında REST ve Memcache protokolü üzerinden erişim imkanı da bulunur. Yani mevcut olarak Memcache kullanan bir uygulamanızı hiçbir değişiklik yapmadan Hazelcast’e yönlendirip Memcache gibi çalışmasını sağlayabilirsiniz.

MapStore arayüzü ile Hazelcast üzerindeki verileri başka bir ortamda da saklamanıza imkan veriyor. Bu sayede verileri ister veritabanına, ister dosyaya istediğiniz herhangi bir yerde saklayabilirsiniz. Yani veriler sadece hafızada tutulmak zorunda değildir. Aktifliğini yitiren veriler veritabanına yazılacak şekilde (persistence) ayarlanabilir.

Bunlar dışında Spring Framework ile entegre çalışabilme, JCA üzerinden J2EE container entegrasyonu ve transaction desteği, Socket seviyesinde level şifreleme ve güvenlik, senkron veya asenkron (write-behind) yazma desteği, Hibernate ile 2nd level cache olarak çalışabilme, JMX üzerinden kümenin yönetilebilmesi gibi bir çok özelliğe sahiptir.

Bir önbellek olarak değerlendirildiğinde internet dünyasında yoğun olarak kullanılan Memcache ile kıyaslarsak;

Memcache Hazelcast
Çok hızlıdır Hızlıdır
Veriler anahtar değerine göre dağıtılır, yeni sunucu eklendiğinde bu formül bozulur, verilerin bir kısmı geçersiz hale gelir Veriler dengeli bir şekilde dağılır, yeni sunucu eklendiğinde de veriler bu sunucuyla paylaşılır
Verinin yedeği tutulmaz Verilerin yedeği tutulur, bu değer ayarlanabilir
Sadece Map gibi çalışabilir Queue, List, Map, Set, Lock gibi farklı veri tipleri tutabilir

Memcache basit yapısı itibariyle ile hız ihtiyacı olan yerlerde kullanılmaya çok uygunken hızdan ziyade daha akıllı sistemlere ihtiyaç olunan her yerde Hazelcast yetenekleri ile hayat kurtaracaktır.

Hazelcast ile yapılabilecek uygulamaların sınırı yok, bu yüzden ilham verici bir proje olduğunu bir kere daha belirtmek gerekiyor.

, , , ,

4 thoughts on “Hazelcast – Veri Dağıtım Sanatı

  • Erhan dedi ki:

    Hazelcast ile ilgili dokumantasyonlar javadoc seviyesinde olduğundan dolayı hazelcast nedir ne iş yapar nasıl başlarım diyenler için güzel bir yazı olmuş. Elinize sağlık.

  • Melih Coskun dedi ki:

    Guzel bir calisma olmus ama hazelcast ile ilgili daha ozel makaleler de yayinlarsaniz cok iyi olur , ornegim clustering group, SPI, en iyi performans saglayabilmek icin hangi konfigurasyonlar ise yarar gibi 🙂 cok sey mi istedim

  • okan dedi ki:

    Güzel bir yazı, teşekkürler

  • mehmet dedi ki:

    Çok güzel ve anlaşılır bir yazı olmuş. Elinize sağlık.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.