deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak dev.to (home feed)

Ekip, 180.000 satırlık C++ DNS resolver'ı 12.000 satırlık Rust sürümüyle değiştirdi; büyük bir kesinti yaşanmadı

Sana dayalı bir mühendislik anlatısı, saniyede milyonlarca sorgu işleyen 180.000 satırlık C++ DNS resolver'ın, traffic shadowing ve aşamalı geçişle 12.000 satırlık Rust sürümüyle nasıl değiştirildiğini anlatıyor; büyük bir kesinti yaşanmadan tamamlandı.

Ekip, 180.000 satırlık C++ DNS resolver'ı 12.000 satırlık Rust sürümüyle değiştirdi; büyük bir kesinti yaşanmadı

Silmeyle sonuçlanan bir yeniden yazım

2023'te, orta ölçekli bir bulut sağlayıcısındaki bir ekip, 2010'ların başından beri çalıştırdığı C++ DNS resolver'ı emekliye ayırdı ve onu, servis saniyede milyonlarca sorguyu yanıtlamaya devam ederken, 180.000 satırdan yaklaşık 12.000 satıra düşen Rust koduyla değiştirdi. dev.to'da yayımlanan ve aslen yazarın tamiz.pro sitesinde paylaşılan birinci ağızdan anlatıya göre, altı ay süren göç süreci büyük bir kesintiye yol açmadı ve bir postmortem gerektirmedi.

Yazar, eski sistemi bir bakım tuzağı olarak tanımlıyor: bellek güvenliği hataları düzenli olarak ortaya çıkıyor, performans sorunlarını izole etmek zor oluyor ve mühendisler herhangi bir şeyi değiştirmekten çekiniyordu. Yenileme için belirtilen hedefler bellek güvenliği, yerleşik gözlemlenebilirlik (observability), denetlenebilir bir kod tabanı ve modern asenkron I/O idi.

Yeniden düzenleme yerine yenileme

Ekip, eski resolver'ı yamalamanın mevcut borca sadece yeni katmanlar ekleyeceğini erken fark etti ve bunun yerine dikkatli bir yeniden yazım seçti. Yeni resolver trust-dns üzerine inşa edilmiş olup RFC uyumlu özyinelemeli çözümleme, upstream sorguları için DNS-over-TLS ve DNS-over-HTTPS, Prometheus metrikleri, tracing ekosistemi üzerinden yapılandırılmış loglama ve zarif kapanmayı (graceful shutdown) içeriyor. Tokio eşzamanlılık modelini sağlıyor, rustls eski TLS yığınının yerini alıyor ve el yapımı metriklerin yerini standart bir exporter alıyor.

Yazıya göre, yönetilen DNS servisleri, iç servislerin düşük gecikmeli, süreç içi çözümlemeye ihtiyaç duyması ve harici seçeneklerin kuyruk (tail) gecikmesinin kabul edilemez olması nedeniyle reddedildi. Go kısa süre değerlendirildi ama elendi; yazar, Rust'ı seçme nedenleri olarak daha iyi performans ve yük altında daha az runtime sürprizi gösteriyor.

Önce gölge trafik, sonra yavaş geçiş

Yeni kodun herhangi bir production trafiği taşımaya başlamasından önce ekip, sorguların %1'ini ona yansıttı ve yanıtları eski resolver ile karşılaştırarak, yeni sonuçlara dayanmadan uyumsuzlukları kaydetti. Yaklaşık iki hafta süren bu gölgeleme aşaması, TTL işleme ve cache davranışındaki ince farkları ortaya çıkardı.

Geçiş daha sonra trafiğin %1, %5, %25 ve %75'i üzerinden ilerledi; her aşama, ekip gecikme yüzdeliklerini, hata oranlarını, cache isabet oranlarını ile CPU ve bellek kullanımını izlerken en az bir saat boyunca korundu. Yaklaşık bir aylık aşamalı yaygınlaştırmanın ardından eski resolver kapatıldı. Çekirdeği yazmak yaklaşık üç ay sürdü; yazar, toplam emeğin büyük kısmının kodun kendisinden çok test, gölgeleme ve kademeli yaygınlaştırmaya gittiğini belirtiyor.

İki sistemin ayrıştığı noktalar

Yazı üç tuzak öne çıkarıyor. Birincisi, DNS çözümlemesi deterministik görünür ama cache'leme, yeniden denemeler ve zaman aşımı konularındaki uç durumlar uygulamalar arasında farklılık gösterebilir ve gölgeleme bu uyumsuzlukların çoğunu yakaladı. İkincisi, Cloudflare, Google ve AWS gibi upstream resolver'lar ara sıra biraz farklı yanıtlar döndürdüğü için ekip, tutarlılık adına Cloudflare'de standartlaştı. Üçüncüsü, eski resolver TTL'leri standart dışı biçimlerde kırparken Rust sürümü RFC'lere sıkı sıkıya uyuyor ve bu durum, yaygınlaştırmanın erken döneminde kısa süreli bir cache çalkantısına neden oldu.

Kaldırılan yaklaşık 168.000 net satır; özel DNS parser'ları, elle yazılmış event loop'lar, eski bir TLS yığınını ve geçici metrik kodunu içeriyordu ve tümü bakımı yapılan kütüphanelerle değiştirildi.

Yazar beş dersle kapatıyor: gözlemlenebilirliği ilk günden inşa edin; eski ve yeni sistemler arasında denklik asla varsaymayın; her yaygınlaştırma aşamasının regresyonları ortaya çıkaracak kadar uzun sürmesine izin verin; her adımda geri dönüşü anlık tutun; ve yenisini kanıtlandıktan sonra ölü koddan silmekten korkmayın.

Neden önemli

DNS neredeyse her istek yolunun içinde yer alır ve bu da bir resolver'ı değiştirilmesi en riskli bileşenlerden biri yapar; saniyede milyonlarca sorgudaki başarısız bir geçiş, görünür ve şirket geneli bir kesintiye dönüşür. Bu anlatı, tam da dramatik hiçbir şey olmadığı için faydalı bir şablon: denkliği kanıtlamak için gölge trafik kullanın, yüzdeleri yavaşça kaydırın, her adımda geri dönüşü ucuz tutun ve gözlemlenebilirliği sonradan akla gelen bir şey değil bir lansman gereksinimi olarak ele alın. Kod boyutundaki on beş katlık azalma, ekipler için somut bir veri noktası çünkü silinen kodun çoğu, artık açık kaynak ekosisteminin sağladığı alt yapı koduydu.

Bir uyarı: bu, adı açıklanmayan bir sağlayıcıdan gelen tek bir birinci ağızdan anlatı; bu yüzden sayılar ve zaman çizelgesi bağımsız olarak doğrulanamıyor. Ancak bir göç el kitabı olarak, canlı ve yüksek hacimli bir DNS resolver'ı değiştirmenin daha detaylı halka açık anlatımları arasında yer alıyor.

  • #dns
  • #rust
  • #infrastructure
  • #migration
  • #cloud

İlgili yazılar