Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Memcached UDP Protokolü Desteğini Anlama ve Yüksek Performanslı Okuma İşlemleri için Kullanımı

✖ Kapat
Duyuru
✖ Kapat
Duyuru

codexor

Üye
Katılım
14 Mart 2026
Mesajlar
55
Merhaba arkadaşlar, bugün sizlere Memcached'in çok bilinmeyen ama yüksek performanslı okuma senaryolarında işinize yarayabilecek bir özelliğinden bahsedeceğim: UDP protokolü desteği. Özellikle yoğun okuma (read-heavy) yapan uygulamalarınızda, TCP'nin getirdiği bağlantı yükünü azaltıp daha hızlı yanıtlar almanız mümkün. Bu rehberde, UDP desteğini nasıl anlayacağımızı, ne zaman kullanmamız gerektiğini ve adım adım nasıl yapılandıracağımızı anlatacağım.

🔍 UDP Desteği Nedir ve Neden Kullanılır?

Memcached, varsayılan olarak TCP protokolünü kullanır. TCP güvenilir, sıralı ve hata kontrollü bir iletişim sağlar. Ancak her bağlantı için üçlü el sıkışma (three-way handshake) ve daha fazla paket başlığı (overhead) gerektirir. UDP ise bağlantısızdır (connectionless) ve daha az başlık bilgisi taşır. Bu da özellikle çok sayıda, küçük boyutlu ve hızlı okuma isteği gönderdiğinizde (örneğin, oturum bilgisi okuma, önbellekten basit anahtar/değer çekme) belirgin bir performans avantajı sağlayabilir.

Ancak dikkat! UDP güvenilir değildir. Paket kaybolabilir, sırası bozuk gelebilir veya tekrarlanabilir. Bu nedenle sadece okuma (get) işlemleri için ve veri kaybının kritik olmadığı senaryolarda kullanılmalıdır. Yazma (set) işlemleri için asla UDP'ye güvenmeyin, TCP kullanmaya devam edin.

⚙️ Memcached'de UDP Desteğini Etkinleştirme

Öncelikle, Memcached'in UDP'yi destekleyip desteklemediğini ve varsayılan portunu kontrol edelim. UDP desteği genellikle derleme zamanında belirlenir. Kontrol etmek için:

Bash:
memcached -h | grep udp

Çıktıda `-U` seçeneğini görüyorsanız, UDP destekleniyor demektir. Varsayılan UDP portu genellikle 11211'dir (TCP ile aynı). UDP'yi etkinleştirmek ve portunu ayarlamak için servisi başlatırken parametre geçmeliyiz. Systemd kullanan bir sistemde, servis dosyasını düzenleyelim.

Bash:
sudo systemctl edit memcached.service

Bu komut, servis için bir override (geçersiz kılma) dosyası açar. Aşağıdaki içeriği ekleyerek UDP'yi 11211 portunda etkinleştirelim ve aynı anda dinleyecek maksimum UDP bağlantısını (varsayılan 1024) belirleyelim.

INI:
[Service]
ExecStart=
ExecStart=/usr/bin/memcached -m 64 -p 11211 -U 11211 -u memcache -l 127.0.0.1,::1

Burada `-U 11211` parametresi UDP'yi 11211 portunda etkinleştirir. Sadece TCP istiyorsanız `-U 0` kullanabilirsiniz. `-l` parametresi ile bağlanılabilecek IP adreslerini kısıtlamayı unutmayın, güvenlik için çok önemli!

Değişikliği kaydettikten sonra servisi yeniden başlatalım:

Bash:
sudo systemctl daemon-reload
sudo systemctl restart memcached

Durumu kontrol edelim:

Bash:
sudo netstat -tulpn | grep :11211

Çıktıda hem `tcp` hem de `udp` için 11211 portunun `LISTEN` durumunda olduğunu görmelisiniz.

⚠️ Güvenlik ve Performans İpuçları

Asla UDP'yi dış ağlara (0.0.0.0) açmayın! UDP, spoofing (sahte IP ile saldırı) ve amplification (yükseltme) saldırılarına çok açıktır. Her zaman `-l` parametresi ile sadece gerekli sunucu IP'lerini (örn: uygulama sunucusunun IP'si) veya localhost'u belirtin.
UDP paket boyutu sınırına dikkat edin. UDP için maksimum veri boyutu genellikle 1400 bayt civarındadır. Daha büyük değerler için TCP kullanmanız veya uygulama tarafında parçalama (fragmentation) yapmanız gerekebilir.
Performans testi yapın! UDP'nin gerçekten bir fayda sağlayıp sağlamadığını anlamak için, `memtier_benchmark` veya kendi uygulamanızla gerçek yük testleri yapın. TCP'nin sizin iş yükünüzde yeterince hızlı olduğunu görebilirsiniz.

💻 Uygulama Tarafında UDP Kullanımı (Örnek: PHP)

Çoğu Memcached istemci kütüphanesi UDP'yi destekler. Örneğin, PHP'de Memcached eklentisi ile:

PHP:
$memcached = new Memcached();
// UDP üzerinden bağlanmak için SOCKS5 gibi bir proxy kullanılmaz, doğrudan sunucu eklenir.
$memcached->addServer('127.0.0.1', 11211);

// Basit bir okuma işlemi. SET işlemi için UDP önermiyoruz!
$deger = $memcached->get('anahtar_adi');
if ($deger === false) {
    // Önbellekte yoksa, veritabanından al ve TCP ile önbelleğe yaz (set).
    $deger = veritabanindanAl();
    $memcached->set('anahtar_adi', $deger, 3600); // Bu işlem TCP üzerinden gider.
} else {
    echo "Önbellekten UDP ile alındı: " . $deger;
}

Kütüphanenizin UDP'yi desteklediğinden ve doğru porta bağlandığından emin olun. Genellikle, TCP için kullandığınız aynı port ve sunucu bilgisi UDP için de çalışacaktır, arka planda istemci kütüphanesi protokolü seçer.

📊 Sonuç ve Öneriler

Memcached UDP desteği, doğru senaryoda (yoğun okuma, düşük gecikme, veri kaybı tolere edilebilir) mükemmel bir performans aracı olabilir. Ancak "her derde deva" değildir. Güvenlik önlemlerini asla elden bırakmayın ve mutlaka test edin.

Benim sunucularda genelde, mikroservisler arası çok sık yapılan basit config okumaları veya sayfa fragment önbelleklerinde UDP'yi deneyip, performans kazancı elde ettiğim oldu. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? UDP'yi hangi özel senaryolarda kullanıyorsunuz veya kullanmayı düşünüyorsunuz? Deneyimlerinizi ve sorularınızı aşağıya yazmaktan çekinmeyin, beraber tartışalım.
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri