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:
Çı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.
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.
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:
Durumu kontrol edelim:
Çı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:
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.
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.
Ö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.
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.
Ç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.
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.