AWS ElastiCache Redis Kurulumu ve Yapılandırması

Üretim ortamında yüksek trafikli bir uygulama çalıştırıyorsanız, veritabanı sorgularının her istekte tekrarlanması hem performansı hem de maliyeti ciddi biçimde etkiler. İşte tam bu noktada Redis devreye giriyor. AWS ElastiCache, Redis’i yönetilen bir servis olarak sunarak kurulum, yama, yedekleme ve ölçeklendirme gibi operasyonel yükleri sizin omuzlarınızdan alıyor. Bu yazıda, sıfırdan bir ElastiCache Redis kümesi kurarak gerçek dünya senaryolarında nasıl kullanacağınızı adım adım anlatacağım.

ElastiCache Redis Nedir ve Neden Kullanmalısınız?

ElastiCache Redis, AWS’nin tam yönetimli bellek içi veri depolama servisidir. Kendi Redis sunucunuzu EC2 üzerinde kurup yönetmek yerine, AWS’nin altyapısında çalışan, otomatik failover desteğine sahip, monitör edilebilir bir Redis ortamı elde edersiniz.

Gerçek hayattan bir örnek vereyim: E-ticaret platformumuzda her ürün sayfası açıldığında aynı kategori verileri PostgreSQL’den çekiliyordu. Günde 500.000 sayfa görüntülenmesinde bu durum veritabanını boğuyordu. ElastiCache Redis entegrasyonundan sonra veritabanı yükü yüzde seksen düştü, sayfa yüklenme süresi ise 800ms’den 120ms’ye indi.

Ne zaman ElastiCache Redis kullanmalısınız:

  • Session yönetimi ve kullanıcı kimlik doğrulama token’ları
  • Sık değişmeyen verilerin cache’lenmesi (ürün kataloğu, konfigürasyonlar)
  • Gerçek zamanlı liderlik tabloları ve sayaçlar
  • Pub/Sub mesajlaşma sistemleri
  • Rate limiting implementasyonları

Ön Hazırlıklar

Başlamadan önce birkaç şeyi hazırlamanız gerekiyor. AWS Console’a erişiminiz olduğunu ve temel VPC bilgisine sahip olduğunuzu varsayıyorum.

İhtiyacınız olanlar:

  • AWS hesabı ve yeterli IAM izinleri
  • Mevcut bir VPC (ya da yeni bir tane oluşturacaksınız)
  • En az iki farklı Availability Zone’da subnet
  • EC2 üzerinde çalışan bir uygulama sunucusu (test için)
  • AWS CLI kurulu ve yapılandırılmış

AWS CLI kurulu değilse önce onu halledelim:

# Linux için AWS CLI kurulumu
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

# Doğrulama
aws --version

# Kimlik yapılandırması
aws configure
# AWS Access Key ID: AKIAXXXXXXXXXXXXXXXX
# AWS Secret Access Key: xxxxxxxxxxxxxxxxxxxxxxxxxx
# Default region name: eu-west-1
# Default output format: json

VPC ve Güvenlik Grubu Yapılandırması

ElastiCache Redis, VPC içinde çalışır ve internet üzerinden doğrudan erişilemez. Bu aslında güvenlik açısından büyük avantaj. Önce Redis için bir güvenlik grubu oluşturalım.

# Mevcut VPC ID'nizi öğrenin
aws ec2 describe-vpcs --query 'Vpcs[*].[VpcId,CidrBlock,Tags[?Key==`Name`].Value|[0]]' 
  --output text

# Redis için güvenlik grubu oluştur
aws ec2 create-security-group 
  --group-name redis-sg 
  --description "ElastiCache Redis Security Group" 
  --vpc-id vpc-0abc12345def67890

# Çıktıdan GroupId'yi not edin: sg-0123456789abcdef0

# Uygulama sunucusunun güvenlik grubundan 6379 portuna erişim ver
aws ec2 authorize-security-group-ingress 
  --group-id sg-0123456789abcdef0 
  --protocol tcp 
  --port 6379 
  --source-group sg-0987654321fedcba0

Burada dikkat edilmesi gereken nokta: Redis portunu 0.0.0.0/0’a açmayın. Sadece uygulama sunucularınızın güvenlik grubuna izin verin. Production’da bu kuralı çiğnemek ciddi güvenlik açıklarına yol açar.

ElastiCache Subnet Grubu Oluşturma

ElastiCache, hangi subnet’lerde çalışacağını bilmesi için bir subnet grubu tanımına ihtiyaç duyar. Yüksek erişilebilirlik için farklı AZ’lardaki subnet’leri ekleyin.

# Mevcut subnet'lerinizi listeleyin
aws ec2 describe-subnets 
  --filters "Name=vpc-id,Values=vpc-0abc12345def67890" 
  --query 'Subnets[*].[SubnetId,AvailabilityZone,CidrBlock]' 
  --output text

