Merhaba arkadaşlar, bugün sizlere Redis sunucularında sıkça karşılaştığımız "OOM" (Out Of Memory) hatalarını önlemenin ve bellek kullanımını daha verimli hale getirmenin temel yöntemlerinden birini anlatacağım. Redis, varsayılan olarak tüm sistemi kullanma eğilimindedir. Bu rehberle, Redis'e bir bellek sınırı koymayı ve bu sınıra ulaşıldığında hangi anahtarların silineceğini belirleyen politikayı (LRU ve türevleri) nasıl yapılandıracağımızı öğreneceğiz. Bu sayede sunucunuz daha stabil çalışacak ve bellek taşmasından kaynaklanan çökmelerin önüne geçebileceksiniz.
Maxmemory Nedir ve Neden Önemli?
Redis, inanılmaz hızlı bir bellek içi (in-memory) veri deposudur. Ancak fiziksel belleğiniz sınırsız değil. `maxmemory` ayarı, Redis'in kullanabileceği maksimum bellek miktarını bayt cinsinden belirler. Bu limiti koymazsanız, Redis tüm kullanılabilir belleği tüketip sistemin swap kullanmasına veya Linux OOM Killer'ın Redis'i sonlandırmasına neden olabilir. Bu ayar, Redis'i "korumak" için kritiktir.
Temel Konfigürasyon Adımları
Öncelikle, Redis konfigürasyon dosyamızı açıyoruz. Benim sunucularda genelde bu dosya /etc/redis/redis.conf yolunda oluyor. Nano veya vi editörünü kullanabilirsiniz.
Dosya içinde `maxmemory` diye aratın. Büyük ihtimalle satır başında `#` işaretiyle yorum satırı olarak kapalı duruyordur. Bu satırı bulup düzenleyeceğiz. Diyelim ki sunucumuzda Redis için 1GB bellek ayırmak istiyoruz. 1 Gigabyte = 1073741824 bayttır. Şu ayara çok dikkat etmelisiniz, sunucunuzun toplam RAM'ine göre mantıklı bir değer verin. Redis'e tüm RAM'i vermeyin, sistem ve diğer prosesler için de alan bırakın.
Sadece limit koymak yetmez. Limit dolduğunda ne olacağını da söylememiz lazım. İşte burada `maxmemory-policy` devreye giriyor.
Maxmemory Politikaları (LRU ve Diğerleri)
`maxmemory-policy` ayarı, bellek dolduğunda yeni veri yazmak için yer açma stratejisini belirler. En yaygın kullanılan ve optimize edilmiş politikalar LRU (Least Recently Used - En Az Son Kullanılan) tabanlıdır. Politikaları aşağıdaki gibi ayarlayabilirsiniz:
İşte size mevcut politikaların özeti:
`noeviction`: (Varsayılan) Yeni veri YAZMAYA izin vermez, sadece okumaya devam eder. En güvenlisi gibi görünse de, yazma işlemi yapan uygulamalar için hata üretir.
`allkeys-lru`: Tüm anahtarlar arasından en uzun süredir kullanılmayan (LRU algoritması) anahtarları silerek yer açar. Benim sunucularda genelde kullandığım yöntemdir, eğer tüm verilerinizin TTL'si (yaşam süresi) yoksa.
`volatile-lru`: Sadece TTL (yaşam süresi) atanmış anahtarlar arasından LRU'ya göre silme yapar. Sürekli verileriniz (örneğin oturum bilgisi değil de önbelleklenmiş sorgular) için TTL kullanıyorsanız idealdir.
`allkeys-random`: Tüm anahtarlardan rastgele siler.
`volatile-random`: TTL'li anahtarlardan rastgele siler.
`volatile-ttl`: Kalan TTL'si en kısa olan anahtarları siler (TTL'si bitmek üzere olanları temizler).
Dikkat Edilmesi Gerekenler ve İnce Ayarlar
LRU algoritması Redis'te tam bir LRU değil, yaklaşık LRU kullanır. Performans ve bellek verimliliği için bu şekilde tasarlanmıştır. Doğruluğunu `maxmemory-samples` ayarı ile kontrol edebilirsiniz. Varsayılan değer 5'tir. Redis, silinecek anahtarı seçerken bu sayıda rastgele anahtar örneğine bakar ve içlerinden en iyi (en eski kullanılan) adayı seçer. Bu değeri artırmak (örneğin 10) LRU doğruluğunu artırır ama CPU kullanımını da biraz artırabilir.
Tüm bu değişiklikleri yaptıktan sonra, Redis servisini yeniden başlatmayı unutmayın.
Ayarların etkin olduğunu komut satırından kontrol etmek için Redis CLI'ye bağlanıp `CONFIG GET` komutunu kullanabilirsiniz.
Sonuç ve Öneriler
Bu konfigürasyon, Redis sunucunuzu üretim ortamında çalıştırmanın olmazsa olmazlarındandır. `maxmemory` mutlaka belirlenmeli ve uygulamanızın veri erişim modeline uygun bir politika (benim önerim genellikle `allkeys-lru`) seçilmelidir. Bu sayede Redis, belirlenen sınırlar içinde tahmin edilebilir ve kararlı bir şekilde çalışmaya devam edecektir.
Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı senaryolar için (örneğin hem TTL'li hem TTL'siz veri karışıksa) hangi politikayı tercih ediyorsunuz? Tecrübelerinizi paylaşın veya aklınıza takılan bir şey olursa aşağıya yazmaktan çekinmeyin. Sorularınızı bekliyorum arkadaşlar.
Redis, inanılmaz hızlı bir bellek içi (in-memory) veri deposudur. Ancak fiziksel belleğiniz sınırsız değil. `maxmemory` ayarı, Redis'in kullanabileceği maksimum bellek miktarını bayt cinsinden belirler. Bu limiti koymazsanız, Redis tüm kullanılabilir belleği tüketip sistemin swap kullanmasına veya Linux OOM Killer'ın Redis'i sonlandırmasına neden olabilir. Bu ayar, Redis'i "korumak" için kritiktir.
Öncelikle, Redis konfigürasyon dosyamızı açıyoruz. Benim sunucularda genelde bu dosya /etc/redis/redis.conf yolunda oluyor. Nano veya vi editörünü kullanabilirsiniz.
Bash:
sudo nano /etc/redis/redis.conf
Dosya içinde `maxmemory` diye aratın. Büyük ihtimalle satır başında `#` işaretiyle yorum satırı olarak kapalı duruyordur. Bu satırı bulup düzenleyeceğiz. Diyelim ki sunucumuzda Redis için 1GB bellek ayırmak istiyoruz. 1 Gigabyte = 1073741824 bayttır. Şu ayara çok dikkat etmelisiniz, sunucunuzun toplam RAM'ine göre mantıklı bir değer verin. Redis'e tüm RAM'i vermeyin, sistem ve diğer prosesler için de alan bırakın.
Kod:
# maxmemory <bytes> satırını bulup aşağıdaki gibi değiştirin
maxmemory 1073741824
Sadece limit koymak yetmez. Limit dolduğunda ne olacağını da söylememiz lazım. İşte burada `maxmemory-policy` devreye giriyor.
`maxmemory-policy` ayarı, bellek dolduğunda yeni veri yazmak için yer açma stratejisini belirler. En yaygın kullanılan ve optimize edilmiş politikalar LRU (Least Recently Used - En Az Son Kullanılan) tabanlıdır. Politikaları aşağıdaki gibi ayarlayabilirsiniz:
Kod:
maxmemory-policy allkeys-lru
İşte size mevcut politikaların özeti:
`noeviction`: (Varsayılan) Yeni veri YAZMAYA izin vermez, sadece okumaya devam eder. En güvenlisi gibi görünse de, yazma işlemi yapan uygulamalar için hata üretir.
`allkeys-lru`: Tüm anahtarlar arasından en uzun süredir kullanılmayan (LRU algoritması) anahtarları silerek yer açar. Benim sunucularda genelde kullandığım yöntemdir, eğer tüm verilerinizin TTL'si (yaşam süresi) yoksa.
`volatile-lru`: Sadece TTL (yaşam süresi) atanmış anahtarlar arasından LRU'ya göre silme yapar. Sürekli verileriniz (örneğin oturum bilgisi değil de önbelleklenmiş sorgular) için TTL kullanıyorsanız idealdir.
`allkeys-random`: Tüm anahtarlardan rastgele siler.
`volatile-random`: TTL'li anahtarlardan rastgele siler.
`volatile-ttl`: Kalan TTL'si en kısa olan anahtarları siler (TTL'si bitmek üzere olanları temizler).
LRU algoritması Redis'te tam bir LRU değil, yaklaşık LRU kullanır. Performans ve bellek verimliliği için bu şekilde tasarlanmıştır. Doğruluğunu `maxmemory-samples` ayarı ile kontrol edebilirsiniz. Varsayılan değer 5'tir. Redis, silinecek anahtarı seçerken bu sayıda rastgele anahtar örneğine bakar ve içlerinden en iyi (en eski kullanılan) adayı seçer. Bu değeri artırmak (örneğin 10) LRU doğruluğunu artırır ama CPU kullanımını da biraz artırabilir.
Kod:
maxmemory-samples 10
Tüm bu değişiklikleri yaptıktan sonra, Redis servisini yeniden başlatmayı unutmayın.
Bash:
sudo systemctl restart redis-server
# veya
sudo service redis restart
Ayarların etkin olduğunu komut satırından kontrol etmek için Redis CLI'ye bağlanıp `CONFIG GET` komutunu kullanabilirsiniz.
Bash:
redis-cli
127.0.0.1:6379> CONFIG GET maxmemory
127.0.0.1:6379> CONFIG GET maxmemory-policy
Bu konfigürasyon, Redis sunucunuzu üretim ortamında çalıştırmanın olmazsa olmazlarındandır. `maxmemory` mutlaka belirlenmeli ve uygulamanızın veri erişim modeline uygun bir politika (benim önerim genellikle `allkeys-lru`) seçilmelidir. Bu sayede Redis, belirlenen sınırlar içinde tahmin edilebilir ve kararlı bir şekilde çalışmaya devam edecektir.
Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı senaryolar için (örneğin hem TTL'li hem TTL'siz veri karışıksa) hangi politikayı tercih ediyorsunuz? Tecrübelerinizi paylaşın veya aklınıza takılan bir şey olursa aşağıya yazmaktan çekinmeyin. Sorularınızı bekliyorum arkadaşlar.