1 puan yazan GN⁺ 2024-08-11 | 1 yorum | WhatsApp'ta paylaş

Veritabanı olmadan yüksek erişilebilirliğe sahip bir web servisi kurmak

Keşif

  • Yeni bir startup için genellikle Rails, Django, Node gibi web framework'leri ve MySQL, PostgreSQL, MongoDB gibi veritabanları seçilir
  • Peki web servisi ile veritabanı instance'ını tek bir yapıda birleştirebilseydiniz? Tüm verileri RAM'de tutan bir yaklaşımla bu mümkün
  • RAM'i veritabanı olarak kullanınca verileri SQL sorgularıyla serileştirmek gerekmez
  • İndeksler, bellek içi hash tabloları kullanılarak uygulanabilir
  • Arka plan işleri, büyük bir proses içindeki thread'lerle yürütülebilir
  • Proses çökerse, RAM'in düzenli snapshot'larını alıp değişiklikleri diske yazarak kurtarma yapılabilir

Ölçekleme

  • Yüksek erişilebilirlik talep eden müşteriler ortaya çıktığında, Raft uzlaşma algoritması kullanılarak sunucular çoğaltılır
  • Lider sunucu devre dışı kalırsa yeni bir lider seçilir ve istekleri işlemeye devam eder
  • Bu yöntemle sunucuları yeniden başlatmadan rolling deploy yapılabilir

Ayrıştırma

  • Büyük müşterilerin sayısı arttığında, web servisi sharding ile bölünerek yönetilebilir
  • Her kurumsal müşteriye özel bir cluster sağlanır
  • Başlıca darboğaz, commit thread'inin performansı olabilir

Bizim stack'imiz

  • Common Lisp kullanılıyor: çoklu thread desteği güçlü ve kod hot reloading için uygun
  • bknr.datastore ve bknr.cluster kullanılıyor: Raft implementasyonu için Baidu'nun Braft kütüphanesi kullanılıyor
  • Görsel dosyaları depolamak için EFS kullanılıyor: hata işleme ve test açısından S3'e göre daha kolay

Özet

  • Bu mimari yeni startup'lar için uygundur ve Common Lisp kullanıldığında pek çok araç zaten hazırdır
  • bknr.datastore, Braft ve Raft'a katkı sunanlara teşekkür edilir

GN⁺ özeti

  • Bu yazı, veritabanı olmadan yüksek erişilebilirliğe sahip bir web servisi kurmak için yeni bir mimari tanıtıyor
  • RAM veritabanı olarak kullanılıyor ve Raft uzlaşma algoritmasıyla yüksek erişilebilirlik sağlanıyor
  • Common Lisp ile çoklu thread ve kod hot reloading desteği sunuluyor
  • Bu mimari yeni startup'lar için uygun; hızlı geliştirme ve debug imkanı veriyor
  • Benzer özelliklere sahip projeler arasında Redis ve Memcached bulunuyor

1 yorum

 
GN⁺ 2024-08-11
Hacker News görüşü
  • SQLite kullanmadan kendi transaction log'unu oluşturmak garip

    • Veri tek bir sunucuya sığıyorsa, veritabanını doğrudan o sunucuda çalıştırmak daha iyi
    • Veri RAM'e sığıyorsa, ramdisk kullanıp kalıcı depolamaya standart araçlarla kopyalamak daha basit
  • MySQL, Postgres, Redis, MongoDB vb. kullanmadan kendi bellek içi veritabanını yapmak karmaşık

    • Transaction'ları serialize edip diske yazmak gerekir
    • Web sunucuları arasında transaction log'unu senkronize edip bellek içi veritabanını güncellemek gerekir
    • Çakışma çözümleme algoritması yazmak gerekir
    • Web sunucularını tenant bazında shard edip bir load balancing katmanı yazmak gerekir
  • MySQL veya Postgres'in temel yönlerini öğrenmek istememek zaman kaybı

    • Genel bulut sağlayıcısında çalıştırırken varsayılan tuning ile eşzamanlılık sorunları çözülebilir
    • 10 milyon satır eklemek büyük bir sorun değil
    • Daha kötü bir durum ortaya çıkana kadar bekleyip o zaman çözmek daha akıllıca
  • HashiCorp'un Nomad, Consul, Vault'una benzer bir mimari

    • Geliştirici deneyimi iyi
    • Bellek içi durumu istenildiği gibi ayarlayabiliyorsun
    • Yeni startup'lar için uygun değil
    • Upgrade özellikle zor
  • RAM'in çok ucuz olduğuna dair bir yanlış kanı var

    • SSD ve vCPU performansı çok arttı, ancak RAM fiyatları ciddi biçimde düşmedi
    • DRAM fiyatları döngüsel olarak dalgalanıyor ve ancak yakın zamanda biraz ucuzladı
  • Dosya sistemi dizinlerini tablo, JSON dosyalarını satır olarak kullanan bir proje görmüştüm

    • Redis, Mongo, Postgres değerlendirildi ama sonunda kendi veritabanlarını kurdular
    • Yenilikçi token'ı veritabanı kurmaya harcamak verimsiz
  • İlişkisel veritabanı kullanmak daha güvenilir

    • Yerleşik yedeklilik, transaction log, backup ve recovery özellikleri var
    • Çoğu durumda veritabanı kullanmak daha iyi
  • Karmaşıklıktan kaçınmak için kendi Raft consensus katmanını implement etmişler

    • Redis kullanmak daha basit olabilir
  • Modern masaüstü ve mobil uygulamalar sık sık SQLite gibi veritabanları kullanıyor

    • İlişkisel veri depolama ve sorgulama faydalı
  • Kendi bellek içi veritabanını kurmak, Postgres veya SQLite kurmaktan daha kolay değil

    • Eşzamanlılık kodu yazmaktansa SQL yazmak daha kolay