- Geçen hafta Uber'in ekibe özel muhasebe tarzı veritabanı LedgerStore (LSG)'yi incelemiştik.
- Bu hafta Uber'in iş açısından kritik muhasebe verilerini LSG'ye nasıl taşıdığını ele alıyoruz.
- 1 trilyondan fazla kaydı (birkaç petabayt veri) kesinti olmadan ve şeffaf biçimde nasıl taşıdıklarını ve bu süreçte neler öğrendiklerini tartışıyor.
Geçmiş
- Gulfstream, Uber'in ödeme platformu ve 2017'de DynamoDB kullanılarak yayına alındı.
- Uber'in ölçeğinde DynamoDB pahalı hale geldi; bu yüzden yalnızca 12 haftalık veriyi (hot data) DynamoDB'de tutmaya, daha eski veriyi (cold data) ise Uber'in blobstore'u TerraBlob'da saklamaya başladılar.
- Uzun vadeli çözüm olarak LSG'yi kullanmak istiyorlardı. LSG, ödeme tarzı verileri depolamak için amaca uygun şekilde tasarlanmıştı.
- LSG'nin başlıca özellikleri:
- Doğrulanabilir değişmezlik (kriptografik imzalar kullanılarak kayıtların değiştirilmediği doğrulanabiliyor)
- Maliyet yönetimi için katmanlı depolama (hot data istekleri karşılamaya uygun yerde, cold data ise depolama için optimize edilmiş yerde tutuluyor)
- Sonuçta tutarlı ikincil indeksler için daha düşük gecikme
- 2021'e kadar Gulfstream verileri DynamoDB, TerraBlob ve LSG kombinasyonunda saklıyordu.
- DynamoDB: son 12 haftalık veri
- TerraBlob: cold data
- LSG: verilerin yazıldığı ve taşınmak istendiği hedef
Neden taşıma gerekiyordu?
- LSG, değişmezlik özelliği nedeniyle muhasebe tarzı verileri saklamak için daha uygundu.
- LSG'ye geçiş ciddi ölçüde tekrarlayan maliyet tasarrufu sağladı.
- Üç depolama sisteminden tek depolama sistemine geçmek, Gulfstream servisinin kodunu ve tasarımını sadeleştirebilirdi.
- LSG daha kısa indeksleme gecikmesi vadediyordu ve Uber'in veri merkezlerinde on-premise çalıştığı için daha düşük ağ gecikmesi sunuyordu.
Verinin doğasından kaynaklanan riskler
- Taşınan veri, 2017'den bu yana Uber'in tüm iş açısından kritik muhasebe verisiydi:
- Değişmez kayıtlar: sıkıştırılmış boyut 1.2 PB
- İkincil indeksler: sıkıştırılmamış boyut 0.5 PB
- Değişmez kayıtlar değiştirilemezken, ikincil indeks verisi sorunları düzeltmek için değiştirilebilecek esnekliğe sahipti.
Doğrulama
- Backfill'in her açıdan doğru ve kabul edilebilir olduğunu doğrulamak için, hem mevcut trafiği işleyebildiğini hem de şu anda erişilmeyen verinin doğru olduğunu doğrulamak gerekiyordu.
- Doğrulama ölçütleri:
- Eksiksizlik: tüm kayıtlar backfill ile taşındı mı
- Doğruluk: tüm kayıtlar doğru mu
- Yük: LSG mevcut yükü kaldırabiliyor mu
- Gecikme süresi: LSG'nin P99 gecikmesi kabul edilebilir aralıkta mı
- Lag: ikincil indeks oluşturma gecikmesi kabul edilebilir aralıkta mı
Shadow validation
- Taşıma öncesi ve sonrası yanıtlar karşılaştırılarak mevcut trafiğin veri taşıma sorunları veya kod hataları nedeniyle etkilenmemesi sağlandı.
- Shadow validation ile backfill'in en az %99.99 eksiksiz ve doğru olduğu doğrulandı; üst sınır %99.9999 olarak belirlendi.
- Shadow validation, LSG'nin production trafiğini işleyebildiğini doğruladı ve veri erişim koduna güven sağladı.
- Shadow validation, şu anda erişilen verinin eksiksizliği ve doğruluğu konusunda güven sağladı.
Offline validation ve artımlı backfill
- LSG'deki tüm veri, DynamoDB veri dökümüyle karşılaştırıldı.
- Offline validation, veri backfill'inin doğru yapıldığını doğrular ve tüm veri kümesini kapsar.
- Offline validation, shadow validation ile birlikte yürütülmelidir.
Backfill sorunları
- Her backfill risklidir. Uber backfill'i Apache Spark kullanarak gerçekleştirdi.
- Sorunları ele alma yöntemleri:
- Ölçeklenebilirlik: küçük ölçekte başlayıp kademeli olarak büyütmek
- Artımlı backfill: veriyi küçük partilere bölerek taşımak
- Hız kontrolü: backfill işlerinin hızını ayarlamak
- Dinamik hız kontrolü: sistemin anlık durumunu izleyerek hızı ayarlamak
- Acil durdurma: aşırı yük şüphesi olduğunda backfill'i hızla durdurabilmek
- Veri dosyası boyutu: veri dökümü dosyalarının boyutunu uygun seviyede tutmak
- Hata toleransı: veri kalitesi/bozulma sorunlarını ele almak
- Loglama: log altyapısını zorlamamak için log miktarını sınırlamak
Risk azaltma
- Çeşitli doğrulama ve backfill istatistikleri analiz edilerek LSG rollout'u temkinli biçimde gerçekleştirildi.
- Başlangıçta, backfill başarısız olursa veriyi DynamoDB'den getiren bir fallback kullanıldı.
- Fallback logları incelenerek LSG'de verinin gerçekten eksik olup olmadığı kontrol edildi.
Sonuç
- Bu yazı, büyük ölçekli ve iş açısından kritik muhasebe verilerinin bir veri deposundan diğerine taşınma sürecini ele alıyor.
- Taşıma ölçütleri, doğrulama, backfill sorunları ve güvenlik gibi çeşitli boyutlar inceleniyor.
- Taşıma 2 yıl boyunca kesinti veya arıza olmadan tamamlandı.
GN⁺ görüşü
- Veri taşımanın önemi: Büyük ölçekli veri taşıma karmaşık ve riskli olsa da, maliyet tasarrufu ve sistem sadeleşmesi sayesinde uzun vadede büyük fayda sağlar.
- Shadow validation'ın faydası: Shadow validation, gerçek trafiği etkilemeden verinin eksiksizliğini ve doğruluğunu doğrulamak için güçlü bir araçtır.
- Offline validation'ın gerekliliği: Yalnızca shadow validation ile ortaya çıkmayan sorunlar bulunabildiği için offline validation da şarttır.
- Backfill'e kademeli yaklaşım: Backfill işlerini küçük partilere bölüp kademeli yürütmek, sistemin aşırı yüklenmesini önlemede etkilidir.
- Acil durdurma özelliği: Backfill sırasında sorun çıkarsa işi hızla durdurabilmek, sistem kararlılığını korumak açısından önemlidir.
1 yorum
Hacker News görüşü
Hacker News yorum derlemesi özeti
Çeyrek başına 2 milyar yolculuk
DynamoDB’nin kötü kullanımı
Google’ın reddettikleri
Tek sunucuda SQLite
LedgerStore açık kaynak değil
Özel altyapı dönemi
Pahalı, kapalı bulut
TigerBeetle düşünüldü mü?
DynamoDB pahalı
Ekibi yürütmenin maliyeti