Netdata ile Redis ve Memcached Önbellek Performansını İzleme

Prodüksiyonda bir Redis veya Memcached cluster’ı yönetiyorsanız, “her şey yolunda mı?” sorusuna cevap bulmak için sadece redis-cli info çıktısına bakmak yetmez. Anlık değerler size hiçbir şey anlatmaz; trend görmek, anomali yakalamak ve darboğazı tespit etmek için zaman serisi verisine ihtiyacınız var. Netdata tam da bu noktada devreye giriyor: sıfır konfigürasyonla saniyeler içinde kurulup önbellek metriklerini canlı olarak görselleştiren, hafif ve açık kaynak bir izleme aracı. Bu yazıda Redis ve Memcached performansını Netdata ile nasıl izleyeceğinizi, hangi metriklere odaklanmanız gerektiğini ve gerçek dünya senaryolarında nasıl aksiyon alacağınızı ele alacağız.

Netdata Neden Önbellek İzlemede Öne Çıkıyor

Prometheus + Grafana kombinasyonu güçlü ama kurulum ve bakım maliyeti yüksek. Datadog veya New Relic ise kurumsal bütçe ister. Netdata ise tek bir komutla kurulur, otomatik servis keşfi yapar ve özellikle Redis ile Memcached için yerleşik kolektörlere sahiptir.

Netdata’nın öne çıkan özellikleri:

  • 1 saniyelik granülite: Redis hit/miss oranındaki ani düşüşü milisaniyeler içinde görürsünüz
  • Sıfır konfigürasyon: Servis standart portta çalışıyorsa Netdata otomatik bağlanır
  • Alarm sistemi: Eşik bazlı ve anomali tabanlı alertler
  • Düşük overhead: Sunucu kaynaklarının %1’inden azını kullanır

Netdata Kurulumu

Önce Netdata’yı sunucunuza kuralım. Tek satır ile:

wget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh
sh /tmp/netdata-kickstart.sh --stable-channel --disable-telemetry

Kurulum tamamlandıktan sonra servisin durumunu kontrol edin:

systemctl status netdata
systemctl enable netdata

Netdata varsayılan olarak http://sunucu-ip:19999 adresinde çalışır. Güvenlik duvarı kuralını eklemeyi unutmayın:

# Sadece belirli bir IP'den erişime izin vermek için
ufw allow from 192.168.1.0/24 to any port 19999
# Ya da geçici test için
ufw allow 19999/tcp

Prodüksiyonda Netdata arayüzünü doğrudan internete açmak yerine Nginx reverse proxy arkasına koymanızı öneririm. Basit bir Nginx konfigürasyonu:

cat > /etc/nginx/sites-available/netdata << 'EOF'
server {
    listen 443 ssl;
    server_name monitoring.example.com;

    ssl_certificate /etc/letsencrypt/live/monitoring.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/monitoring.example.com/privkey.pem;

    auth_basic "Netdata Monitoring";
    auth_basic_user_file /etc/nginx/.htpasswd;

    location / {
        proxy_pass http://127.0.0.1:19999;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
EOF

ln -s /etc/nginx/sites-available/netdata /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

Redis Kolektörünü Yapılandırma

Netdata, Redis’i otomatik olarak keşfetmek için go.d.plugin kullanır. Standart port (6379) ve localhost üzerinde çalışan Redis için ekstra konfigürasyon gerekmez. Ancak şifreli veya farklı portta çalışan Redis örnekleri için ayar dosyasını düzenlemeniz gerekir.

# Konfigürasyon dosyasını oluşturun
cat > /etc/netdata/go.d/redis.conf << 'EOF'
jobs:
  - name: local
    address: redis://127.0.0.1:6379

  - name: redis_prod
    address: redis://127.0.0.1:6380
    password: "guclu-sifreniz-buraya"
    timeout: 2

  - name: redis_sentinel
    address: redis://127.0.0.1:26379
EOF

Konfigürasyonu uygulamak için Netdata’yı yeniden başlatın:

systemctl restart netdata
# Logları kontrol edin
tail -f /var/log/netdata/error.log | grep redis

Eğer Redis ACL kullanıyorsanız (Redis 6.0+), izleme için ayrı bir kullanıcı oluşturmanız hem güvenlik hem de yönetim açısından daha doğrudur:

redis-cli ACL SETUSER netdata on >netdata_password ~* +INFO +PING +CLIENT resetkeys

Redis için Kritik Metrikler

Netdata’da Redis bölümünü açtığınızda onlarca metrik göreceksiniz. Neye odaklanacağınızı bilmek önemli.

Hit Rate ve Miss Rate

Bu iki metrik, önbelleğinizin ne kadar verimli çalıştığını gösterir. Hit rate’i manuel hesaplamak isterseniz:

redis-cli info stats | grep -E "keyspace_hits|keyspace_misses"
# Çıktı:
# keyspace_hits:1483920
# keyspace_misses:24531

Hit rate = keyspace_hits / (keyspace_hits + keyspace_misses) * 100

%90 altına düşen hit rate alarm vermelidir. E-ticaret sitelerinde bu oran genellikle %95-99 arasında olması beklenir. Hit rate düşüşü genellikle şu anlara gelir:

  • TTL ayarları çok kısa tutulmuş, veriler süresi dolmadan erişilemiyor
  • maxmemory sınırına ulaşıldı ve eviction başladı
  • Yeni deployment sonrası cache cold start yaşandı

Memory Kullanımı ve Eviction

redis-cli info memory | grep -E "used_memory_human|maxmemory_human|mem_fragmentation_ratio"
redis-cli info stats | grep evicted_keys

mem_fragmentation_ratio değeri önemlidir:

  • 1.0 ile 1.5 arası: Normal ve sağlıklı
  • 1.5 üzeri: Yüksek bellek fragmentasyonu, Redis yeniden başlatmayı düşünün
  • 1.0 altı: Redis belleği swap’a taşıyor, ciddi performans sorunu

Connected Clients ve Komut Hızı

redis-cli info clients
redis-cli info stats | grep instantaneous_ops_per_sec

instantaneous_ops_per_sec değeri ani yükselme gösteriyorsa uygulama katmanında bir sorun var olabilir; döngüsel sorgular veya N+1 problemi gibi.

Memcached Kolektörünü Yapılandırma

Memcached için de benzer şekilde go.d.plugin devreye girer. Standart port 11211 üzerindeki Memcached otomatik keşfedilir.

cat > /etc/netdata/go.d/memcached.conf << 'EOF'
jobs:
  - name: local
    address: 127.0.0.1:11211

  - name: memcached_sessions
    address: 127.0.0.1:11212
    timeout: 2
EOF

Memcached bağlantısını test etmek için:

echo "stats" | nc -q 1 127.0.0.1 11211 | head -20

Kolektörün çalışıp çalışmadığını doğrulamak için Netdata debug modunu kullanabilirsiniz:

sudo -u netdata /usr/libexec/netdata/plugins.d/go.d.plugin -d -m memcached

Memcached için Kritik Metrikler

Hit ve Miss Oranları

Netdata, Memcached için otomatik olarak get_hits ve get_misses metriklerini toplar. Bu değerleri komut satırından kontrol etmek için:

echo "stats" | nc -q 1 127.0.0.1 11211 | grep -E "get_hits|get_misses|curr_items|limit_maxbytes|bytes"

Eviction Takibi

Memcached’de eviction sayısı kritik bir göstergedir. Bellek dolduğunda Memcached LRU algoritmasıyla eski verileri siler. Çok fazla eviction, belleğinizin yetersiz kaldığı anlamına gelir:

echo "stats" | nc -q 1 127.0.0.1 11211 | grep evictions

Saatte birkaç yüz eviction normal sayılabilir. Ama saniyede yüzlerce eviction varsa Memcached’e RAM ekleme vakti gelmiştir.

Slab Analizi

Memcached belleği slab adı verilen bloklara bölerek yönetir. Slab verimsizliği ciddi bellek israfına yol açabilir:

echo "stats slabs" | nc -q 1 127.0.0.1 11211
echo "stats items" | nc -q 1 127.0.0.1 11211

Netdata Alertleri Yapılandırma

Netdata’nın yerleşik alarm sistemi Redis ve Memcached için bazı varsayılan alertler içerir. Kendi özel alertlerinizi tanımlamak için:

cat > /etc/netdata/health.d/redis-custom.conf << 'EOF'
# Redis hit rate alarmı
alarm: redis_hit_rate_warning
    on: redis.hit_rate
    lookup: average -5m percentage
    units: %
    every: 1m
    warn: $this < 90
    crit: $this < 75
    info: Redis hit rate son 5 dakikada düşük
    to: sysadmin

# Redis eviction alarmı
alarm: redis_evictions
    on: redis.evicted_keys
    lookup: sum -1m
    units: keys
    every: 1m
    warn: $this > 100
    crit: $this > 1000
    info: Redis son 1 dakikada çok fazla key evict etti
    to: sysadmin

# Redis bellek kullanımı
alarm: redis_memory_high
    on: redis.memory
    lookup: average -5m
    units: MiB
    every: 5m
    warn: $this > 3500
    crit: $this > 4000
    info: Redis bellek kullanımı kritik seviyede
    to: sysadmin
EOF

Memcached için de benzer alertler:

cat > /etc/netdata/health.d/memcached-custom.conf << 'EOF'
alarm: memcached_hit_rate
    on: memcached.hit_rate
    lookup: average -5m percentage
    units: %
    every: 1m
    warn: $this < 85
    crit: $this < 70
    info: Memcached hit rate düşük
    to: sysadmin

alarm: memcached_evictions_high
    on: memcached.evictions
    lookup: sum -5m
    units: evictions
    every: 5m
    warn: $this > 500
    crit: $this > 2000
    info: Memcached eviction oranı yüksek, bellek yetersiz olabilir
    to: sysadmin
EOF

Alert bildirimlerini e-posta üzerinden göndermek için:

cat >> /etc/netdata/health_alarm_notify.conf << 'EOF'
SEND_EMAIL="YES"
DEFAULT_RECIPIENT_EMAIL="[email protected]"
EMAIL_SENDER="[email protected]"
EOF

systemctl restart netdata

Gerçek Dünya Senaryosu: E-ticaret Flash Sale

Bir e-ticaret platformunda çalışan sysadmin olduğunuzu düşünün. Akşam 20:00’de flash sale başlayacak ve Redis ürün katalog önbelleğini tutuyor.

Sale başladıktan 10 dakika sonra Netdata alarmı çaldı: Redis hit rate %97’den %71’e düştü. Aynı anda eviction sayısı dakikada 3000’e çıktı. Ne yaparsınız?

Adım 1: Anlık durumu kontrol edin

redis-cli info memory
redis-cli info stats | grep -E "evicted|hits|misses"
redis-cli info keyspace

Adım 2: Maxmemory politikasını geçici olarak değiştirin

Eğer allkeys-lru politikası kullanılıyorsa ve saldırgan eviction görüyorsanız, maxmemory sınırını geçici olarak artırın:

# Mevcut limiti kontrol et
redis-cli config get maxmemory

# Geçici olarak artır (örneğin 4GB'dan 6GB'a)
redis-cli config set maxmemory 6gb

# Kalıcı için redis.conf'u düzenleyin
sed -i 's/^maxmemory .*/maxmemory 6gb/' /etc/redis/redis.conf

Adım 3: Hotkey analizi yapın

Hangi keyler en çok erişiliyor, hangilerinin TTL’i kısa?

redis-cli --hotkeys
redis-cli --bigkeys

Adım 4: Uygulama ekibini bilgilendirin

Hit rate düşüşünün ardından uygulamanın cache warming yapmadığı anlaşıldı. Cache warming scripti:

#!/bin/bash
# Kritik ürün sayfalarını önceden cache'e at
PRODUCT_IDS=$(mysql -u app -ppassword shopdb -e "SELECT id FROM products WHERE featured=1" -s -N)

for id in $PRODUCT_IDS; do
    curl -s "http://localhost:8080/api/products/$id" > /dev/null
    echo "Ürün $id cache'e alındı"
done

echo "Cache warming tamamlandı"
redis-cli info stats | grep keyspace_hits

Gerçek Dünya Senaryosu: Memcached Session Problemi

Bir medya sitesinde oturum verilerini Memcached’de tutuyorsunuz. Sabah 09:00’da kullanıcılar oturumlarının kapandığını bildirmeye başladı. Netdata’da ne görürsünüz?

Netdata grafiklerinde Memcached eviction sayısının gece 03:00’dan itibaren artmaya başladığını ve gündüz saatlerinde patlama yaptığını görürsünüz. Çözüm adımları:

# Slab kullanım durumunu analiz et
echo "stats slabs" | nc -q 1 127.0.0.1 11211 | awk '/chunk_size|used_chunks|free_chunks/'

# Mevcut item sayısı ve sona erme süreleri
echo "stats items" | nc -q 1 127.0.0.1 11211

# Memcached servisine daha fazla bellek ver
# /etc/memcached.conf dosyasında:
sed -i 's/^-m ./-m 2048/' /etc/memcached.conf
systemctl restart memcached

Netdata Cloud ile Çoklu Sunucu İzleme

Birden fazla sunucuda Redis veya Memcached çalıştırıyorsanız Netdata Cloud ücretsiz tier ile bunları tek panelde toplayabilirsiniz.

# Her sunucuda Netdata Cloud'a bağlanın
netdata-claim.sh -token=CLOUD_TOKEN_BURAYA -rooms=ROOM_ID -url=https://app.netdata.cloud

Bağlantı durumunu kontrol etmek için:

systemctl status netdata-agent
grep "CLAIMED" /var/lib/netdata/cloud.d/claimed.conf

Performans Optimizasyonu için İzleme Tavsiyeleri

Netdata verilerini düzenli olarak analiz ederek proaktif önlemler alabilirsiniz. Günlük incelemeniz gereken metrikler:

  • Redis: used_memory trendi, keyspace_hits/misses oranı, connected_clients maksimumu, slowlog uzunluğu
  • Memcached: get_hits/misses oranı, evictions toplamı, curr_connections maksimumu, bytes kullanımı

Redis slow log’unu düzenli kontrol etmek için basit bir script:

#!/bin/bash
# Her gece çalıştırılacak slow log analiz scripti
THRESHOLD=10000  # 10ms üzeri sorgular

SLOWLOG=$(redis-cli slowlog get 100)
COUNT=$(redis-cli slowlog len)

if [ "$COUNT" -gt 50 ]; then
    echo "UYARI: Son periyotta $COUNT adet yavaş sorgu tespit edildi"
    echo "$SLOWLOG" | head -50
    redis-cli slowlog reset
fi

Bu scripti cron’a ekleyin:

echo "0 6 * * * root /usr/local/bin/redis-slowlog-check.sh | mail -s 'Redis Slow Log Raporu' [email protected]" >> /etc/crontab

Netdata Konfigürasyonunu Backup’lama

Tüm bu konfigürasyonu yaptıktan sonra backup almayı unutmayın:

# Netdata konfigürasyonlarını yedekle
tar -czf /backup/netdata-config-$(date +%Y%m%d).tar.gz 
    /etc/netdata/go.d/redis.conf 
    /etc/netdata/go.d/memcached.conf 
    /etc/netdata/health.d/redis-custom.conf 
    /etc/netdata/health.d/memcached-custom.conf 
    /etc/netdata/health_alarm_notify.conf

# Git ile versiyon kontrolü altına alın
cd /etc/netdata
git init
git add .
git commit -m "Initial Netdata monitoring configuration"

Sonuç

Netdata ile Redis ve Memcached izlemek, prodüksiyon ortamında fark yaratır. Hit rate düşüşlerini gerçek zamanlı görmek, eviction patlamalarını önceden yakalamak ve bellek fragmentasyonunu takip etmek; kesintisiz hizmet için olmazsa olmaz.

Önemli olan noktalar şöyle sıralanabilir: Önce standart portta çalışan servisleri Netdata’nın otomatik keşfetmesine izin verin, konfigürasyon karmaşıklığına girmeyin. Sonra hit rate, eviction ve bellek kullanımı için özelleştirilmiş alertler tanımlayın. Flash sale veya büyük kampanyalar öncesinde cache warming stratejinizi test edin ve Netdata grafiklerindeki trend’e bakarak kapasite planlaması yapın.

Redis ve Memcached sadece “çalışıyor mu çalışmıyor mu” diye değil, “ne kadar verimli çalışıyor” diye izlenmelidir. Netdata bu soruya saniye bazında ve görsel olarak cevap veren en pratik araçlardan biri. Kurulum maliyeti düşük, öğrenme eğrisi kısa, kazanımı ise büyük.

Bir yanıt yazın

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