Ana içeriğe geç

Redis'e Giriş#

Remote Dictionary Server ifadesinin kısaltması olan Redis; kendisini daha çok veri yapısı sunucusu(as a data structure server) olarak konumlandırıyor. Redis aslen verileri bellekte tutan, açık kaynaklı bir NoSQL veri tabanıdır.

Redis’in kendi dökümantasyonundaki tanımda da değinildiği gibi redis aslında sadece basit bir key-value sunucusu değildir.Onu diğer alternatiflerinden arasından en önemli farklardan birisi Redis’in yüksek seviye veri yapılarını saklama ve kullanma yeteneğidir.Bu veri yapıları, çoğu geliştiricinin aşina olduğu temel veri yapılarıdır (list, map, set). Redis’in performansı, sadeliği ve veri yapılarının atomik manipülasyonu, geleneksel ilişkisel veritabanları ile uygulandığında performans olarak sıkıntı çıkartan problemleri çözme konusundaki yetenekleri biz geliştiricilere oldukça kolaylık sağlamaktadır.

Redis’in in memory bir veritabanı olduğundan bahsettik.Bu demek oluyorki redis verilerinizi RAM bellek üzerinde saklamaktır.Ancak isteğinize bağlı olarak verileri belirli zaman aralıklarıyla disk’e kaydedebilir.Bu sayede veri tutarlılığını da sağlamış oluyorsunuz. Redis’in verilerinizi bellekte tutmasının diğer bir avantajı okuma ve yazma işlemlerini mili saniyelere kadar düşürebilmesidir. Doğru senaryoda, doğru veri yapısını kullandığınız durumlarda veriye ulaşma maliyetinizi O(1)’e kadar düşürebilirsiniz.

Redis Kullanım Örnekleri#

  • Cache (Önbellek) sistemi
  • Session (Oturum) sistemi
  • Sayaçlar
  • Kuyruk İşlemi
  • Analiz Verileri

Pub/Sub#

Redis 2.0'dan sürümünden itibaren Pub/Sub mesajlaşma paradigmasını desteklemektedir.Hatta bazı firmalar projelerinde, redis’in sadeliği ve performansı nedeniyle RabbitMQ vb. gibi teknolojileri bırakıp redisi tercih ettiklerini açıklamaktadırlar.

Avantajları#

  • CPU kullanımını azaltır.
  • Performans artışı sağlar.
  • IO işlemini azaltır.
  • Veriye ulaşımı en basite indirir.
  • Açık kaynak kodlu olması büyük bir avantaj.
  • Birçok popüler yazılım dilini desteklemektedir.
  • Komutları kolay ve dökümante edilmiştir.
  • Birçok veri türünü desteklemektedir.
  • Senkron çalışmaktadır.
  • Cluster Sharing, Sentinel, Replication gibi birçok enterprise özelliklere sahiptir.

Dezavantajları#

  • Veri boyutu ile doğru orantılı olarak RAM ihtiyacınız artar.
  • İlişkisel veritabanlarında olduğu gibi karmaşık sorguları desteklemez.
  • Join Mantığı yoktur.
  • Transaction desteği yoktur.
  • Veri güvenliği için bir kontrol mekanizması yoktur.

Komutlar#

  • EXPIRE komutu ile süreli key-value insert edilebilir. TTL komutu ile de ne kadar süresi kaldığı öğrenilebilir.
    • TTL sonucundan -2 geliyorsa süresi bitmiştir.
    • TTL sonucundan -1 geliyorsa da süresi asla bitmeyecektir.

Cluster#

Redis, 2.6 sürümüyle ortaya koyduğu ve Sentinel adını verdiği uygulama ile failover’ın otomatik olarak yönetilmesini sağlayabiliyor.

NOT: 2.6 ile gelen Sentinel 1 sürümünün kullanılması önerilmiyor. 2.8 ve sonrasında gelen Sentinel 2 sürümü tercih edilmelidir.

Redis Cluster yapısı en yalın haliyle 1 adet master, N adet slave uygulamadan oluşur. Tüm yazma eylemleri master uygulama üzerinden yürütülür, slave’ler read-only yapılardır. Master üzerindeki verileri replika yöntemi ile üzerlerinde taşırlar.

Sentinel ise, cluster üzerindeki uygulamaları izleme, raporlama ve olası bir hata/istisna durumunda cluster’ın sağlıklı bir şekilde yoluna devam edebilmesinden sorumlu apayrı bir yapıdır.

Sentinel ne iş yapar?#

Master uygulamada bir sorun olduğunu varsayarsak bu şu anlama gelir: Artık Redis’e yeni bir veri yazılamayacak!

Tam bu esnada sistem kritik bir karara ihtiyaç duyar: Yeni master kim olacak?

Sentinel tam bu noktada devreye girer, master’da bir sorun olduğunu farkeder, gerekli konfigürasyonlar yapılmış ise diğer sentinel’ler ile haberleşir ve yeni master’ın atanmasını sağlar. Ya da rol bağımsız olarak, sorunlu uygulamayı tespit eder, cluster dışında tutar; bir süre sonra sağlıklı bir duruma geldiğini tespit ettiğinde tekrar içeri alır ve rol ataması gerçekleştirir.

Sentinel sayısı için genellikle önerilen ve “best-practice” olarak kabul gören minimum sayı 3 ve 3'ten büyük tek sayılar. Böylece oy çokluğu ile kararsızlık senaryosu devre dışı bırakılabilir.

quorum: otomatik failover senaryosunun başlayabilmesi için kaç Sentinel işleminin master’ı ulaşılamaz olarak kabul etmesi gerektiğini temsil ediyor.

Burada dikkat edilmesi gereken nokta şu: Quorum, olası bir hatanın tespiti için kullanılır. Failover gerçekleşmesi için herhangi bir Sentinel lider olarak seçilmeli ve failover’ı başlatma yetkisi kendisine verilmelidir. Bu da oy çokluğu ile gerçekleştirilebilir.

Örnek olarak quorum için 2 verilirse, failover’ın başlayabilmesi için 2 Sentinel’in master’ı ulaşılamaz kabul etmesi gerektiğini söylemiş oluruz. Buna rağmen Sentinel’ler birbiri ile haberleşemezse failover senaryosu başlamaz.

down-after-milliseconds ile kaç milisaniye sonunda bir Sentinel’in ilgili node’u ulaşılamaz olarak kabul etmesi gerektiğini ifade ediyoruz.

Yapabildikleri#

  • Monitoring. Sentinel sürekli master ve replika instanceları kontrol ederek düzgünce çalıştığından emin olur.

  • Notification. Sentinel, redis instacelarında bir problem olduğunda sistem yöneticisine bildirim gönderir ve başka bir bilgisayar programına API yardımı ile bilgilendirme yapabilir.

  • Automatic failover.

  • Configuration provider. Failover durumunda Sentinel kendisine bağlı tüm clientlara yeni master'ın adresini verecektir.

Redis Client Kütüphaneleri#

Spring'in desteklediği Redis clientları Jedis ve Lettuce kütüphaneleridir.

Peki hangisini seçmeliyiz?

Eğer yüksek scalablity istiyorsanız Lettuce tercih edilmelidir. Bunun yanında Redisin tüm özelliklerini kullanmaya olanak sağlar.

Eğer amacınız hızlıca birşeyler ortaya koymak ise ve scalability sizin için önemli değilse Jedis kullanılabilir. Jedis, lettuce'a göre kullanımı kolay ve daha lightweight'dir.