GCP Memorystore ile Redis Kurulumu ve Yapılandırması
Google Cloud Platform üzerinde Redis yönetimini manuel olarak kurmak, patch uygulamak ve ölçeklendirmek ciddi bir operasyonel yük demek. Özellikle production ortamında bir Redis instance’ının çökmesi ve bunu gece yarısı on-call ekibinin çözmesi gerektiğini düşününce, managed servisler ne kadar değerli oluyor anlıyorsunuz. GCP Memorystore, tam da bu noktada devreye giriyor: Altta yatan altyapıyı Google’a bırakıp siz sadece uygulamanıza odaklanıyorsunuz.
Bu yazıda Memorystore Redis’i sıfırdan kuracağız, production’a hazır hale getireceğiz ve gerçek dünya senaryolarında nasıl kullandığımızı göreceğiz.
Memorystore Redis Nedir ve Ne Zaman Kullanılır?
Memorystore, GCP’nin tamamen yönetilen Redis ve Memcached servisidir. Redis tarafına bakacak olursak: otomatik failover, otomatik yedekleme, patch yönetimi ve VPC entegrasyonu gibi özellikler kutudan çıkıyor.
Şu senaryolarda Memorystore ilk tercihim oluyor:
- Session management: Kubernetes üzerinde çalışan stateless mikroservislerin session verilerini saklaması gerektiğinde
- Cache layer: BigQuery veya Cloud SQL sorgularının sonuçlarını önbelleklemek için
- Rate limiting: API gateway katmanında istek sınırlaması yapmak için
- Pub/Sub lightweight: Uygulamalar arası hafif mesajlaşma için (Pub/Sub kadar karmaşık değil)
- Leaderboard ve sayaçlar: Gerçek zamanlı sıralama tablolarında
Self-managed Redis’e kıyasla en büyük dezavantajı fiyat. Aynı boyutta bir GCE instance üzerinde Redis çalıştırmaktan daha pahalı. Ama operasyonel maliyeti hesaba katınca genellikle Memorystore kazanıyor.
Ön Gereksinimler
Başlamadan önce şunların hazır olması gerekiyor:
- GCP projesi ve uygun IAM rolleri (en azından
roles/redis.admin) gcloudCLI kurulu ve authenticate edilmiş- Hedef VPC network’ü belirlenmiş
# gcloud CLI versiyonunu kontrol et
gcloud version
# Aktif proje ve hesabı doğrula
gcloud config list
# Proje ayarla
gcloud config set project YOUR_PROJECT_ID
# Redis API'yi etkinleştir
gcloud services enable redis.googleapis.com
API’yi etkinleştirmek birkaç dakika sürebilir. gcloud services list --enabled | grep redis komutuyla aktif olup olmadığını kontrol edebilirsiniz.
Temel Memorystore Redis Instance Oluşturma
En basit yoldan bir instance oluşturmak için:
gcloud redis instances create my-redis
--size=1
--region=europe-west1
--redis-version=redis_7_0
--tier=standard
--network=projects/YOUR_PROJECT_ID/global/networks/default
Bu komuttaki parametreleri açıklayalım:
- –size: GB cinsinden bellek boyutu (1’den 300’e kadar)
- –region: Instance’ın oluşturulacağı bölge
- –redis-version: Kullanılacak Redis versiyonu (redis_6_x veya redis_7_0)
- –tier:
basic(tek node, failover yok) veyastandard(otomatik failover’lı replika) - –network: Bağlanacak VPC network’ü
Önemli not: basic tier production için uygun değil. Failover mekanizması olmadığından instance çökerse veriye erişilemez. Production’da her zaman standard tier kullanın.
Instance oluşturma 5-10 dakika sürebilir. Durumu takip etmek için:
gcloud redis instances describe my-redis --region=europe-west1
state: READY görünce bağlanmaya hazırsınız.
Production İçin Gelişmiş Konfigürasyon
Gerçek dünyada instance oluştururken çok daha fazla parametreye dikkat etmek gerekiyor.
gcloud redis instances create prod-redis
--size=5
--region=europe-west1
--zone=europe-west1-b
--replica-count=1
--redis-version=redis_7_0
--tier=standard
--network=projects/YOUR_PROJECT_ID/global/networks/prod-vpc
--connect-mode=private-service-access
--auth-enabled
--transit-encryption-mode=SERVER_AUTHENTICATION
--maintenance-window-day=sunday
--maintenance-window-hour=3
--redis-config=maxmemory-policy=allkeys-lru
--labels=env=production,team=backend,cost-center=platform
Bu parametrelerin neden önemli olduğunu sırasıyla açıklayalım:
- –zone: Birincil node’un zone’unu belirtmek, replica’nın farklı zone’da olmasını sağlar ve zone failure durumunda koruma sağlar
- –replica-count: Standard tier’da kaç read replica olacağını belirler
- –connect-mode:
private-service-accessile VPC peering üzerinden bağlantı, daha güvenli - –auth-enabled: Redis AUTH mekanizmasını aktif eder, password zorunlu hale gelir
- –transit-encryption-mode: Data in-transit şifrelemesi için TLS
- –maintenance-window: Patch ve bakım penceresi, production saatlerini etkileyen sürprizleri önler
- –redis-config: Redis konfigürasyon parametrelerini ayarlar
maxmemory-policy Seçimi
Redis’in bellek dolduğunda nasıl davranacağını belirleyen bu parametre çok kritik:
- allkeys-lru: Tüm keyler arasından en az kullanılanı siler, genel cache kullanımı için ideal
- volatile-lru: Sadece expire süresi olan keyler arasından LRU uygular
- allkeys-lfu: LRU yerine frekans bazlı silme, tekrarlayan erişim patternlerde daha iyi
- noeviction: Bellek dolunca hata döner, session store için tehlikeli
- volatile-ttl: En kısa TTL’ye sahip key’i siler
Cache olarak kullanıyorsanız allkeys-lru veya allkeys-lfu, session store için volatile-lru genellikle mantıklı seçimdir.
Auth Bilgilerini Almak ve Bağlantı Testi
Instance hazır olduktan sonra bağlantı bilgilerini alalım:
# Instance detaylarını göster
gcloud redis instances describe prod-redis --region=europe-west1
# Sadece IP adresini al
REDIS_HOST=$(gcloud redis instances describe prod-redis
--region=europe-west1
--format='get(host)')
REDIS_PORT=$(gcloud redis instances describe prod-redis
--region=europe-west1
--format='get(port)')
echo "Redis: $REDIS_HOST:$REDIS_PORT"
# Auth token'ı al (auth enabled ise)
AUTH_STRING=$(gcloud redis instances get-auth-string prod-redis
--region=europe-west1)
Bağlantıyı test etmek için aynı VPC içinde bir GCE instance’ı veya Cloud Shell üzerinden:
# redis-cli ile bağlan
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $AUTH_STRING
# TLS ile bağlanıyorsanız
redis-cli -h $REDIS_HOST -p $REDIS_PORT
--tls
--cacert /path/to/ca.pem
-a $AUTH_STRING
# Hızlı bağlantı testi
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $AUTH_STRING ping
PONG dönüyorsa her şey yolunda demek.
Kubernetes Uygulamalarını Memorystore’a Bağlamak
GKE üzerindeki uygulamalar için Memorystore’u Secret ve ConfigMap ile kullanmak en temiz yöntem:
# Bağlantı bilgilerini Kubernetes Secret olarak kaydet
kubectl create secret generic redis-credentials
--from-literal=host=$REDIS_HOST
--from-literal=port=$REDIS_PORT
--from-literal=auth=$AUTH_STRING
--namespace=production
# Uygulamada environment variable olarak kullan
kubectl set env deployment/my-app
--from=secret/redis-credentials
--namespace=production
Python uygulamasında kullanım örneği:
import os
import redis
redis_client = redis.Redis(
host=os.environ.get('host'),
port=int(os.environ.get('port', 6379)),
password=os.environ.get('auth'),
ssl=True, # transit encryption aktifse
ssl_ca_certs='/etc/ssl/certs/ca-certificates.crt',
decode_responses=True,
socket_timeout=5,
socket_connect_timeout=5,
retry_on_timeout=True
)
# Bağlantıyı test et
try:
redis_client.ping()
print("Redis bağlantısı başarılı")
except redis.ConnectionError as e:
print(f"Redis bağlantı hatası: {e}")
Import/Export ve Yedekleme Stratejisi
Memorystore otomatik yedekleme yapıyor, ama bunu doğru konfigüre etmek gerekiyor:
# Otomatik yedeklemeyi aktif et
gcloud redis instances update prod-redis
--region=europe-west1
--persistence-mode=RDB
--rdb-snapshot-period=TWENTY_FOUR_HOURS
--rdb-snapshot-start-time=03:00
# Manuel snapshot al (önemli değişikliklerden önce)
gcloud redis instances export prod-redis
--region=europe-west1
--gcs-bucket=gs://my-backup-bucket/redis-exports/
Yedekten geri yükleme:
# Mevcut instance'a import et
gcloud redis instances import prod-redis
--region=europe-west1
--source-gcs-uri=gs://my-backup-bucket/redis-exports/dump.rdb
Uyarı: Import işlemi mevcut verileri tamamen siler ve instance’ı birkaç dakika erişilemez hale getirir. Production’da bunu dikkatli planlayın.
Ölçeklendirme İşlemleri
Memorystore’da dikey ölçeklendirme (boyut artırma/azaltma) online yapılabiliyor, ancak kısa süreli bir failover gerçekleşiyor:
# Instance boyutunu artır (5 GB'dan 10 GB'a)
gcloud redis instances update prod-redis
--region=europe-west1
--size=10
# Güncelleme durumunu takip et
watch -n 5 'gcloud redis instances describe prod-redis
--region=europe-west1
--format="get(state,memorySizeGb)"'
Yatay ölçeklendirme için Cluster modu kullanmanız gerekiyor. Cluster modu, tek instance’ın 300 GB sınırını aşmanıza olanak tanır:
# Cluster modunda instance oluştur
gcloud redis clusters create prod-redis-cluster
--shard-count=3
--region=europe-west1
--replica-count=1
--network=projects/YOUR_PROJECT_ID/global/networks/prod-vpc
--auth-enabled
# Cluster shard sayısını artır
gcloud redis clusters update prod-redis-cluster
--shard-count=6
--region=europe-west1
Monitoring ve Alerting
Production’da göz önünde bulundurmanız gereken metrikler:
# Cloud Monitoring'de alert policy oluştur
gcloud alpha monitoring policies create
--notification-channels=YOUR_CHANNEL_ID
--display-name="Redis High Memory Usage"
--condition-display-name="Memory usage above 80%"
--condition-filter='resource.type="redis_instance" AND metric.type="redis.googleapis.com/stats/memory/usage_ratio"'
--condition-threshold-value=0.8
--condition-threshold-comparison=COMPARISON_GT
--condition-duration=300s
Takip etmeniz gereken kritik metrikler:
- redis.googleapis.com/stats/memory/usage_ratio: Bellek kullanım oranı, %80’i geçince alarm
- redis.googleapis.com/stats/connected_clients: Bağlı client sayısı, anormal artış bağlantı sızıntısına işaret edebilir
- redis.googleapis.com/stats/keyspace_hits: Cache hit oranı, düşükse cache stratejinizi gözden geçirin
- redis.googleapis.com/stats/keyspace_misses: Cache miss sayısı
- redis.googleapis.com/commands/calls: Komut çağrı hızı, anormal yükü tespit eder
- redis.googleapis.com/replication/offset: Replica lag’i, yüksekse replication sorun var demek
Dashboard oluşturmak için Terraform ile Infrastructure as Code yaklaşımı çok daha temiz:
resource "google_redis_instance" "prod" {
name = "prod-redis"
tier = "STANDARD_HA"
memory_size_gb = 5
region = "europe-west1"
location_id = "europe-west1-b"
redis_version = "REDIS_7_0"
authorized_network = google_compute_network.prod_vpc.id
auth_enabled = true
transit_encryption_mode = "SERVER_AUTHENTICATION"
redis_configs = {
maxmemory-policy = "allkeys-lru"
notify-keyspace-events = "Ex"
}
persistence_config {
persistence_mode = "RDB"
rdb_snapshot_period = "TWENTY_FOUR_HOURS"
}
maintenance_policy {
weekly_maintenance_window {
day = "SUNDAY"
start_time {
hours = 3
minutes = 0
seconds = 0
nanos = 0
}
}
}
labels = {
env = "production"
team = "backend"
cost_center = "platform"
}
}
output "redis_host" {
value = google_redis_instance.prod.host
sensitive = false
}
output "redis_port" {
value = google_redis_instance.prod.port
}
Yaygın Sorunlar ve Çözümleri
Bağlantı Reddi Sorunu
En sık karşılaşılan sorun, uygulamanın Redis’e bağlanamamasıdır. Kontrol listesi:
- Uygulama ve Redis aynı VPC’de mi?
- Firewall kuralları 6379 portuna izin veriyor mu?
private-service-accesskullandıysanız VPC peering aktif mi?
# Firewall kuralını kontrol et
gcloud compute firewall-rules list --filter="network=prod-vpc"
# Gerekirse ekle
gcloud compute firewall-rules create allow-redis
--network=prod-vpc
--allow=tcp:6379
--source-ranges=10.0.0.0/8
--description="Allow Redis access from internal networks"
Yüksek Bellek Kullanımı
Bellek %90’ı geçiyorsa ve hemen ölçeklendirme yapamıyorsanız:
# redis-cli ile büyük key'leri bul
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $AUTH_STRING
--bigkeys
# Memory usage detaylarını gör
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $AUTH_STRING
memory doctor
# TTL olmayan key sayısını kontrol et
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $AUTH_STRING
info keyspace
Bellek baskısını azaltmak için uygulama tarafında TTL’leri gözden geçirin ve gereksiz key’leri temizleyin.
Yavaş Komutlar
Redis komutlarının yavaşladığını fark ederseniz slowlog size ipucu verir:
# Son 25 yavaş komutu listele
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $AUTH_STRING
slowlog get 25
# O(N) karmaşıklıklı komutları ara
# KEYS komutu production'da kesinlikle kullanmayın
# Bunun yerine SCAN kullanın
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $AUTH_STRING
scan 0 match "user:*" count 100
Güvenlik En İyi Pratikleri
- AUTH her zaman aktif olmalı:
--auth-enabledflagını unutmayın, sonradan açmak için instance yeniden oluşturmanız gerekebilir - TLS kullanın: Özellikle compliance gereksinimleri olan ortamlarda transit encryption zorunlu
- VPC Private Access: Public IP asla açmayın, Memorystore zaten sadece VPC içinden erişilebilir ama bunu Terraform’da da kodlayın
- IAM en az ayrıcalık: Sadece Redis’e okuma/yazma yetkisi verin, admin yetkisini minimize edin
- Secret Manager entegrasyonu: Auth string’i Secret Manager’da saklayın, environment variable yerine:
# Auth string'i Secret Manager'a kaydet
echo -n $AUTH_STRING | gcloud secrets create redis-auth
--data-file=-
--replication-policy=automatic
# Uygulamanın okuyabilmesi için IAM izni ver
gcloud secrets add-iam-policy-binding redis-auth
--member="serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com"
--role="roles/secretmanager.secretAccessor"
Sonuç
Memorystore Redis, GCP ekosisteminde çalışan ekipler için operasyonel yükü ciddi ölçüde azaltıyor. Kurulum basit görünse de production’a hazır hale getirmek için auth, TLS, maintenance window, monitoring ve doğru eviction policy gibi detayları atlamak uzun vadede sorun yaratıyor.
Özetlemek gerekirse şu noktalara dikkat edin: Her zaman standard tier kullanın, basic production için güvenli değil. Auth ve TLS’i baştan açın, sonradan değiştirmek zor olabiliyor. Maintenance window’u iş saatlerinin dışına alın. Bellek kullanımını ve cache hit oranını aktif olarak izleyin. Infrastructure’ı Terraform ile yönetin, console üzerinden elle yapılan değişiklikler drift yaratıyor.
En önemlisi: uygulamalarınızı connection pooling ile yazın, her request’te yeni bağlantı açmak hem yavaşlatır hem de connected_clients metriğinizi patlatır. Redis iyi kullanıldığında uygulamalarınızı dramatik şekilde hızlandıran, kötü kullanıldığında ise başka bir bakım kabusu haline gelen bir araç. Doğru konfigürasyonla fark büyük.
