Modern web geliştirme ortamında, monolitik mimarilerden dağıtılmış mikro hizmetlere dayalı sistemlere geçiş, önemli bir zorluk olan durumu yönetmeyi gündeme getirmiştir. Geleneksel sunucu taraflı oturumlar, yatay olarak ölçeklendirildiğinde darboğaza neden olan yerel bellek veya disk depolamaya dayanır. Kullanıcı kimlik doğrulamasından sonra farklı bir sunucuya yönlendirilirse ve veriler paylaşılmazsa oturum verileri kaybolur. Burada devreye giren, bellek içi veri yapısı deposu olan Redis ve özellikle yüksek erişilebilirlik ve yatay olarak ölçeklendirilebilir oturum yönetim sistemleri oluşturmak için çözüm sunan Redis Kümeleme (Redis Clusters) devreye girer.
Durum Bilgisi Taşıyan Uygulamaların Zorluğu
Durum bilgisi taşıyan uygulamalar, sunucunun kullanıcının durumunu birden fazla istek boyunca hatırlamasını gerektirir. Tek sunuculu bir ortamda oturumları yerel bellekte saklamak hızlı ve basittir. Ancak trafik arttıkça, yük dengeleyici kullanarak yükü birden fazla uygulama sunucusu arasında dağıtmanız gerekir. Paylaşılan bir durum depolama mekanizması olmadan, oturum bağlılığı (yapışkan oturumlar) bir gereklilik haline gelir; bu da dengesiz yük dağılımına ve potansiyel tek başarısızlık noktalarına yol açar.
Oturum depolamayı merkezileştirmek, uygulama durumunu uygulama sunucularından ayırır. Bu, tüm sunucuların merkezi oturum deposuna erişebildiği sürece havuzdaki herhangi bir sunucunun herhangi bir isteği işleyebilmesini sağlar. Redis, alt milisaniye okuma/yazma gecikmesi ve zengin veri yapıları sayesinde bu alandaki endüstri standardıdır.
Oturum Yönetimi İçin Neden Redis Kümeleme?
Bir tekil Redis örneği küçük ölçekli uygulamalar için çalışsa da, tek bir başarısızlık noktası (SPOF) ve bir ölçeklendirme sınırı getirir. Redis Cluster, bu sorunları veriyi birden fazla düğüm arasında bölütleme yoluyla ele alır. Şunları sağlar:
- Yatay Ölçeklenebilirlik: Kapasiteyi sorunsuz bir şekilde artırmak için düğümler ekleyin.
- Yüksek Erişilebilirlik: Bir ana düğüm çalışmayı durdurursa otomatik olarak devralma (failover) gerçekleşir.
- Veri Parçalanması (Sharding): Veri, düğümler arasında 16.384 hash yuvasına otomatik olarak bölünür ve bu da eşit dağılımı sağlar.
Redis Oturumlarını Pratikte Uygulama
Dağıtılmış oturumları uygulamak için genellikle web çerçevemize (örneğin Express.js, Django veya Spring Boot) entegre olan bir ara yazılım kütüphanesi kullanırız. Aşağıda, Express oturumlarını bir Redis Cluster'a bağlayan Node.js ve connect-redis kütüphanesi kullanılarak hazırlanmış pratik bir örnek bulunmaktadır.
Ön Koşullar
Çalışan bir Redis Cluster'ınız olduğundan emin olun. Bunu Docker Compose kullanarak yerel olarak ayağa kaldırabilir veya AWS ElastiCache veya Azure Cache for Redis gibi yönetilen bir hizmet kullanabilirsiniz.
Kod Örneği: Redis Cluster ile Express
Öncelikle gerekli bağımlılıkları yükleyin:
npm install express connect-redis express-session ioredis
Ardından, oturum ara yazılımını yapılandırın. Burada kritik nokta, ioredis istemcisini küme uç noktalarına bağlanacak şekilde yapılandırmaktır.
const express = require('express');
const session = require('express-session');
const RedisStore = require('connect-redis').default;
const Redis = require('ioredis');
const app = express();
// Redis Cluster istemcisi yapılandırması
const redisClient = new Redis.Cluster([
{ port: 6379, host: '127.0.0.1' },
{ port: 6380, host: '127.0.0.1' },
// Gerekirse daha fazla düğüm ekleyin
]);
// Oturum deposunu başlatma
const sessionStore = new RedisStore({
client: redisClient,
prefix: 'sess:', // Çakışmaları önlemek için anahtar ön eki
ttl: 86400 // Saniye cinsinden oturum TTL süresi (24 saat)
});
// Oturum ara yazılımını uygula
app.use(session({
store: sessionStore,
secret: 'your-secret-key',
resave: false,
saveUninitialized: false,
cookie: { secure: true, httpOnly: true, maxAge: 86400000 }
}));
app.listen(3000, () => {
console.log('Sunucu, Redis Cluster oturumlarıyla 3000 portunda çalışıyor');
});
Performans ve Güvenlik İçin En İyi Uygulamalar
Redis Cluster'lara geçerken aşağıdaki optimizasyonları göz önünde bulundurun:
- Anahtar Süresi Dolma (Key Expiry): Oturum anahtarlarına her zaman Bir Yaşam Süresi (TTL) ayarlayın. Bu, bellek sızıntılarını önler ve eski oturumların otomatik olarak temizlenmesini sağlar. Redis bunu bellek içi bir işlem olarak verimli bir şekilde yönetir.
- Serialization (Seri Hale Getirme): Oturum yüklerini küçük tutun. Oturumlarda büyük nesneler veya base64 ile kodlanmış resimler saklamaktan kaçının. Bunun yerine, bir referans kimliği saklayın ve gerekirse ağır verileri veritabanından çekin.
- Güvenlik: Oturumların yalnızca HTTPS üzerinden gönderildiğinden emin olmak için
secureçerezlerini kullanın. Ayrıca, çerezlerin değiştirilmesini önlemek için imzalama amacıyla güçlü birsecretkullanın. - İzleme (Monitoring): Bellek kullanımı, isabet/kaçırma oranları ve gecikme gibi Redis Cluster metriklerini izleyin. Bu amaç için Prometheus ve Grafana gibi araçlar iyi çalışır.
Sonuç
Durum bilgisi taşıyan uygulamaları ölçeklendirmek artık bir engel değil, yönetilebilir bir mühendislik zorluğudur. Dağıtılmış oturum yönetimi için Redis Kümeleme'lerden yararlanarak geliştiriciler yüksek erişilebilirlik, düşük gecikme süresi ve sorunsuz yatay ölçeklendirme elde edebilir. Küçük bir girişim mi yoksa büyük ölçekli bir kurumsal uygulama mı çalıştırıyorsunuz, uygulama sunucularından oturum durumunu ayırmak, dayanıklı ve ölçeklenebilir web altyapısı oluşturmak için kritik bir adımdır. Redis'i benimseyin, uygulamanız trafik artışlarını güvenle yönetmeye hazır olacaktır.