# ElastiCache subnet grubu oluştur
aws elasticache create-cache-subnet-group 
  --cache-subnet-group-name redis-subnet-group 
  --cache-subnet-group-description "Redis subnet group for production" 
  --subnet-ids subnet-0aaa111222333444 subnet-0bbb555666777888

# Doğrulama
aws elasticache describe-cache-subnet-groups 
  --cache-subnet-group-name redis-subnet-group

Redis Parametre Grubu Oluşturma

Varsayılan parametre grubu çoğu zaman yeterlidir ama production için birkaç ayarı özelleştirmenizi öneririm. Özellikle maxmemory-policy kritik bir parametredir.

# Mevcut parametre gruplarını listele
aws elasticache describe-cache-parameter-groups 
  --query 'CacheParameterGroups[*].[CacheParameterGroupName,CacheParameterGroupFamily]' 
  --output text

# Özel parametre grubu oluştur
aws elasticache create-cache-parameter-group 
  --cache-parameter-group-name redis7-production-params 
  --cache-parameter-group-family redis7 
  --description "Production Redis 7 parameter group"

# Kritik parametreleri ayarla
aws elasticache modify-cache-parameter-group 
  --cache-parameter-group-name redis7-production-params 
  --parameter-name-values 
    ParameterName=maxmemory-policy,ParameterValue=allkeys-lru 
    ParameterName=timeout,ParameterValue=300 
    ParameterName=tcp-keepalive,ParameterValue=60 
    ParameterName=lazyfree-lazy-eviction,ParameterValue=yes

maxmemory-policy seçenekleri hakkında kısa not:

  • allkeys-lru: Bellek dolduğunda en az kullanılan key’leri sil (cache için ideal)
  • volatile-lru: Sadece TTL set edilmiş key’leri sil
  • noeviction: Bellek dolduğunda hata döndür (session store için uygun)
  • allkeys-random: Rastgele key sil (genellikle tavsiye edilmez)

Cache kullanımı için allkeys-lru benim tercihim. Session store olarak kullanıyorsanız noeviction veya volatile-lru daha güvenli.

Redis Kümesi Oluşturma

Şimdi asıl işe geliyoruz. İki farklı senaryo için kurulum göstereceğim: tek node (development/küçük ölçek) ve cluster mode disabled replication group (production için önerilen).

Tek Node Kurulum (Development)

aws elasticache create-cache-cluster 
  --cache-cluster-id redis-dev 
  --cache-node-type cache.t3.micro 
  --engine redis 
  --engine-version 7.0 
  --num-cache-nodes 1 
  --cache-parameter-group-name redis7-production-params 
  --cache-subnet-group-name redis-subnet-group 
  --security-group-ids sg-0123456789abcdef0 
  --tags Key=Environment,Value=development Key=Project,Value=myapp

Production: Replication Group ile Yüksek Erişilebilirlik

Production ortamı için Multi-AZ ve otomatik failover destekli bir replication group kuruyoruz:

aws elasticache create-replication-group 
  --replication-group-id redis-prod 
  --replication-group-description "Production Redis cluster with HA" 
  --num-cache-clusters 3 
  --cache-node-type cache.r7g.large 
  --engine redis 
  --engine-version 7.0 
  --cache-parameter-group-name redis7-production-params 
  --cache-subnet-group-name redis-subnet-group 
  --security-group-ids sg-0123456789abcdef0 
  --automatic-failover-enabled 
  --multi-az-enabled 
  --at-rest-encryption-enabled 
  --transit-encryption-enabled 
  --auth-token "YourStrongAuthToken123!@#" 
  --snapshot-retention-limit 7 
  --snapshot-window "02:00-03:00" 
  --preferred-maintenance-window "sun:05:00-sun:06:00" 
  --tags Key=Environment,Value=production Key=Project,Value=myapp

Önemli parametreler:

  • –num-cache-clusters 3: 1 primary + 2 replica node anlamına gelir
  • –automatic-failover-enabled: Primary çökerse replica otomatik devralır
  • –at-rest-encryption-enabled: Diskteki veriyi şifreler
  • –transit-encryption-enabled: Aktarım sırasında TLS şifrelemesi
  • –auth-token: Redis AUTH şifresi, en az 16 karakter olmalı
  • –snapshot-retention-limit 7: 7 günlük yedek sakla
  • cache.r7g.large: Memory optimized instance, production için r serisi tercih edin

Kümenin oluşmasını beklemek için:

# Durum kontrolü - "available" olana kadar bekleyin
aws elasticache describe-replication-groups 
  --replication-group-id redis-prod 
  --query 'ReplicationGroups[0].Status'

