121 milyon bağlantı ve tek bir DNS ayarı: ağırlıklı mı, çok-değerli mi?
How bitdrift scaled to 121 million concurrent gRPC connections on Amazon CloudFront for live telemetry sporting events · Raghuram Gururajan
Canlı bir yayının başlamasından saniyeler sonra 121 milyon mobil cihaz altyapına kalıcı gRPC bağlantısı kurduğunda, DNS kayıtlarının arkasındaki yönlendirme politikası normal trafikte olduğundan çok daha fazla önem kazanıyor. Yanlış politika tüm bağlantıları tek bir uç noktada toplayabilir — ve ölçekleme başarısını kesintiye çevirir.
bitdrift (eski Lyft altyapı mühendislerinin kurduğu bir mobil gözlemlenebilirlik platformu) bunu T20 Dünya Kupası kriket serisi sırasında yaşamış. Maçlar başladıkça CloudFront trafiği neredeyse sıfırdan saniyede 110 binin üzerinde isteğe fırlamış ve CloudFront ile NLB kaynakları arasında hatalar başlamış.
Kök neden ekipçe teşhis edilmiş: bağlantı yoğunlaşması. Route 53'ün ağırlıklı (weighted) yönlendirmesi, DNS cevabında tek bir kayıt döndürüyordu; bu cevap TTL süresince önbelleklendiği için, ani yükselişte gelen milyonlarca istemcinin hepsi aynı kaynağa yığıldı.
Çözüm tek bir değişiklik: ağırlıklı yönlendirmeden çok-değerli cevap (multi-value answer) yönlendirmesine geçmek. Böylece DNS her sorguda birden fazla kayıt döndürüyor ve istemciler birden fazla Network Load Balancer arasına dağılıyor.
Öne çıkanlar
- TTL bir performans ayarı değil, ani yük altında bir yoğunlaşma çarpanı: cevap ne kadar uzun önbelleklenirse, o kadar çok istemci aynı yere gider.
- Ağırlıklı yönlendirme trafiği zamana yayarak dengeler; eşzamanlı patlamada dengelemez.
- Kalıcı bağlantılarda (gRPC, WebSocket) sorun daha ağır: bağlantı bir kez kurulunca saatlerce orada kalır — yanlış dağılım kalıcı olur.
- Sorun yük testinde değil, gerçek üretim baskısı altında görülmüş.
Neden önemli?
Yük dengeleme denince akla uygulama katmanı gelir, ama ilk dağıtım kararı DNS'te verilir — ve DNS cevapları önbelleklenir. Bu, "dengeleyici koydum, sorun çözüldü" varsayımının neden yanlış olabileceğini gösteren ders kitabı örneği. Ani yük (thundering herd) senaryolarında sistemin davranışı, ortalama yükteki davranışından niteliksel olarak farklıdır.
Sende karşılığı
Bu yazıdan çıkacak üç somut şey var. Bir: kalıcı bağlantı kullanan her sistemde (Mobit'teki WebSocket mesajlaşma dahil) bağlantıların sunucular arasında nasıl dağıldığını ölç — bağlantı sayısını sunucu başına metriğe bağla. İki: DNS TTL'ini bilinçli seç; düşük TTL esneklik verir ama sorgu yükünü artırır. Üç: ani yük testi yap. Kademeli artan bir yük testi (ramp-up) bu hatayı asla göstermezdi; sıfırdan zirveye giden bir test gösterirdi. Yük testini gerçek trafiğin şekline benzet, düz bir rampaya değil.
Sözlük
- TTL (Time To Live) yaşam süresi
- Bir DNS cevabının istemcilerde ne kadar süre önbellekte tutulacağı.
- weighted routing ağırlıklı yönlendirme
- DNS'in kayıtları belirlenen oranlarda döndürerek trafiği dağıtması; her sorguda tek kayıt döner.
- multi-value answer routing çok-değerli cevap yönlendirmesi
- DNS'in her sorguda birden fazla sağlıklı kayıt döndürmesi; istemciler arasında doğal dağılım sağlar.
- thundering herd sürü etkisi
- Çok sayıda istemcinin aynı anda aynı kaynağa yönelmesiyle oluşan ani yük yığılması.