Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

Bu yazıda büyük ölçekli sistemlerde veri nasıl taşınır, neden zor bir problemdir ve Stripe gibi bir şirket bunu nasıl çözer, bunu anlayacaksın. Özellikle “sistem çalışırken veri taşıma” (zero downtime migration) konusunu sade şekilde kafana oturtacağız.
Stripe, verilerini doğrudan MongoDB kullanarak değil, onun üzerine kendi veri katmanını kurarak yönetiyor. Bu katmanın adı DocDB.
Bu sistem saniyede milyonlarca sorguyu kaldırabilecek şekilde tasarlanmış.
Şimdi şöyle düşün:
MongoDB bir motor, ama Stripe bu motorun üstüne kendi arabasını yapıyor. Yani direksiyon, fren, güvenlik sistemleri hepsi onların kontrolünde.
Peki neden bunu yapıyorlar?
Çünkü bazı kritik ihtiyaçları var:
Stripe ilginç bir karar alıyor: MongoDB’nin tüm özelliklerini açmıyor.
Yani şöyle düşün:
Elinde çok güçlü bir araba var ama maksimum hızı sınırlıyorsun.
Neden?
Çünkü fazla özellik = yanlış kullanım riski.
Bu yaklaşım “self harm avoidance” dediğimiz şey.
Yani sistemin kendi kendini bozmasını engellemek.
Stripe’da client’lar (uygulamalar) veritabanına direkt bağlanmıyor.
Arada bir katman var: Database Proxy
Şimdi şöyle düşün:
Restorana girdin. Mutfakla direkt konuşmuyorsun. Garson var.
Bu proxy katmanı:
Bu sayede sistem:
Veri tek bir yerde durmuyor, parçalara bölünüyor.
Bu parçalara “chunk” deniyor.
Yani şöyle düşün:
Büyük bir Excel dosyasını 100 parçaya böldün ve farklı bilgisayarlara dağıttın.
Ama bir problem var:
“Hangi veri hangi makinada?”
İşte burada devreye chunk metadata service giriyor.
Bu servis şunu tutar:
👉 Bu veri → şu shard’da
Proxy de bu bilgiye bakarak isteği doğru yere yollar.
Stripe burada çok kritik bir abstraction kullanıyor.
Veriyi direkt shard’a koymuyor, önce “logical database” oluşturuyor.
Yani şöyle düşün:
Artık taşıma işlemi şöyle oluyor:
❌ Tek tek eşyaları taşı
✅ Odayı komple taşı
Bu ne sağlıyor?
Şimdi en kritik yere geldik.
Bir veriyi bir shard’dan diğerine taşıyorsun.
Ama sistem çalışmaya devam ediyor.
Bu neden zor?
Çünkü:
Bu süreci sadeleştirerek anlatalım.
Hangi veri hangi shard’dan nereye gidecek belirlenir.
Verinin snapshot’ı alınır ve yeni yere kopyalanır.
Ama burada önemli bir detay var:
Offset pagination kullanılmaz.
Onun yerine cursor kullanılır.
Yani şöyle düşün:
Kitapta sayfa sayfa atlamak yerine, kaldığın yerden devam ediyorsun.
Bu çok daha hızlıdır.
Veri taşınırken eski shard hala yazı alıyor.
Peki yeni shard nasıl güncel kalıyor?
Cevap: CDC
Yani şöyle düşün:
Yeni eve taşındın ama eski evine hala mektup geliyor.
Birisi o mektupları alıp sana getiriyor.
Veri doğru taşındı mı?
Bu aşamada:
kontrol edilir.
Bu adım kritik.
Artık veri yeni shard’da hazır.
Ama kullanıcılar hala eski shard’a gidiyor.
İşte burada olay kopuyor.
Binlerce proxy var.
Hepsine “artık buraya gitme, şuraya git” demek zor.
Stripe bunun için çok akıllı bir çözüm kullanıyor:
👉 Versioning sistemi
Her shard’ın bir version’ı var.
Şimdi şöyle düşün:
Proxy eski bilgiyi biliyor (v1).
İlk request hata alıyor.
Ama sonrası düzgün çalışıyor.
Yani şöyle düşün:
Bu mühendislikte klasik bir trade-off:
👉 “Mükemmel senkronizasyon yerine kontrollü hata + retry”
Stripe’ın yaptığı şey aslında çok net:
Veriyi taşırken sistemi durdurmamak.
Bunu sağlamak için:
Sonuç?
👉 Sistem durmadan veri taşınabiliyor
👉 Kullanıcılar fark etmiyor
👉 Büyük ölçek sorunsuz yönetiliyor
Aslında bu çok basit:
Sistemi durdurmak yerine, hatayı tolere etmeyi öğreniyorsun.
Bu yazı How Stripe Scales MongoDB to 5 million Queries Per Second videosundan ilham alınarak yazılmıştır.