# Endpoint bilgisini öğrenin
aws elasticache describe-replication-groups 
  --replication-group-id redis-prod 
  --query 'ReplicationGroups[0].NodeGroups[0].PrimaryEndpoint'

Uygulamanızdan Bağlanma

Kümeniz hazır olduğunda endpoint bilgisini alarak uygulamanıza entegre edebilirsiniz. Birkaç farklı dil için örnek göstereyim.

Python ile Bağlantı

import redis
import os

# TLS ve AUTH ile bağlantı
redis_client = redis.Redis(
    host=os.environ.get('REDIS_HOST', 'redis-prod.xxxxx.ng.0001.euw1.cache.amazonaws.com'),
    port=6379,
    password=os.environ.get('REDIS_AUTH_TOKEN'),
    ssl=True,
    ssl_cert_reqs=None,
    decode_responses=True,
    socket_connect_timeout=5,
    socket_timeout=5,
    retry_on_timeout=True,
    health_check_interval=30
)

# Basit cache fonksiyonu
def get_user_data(user_id):
    cache_key = f"user:{user_id}"
    
    # Önce cache'e bak
    cached = redis_client.get(cache_key)
    if cached:
        print(f"Cache hit for user {user_id}")
        return cached
    
    # Cache miss - veritabanından çek
    user_data = fetch_from_database(user_id)
    
    # 1 saatliğine cache'le
    redis_client.setex(cache_key, 3600, str(user_data))
    return user_data

# Rate limiting örneği
def check_rate_limit(ip_address, limit=100, window=60):
    key = f"rate_limit:{ip_address}"
    
    pipe = redis_client.pipeline()
    pipe.incr(key)
    pipe.expire(key, window)
    results = pipe.execute()
    
    request_count = results[0]
    return request_count <= limit

Node.js ile Bağlantı

const Redis = require('ioredis');

const redis = new Redis({
  host: process.env.REDIS_HOST,
  port: 6379,
  password: process.env.REDIS_AUTH_TOKEN,
  tls: {
    rejectUnauthorized: false
  },
  retryStrategy: (times) => {
    const delay = Math.min(times * 50, 2000);
    return delay;
  },
  maxRetriesPerRequest: 3,
  lazyConnect: true
});

redis.on('connect', () => console.log('Redis bağlantısı kuruldu'));
redis.on('error', (err) => console.error('Redis hatası:', err));

// Session cache örneği
async function setSession(sessionId, userData, ttl = 3600) {
  await redis.setex(
    `session:${sessionId}`,
    ttl,
    JSON.stringify(userData)
  );
}

async function getSession(sessionId) {
  const data = await redis.get(`session:${sessionId}`);
  return data ? JSON.parse(data) : null;
}

module.exports = { redis, setSession, getSession };

Monitoring ve Alarm Kurulumu

Kurulum yaptınız, çalışıyor, peki ya bir şeyler ters giderse? CloudWatch ile kritik metrikleri izlemek zorundasınız.

# CPU kullanımı için alarm
aws cloudwatch put-metric-alarm 
  --alarm-name "ElastiCache-HighCPU" 
  --alarm-description "Redis CPU kullanimi yuksek" 
  --metric-name CPUUtilization 
  --namespace AWS/ElastiCache 
  --statistic Average 
  --period 300 
  --threshold 75 
  --comparison-operator GreaterThanThreshold 
  --evaluation-periods 2 
  --dimensions Name=CacheClusterId,Value=redis-prod-0001-001 
  --alarm-actions arn:aws:sns:eu-west-1:123456789:ops-alerts 
  --ok-actions arn:aws:sns:eu-west-1:123456789:ops-alerts

# Bellek kullanımı alarmı
aws cloudwatch put-metric-alarm 
  --alarm-name "ElastiCache-HighMemory" 
  --alarm-description "Redis bellek kullanimi yuksek" 
  --metric-name DatabaseMemoryUsagePercentage 
  --namespace AWS/ElastiCache 
  --statistic Average 
  --period 300 
  --threshold 80 
  --comparison-operator GreaterThanThreshold 
  --evaluation-periods 2 
  --dimensions Name=CacheClusterId,Value=redis-prod-0001-001 
  --alarm-actions arn:aws:sns:eu-west-1:123456789:ops-alerts

# Cache hit ratio alarm (dusuk hit ratio kotu)
aws cloudwatch put-metric-alarm 
  --alarm-name "ElastiCache-LowCacheHitRatio" 
  --alarm-description "Cache hit ratio dusuk - performans sorunu" 
  --metric-name CacheHitRate 
  --namespace AWS/ElastiCache 
  --statistic Average 
  --period 300 
  --threshold 80 
  --comparison-operator LessThanThreshold 
  --evaluation-periods 3 
  --dimensions Name=CacheClusterId,Value=redis-prod-0001-001 
  --alarm-actions arn:aws:sns:eu-west-1:123456789:ops-alerts

İzlemeniz gereken kritik metrikler:

  • CacheHits / CacheMisses: Hit ratio yüzde seksenin altına düşerse sorun var
  • CPUUtilization: Yüzde 75 üzerinde tutarlıysa daha büyük instance’a geçme vakti
  • DatabaseMemoryUsagePercentage: Yüzde 80 üzerinde tehlikeli bölge
  • ReplicationLag: Replica’nın primary’den ne kadar geride olduğu
  • CurrConnections: Bağlantı sızıntısı var mı kontrolü
  • Evictions: Bellek dolup key’ler siliniyorsa maxmemory-policy ve instance boyutunu gözden geçirin

Yedekleme ve Geri Yükleme

# Manuel snapshot al
aws elasticache create-snapshot 
  --replication-group-id redis-prod 
  --snapshot-name redis-prod-manual-$(date +%Y%m%d)

# Mevcut snapshot'ları listele
aws elasticache describe-snapshots 
  --replication-group-id redis-prod 
  --query 'Snapshots[*].[SnapshotName,SnapshotStatus,SnapshotCreateTime]' 
  --output text

# Snapshot'tan yeni cluster oluştur (disaster recovery senaryosu)
aws elasticache create-replication-group 
  --replication-group-id redis-prod-restored 
  --replication-group-description "Restored from snapshot" 
  --snapshot-name redis-prod-manual-20241201 
  --cache-node-type cache.r7g.large 
  --cache-subnet-group-name redis-subnet-group 
  --security-group-ids sg-0123456789abcdef0

Maliyet Optimizasyonu İpuçları

ElastiCache faturanız beklenmedik şekilde şişebilir. Birkaç pratik öneri:

Reserved Nodes kullanın: 1 veya 3 yıllık rezervasyon ile yüzde otuz ila yüzde kırk tasarruf edebilirsiniz. Production’da uzun süre çalışacak kümeler için kesinlikle değerlendirin.

Doğru instance tipini seçin: Graviton tabanlı r7g ve m7g serileri hem daha ucuz hem de daha performanslı. Eski r5/m5 kullanıyorsanız geçiş yapın.

Snapshot’ları S3’e taşıyın: Uzun süreli saklama için ElastiCache snapshot yerine S3’e export edin. Bu çok daha ucuza gelir.

Data tiering özelliğini inceleyin: r6gd instance’larında SSD destekli data tiering ile daha büyük veri setlerini daha ucuza cache’leyebilirsiniz.

Yaygın Sorunlar ve Çözümleri

Bağlanamıyorum hatası: Neredeyse her zaman güvenlik grubu sorunu. Uygulama sunucunuzun güvenlik grubunun Redis güvenlik grubuna 6379 portunda erişim hakkı olduğunu kontrol edin.

AUTH failed hatası: Transit encryption aktifse auth token zorunlu. Python’da ssl=True, Node.js’de tls: {} parametrelerini eksik bırakmayın.

Yüksek latency: Uygulama sunucunuz ile ElastiCache aynı AZ’da mı? Cross-AZ trafiği hem yavaşlığa hem de ek maliyete yol açar. Connection pool kullanıyor musunuz? Her istek için yeni bağlantı açmak performansı mahveder.

Out of memory evictions: maxmemory-policy’yi ve instance boyutunu gözden geçirin. CacheHits/CacheMisses oranına bakın, gereksiz büyük objeler store ediyor olabilirsiniz.

Sonuç

AWS ElastiCache Redis kurulumu ilk bakışta karmaşık görünebilir ama adımları tek tek takip ettiğinizde mantıklı bir yapı olduğunu göreceksiniz. Önemli noktaları özetleyeyim: güvenlik grubu kurallarını dar tutun, transit ve rest şifrelemesini production’da mutlaka aktif edin, Multi-AZ ve otomatik failover olmadan production’a çıkmayın, CloudWatch alarmlarını kurmadan sistemi kendi haline bırakmayın.

Gerçek dünyadaki en büyük kazanım şu: kendi Redis sunucunuzu yönetmek yerine bu operasyonel yükü AWS’ye devrediyorsunuz. Failover, yama, yedekleme, monitoring altyapısı hazır geliyor. Siz uygulama geliştirmeye odaklanabiliyorsunuz. Cache stratejinizi iyi kurarsanız hem veritabanı maliyetleriniz düşer hem de kullanıcılarınız daha hızlı bir deneyim yaşar. Bu ikisi aynı anda gerçekleştiğinde mimari kararın doğru olduğunu anlarsınız.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir