📖
Genel Bilgiler
  • Genel
  • Yazılım Teknolojiileri
    • SOLID
    • Mimariler ve Mimari Paternleri
    • MVC, MVP, MVVM
    • Mikroservis Yaklaşımı
    • DDD
    • Nesne Yönelimli Programlama
    • Hangi Programlama Dili Hangi Framework Öğrenilmeli?
    • Programlama Dilleri Üzerine tecrübeler
    • Microsoft .NET Teknolojileri
    • Microsoft .NET CORE 3.x ile Katmanlı Mimari Tasarımı
    • Test
    • Hangi Geliştirme ve Deployment Ortamı (Windows vs Linux)
    • Veri Tabanları ve Veri Tabanı Mimarileri
    • Asysnc/Awake
    • Oyun Geliştirme
      • WebAssembly vs Asm.ts
      • Unity ve Devler Ligi
      • Godot Oyun Motoru
      • Three.js ve Alternetif Javascript 3D Kütüphaneler/Framework' ler
    • Aspect Oriented Programming
  • Sanallaştırma
    • Sanallaştırma (Hypervisor ve Container & Docker)
    • Kubernetes
  • Yazılım Kültürleri
    • DevOps
    • Jenkins
    • SAST, DAST, SCA, Pentest
    • Glusterfs
    • Yazılım Üzerine Tartışmalar/Sohbetler
    • TUBITAK BILGEM YTE
  • Metro/Tren Sinyalizasyonu
  • Yapay Zeka (Artificial Intelligence)
  • Embedded Realtime Linux
  • Süper Bilgisayarlar Neden Süperler
  • Lock Free Tasarım
  • Git ile Çalışmak
  • CPU, APU, PPU, NPU, TPU ...
  • CANBUS
  • MERHABA (HELLO)
Powered by GitBook
On this page
  • Bilinir veri tabanları
  • Ölçekleme
  • Neden ölçekleyeyeyim?
  • PostgreSQL'i nasıl ölçekleriz?
  • Veri tabanı Mimarileri
  • Polyglot Persistence
  • Connection Pooling
  • PgBouncer
  • PgPool
  • Write-Ahead Logging (WAL)
  • 2020

Was this helpful?

  1. Yazılım Teknolojiileri

Veri Tabanları ve Veri Tabanı Mimarileri

PreviousHangi Geliştirme ve Deployment Ortamı (Windows vs Linux)NextAsysnc/Awake

Last updated 5 years ago

Was this helpful?

Genelde veri tabanı çok önemsiz görülen (aslında çok önemli bir konu olduğunun dert çıkardıkça anlaşıldığı) bir konu olması biraz daha sürecek bir problem olarak kalacak görünüyor.

Tabii Mikroservis gibi servis tabanlı yapılarda stateless mimari ya da state in dışarıda saklanması gibi tasarım geliştirmelerinde ve veritabanlarının failover, distributed database, data warehouse gibi yaklaşımlarla öneminin arttığın farkına varılacaktır.

Katmanlı mimari de Data Layer ile Data Access Layer ayrımının yapılması ve bağımlılıkların azaltılmasıyla bir veri tabanından diğer bir veri tabanına geçiş kolayca yapılabilmekte olmaktadır. Hatta ileri de ayrı bir servis olarak sunmaya da yapımız müsait olacaktır.

Sonuç olarak frontend ile backend ayırabilenler için aslında backend ile database işlemlerinin ayrık olduğunu kavrayabilmek kolay olacaktır. Küçük projeler için Full Stack Developer kavramıyla da devam edilebilir olsa da buradaki konular o tarz bir çalışma için de önemli olacaktır.

Bu konuda kendimize sormamız gereken soruları aşağıda toplamaya çalıştım.

  • Bilinirliği olan veri tabanları hangileri?

  • İlişkisel veri tabanı mı yoksa NoSQL veri tabanı mı?

  • Monolitik veri tabanı mı yoksa dağıtık (distrubuted) veri tabanı mı?

  • Geliştirilecek proje Veri Ambarı gerektirmekte midir?

Bilinir veri tabanları

Oracle, MySQL, Microsoft SQL Server, PostgreSQL, MongoDB, IBM DB2, Redis, Elasticsearch, SQLite, Cassandra vs..

Ölçekleme

Dikey (Vertical) ölçekleme (Scale up): Sunucu kaynaklarını arttırmak (RAM, disk, CPU, vs) (Tek nokta) • Yatay (Horizontal) ölçekleme (scale out) : Kümeye yeni sunucu(lar) ekleme (maliyet)

Neden ölçekleyeyeyim?

  • Daha iyi servis

    • Daha çok kullanıcı hedefi

    • Mevcut kullanıcıların daha iyi servis alması

  • Daha çok veri sunulması

  • Yüksek bulunurluk! (HA)

Neye göre ölçekleyeyeyim?

  • Okuma

  • Yazma

  • Okuma / Yazma!

PostgreSQL'i nasıl ölçekleriz?

Veri tabanı Mimarileri

Polyglot Persistence

Polyglot Programming' de her yazılım dilinin uzman olduğu alanda kullanılması prensibine benzer olarak tüm servislere hizmet eden tek bir veri tabanı yerine her servis için yaptığı işte uzman olan veri tabanlarıyla mimari kurulması olarak bilinir. Veri depolama için tüm çözümlere uygun tek bir veri tabanının bulunmadığını kabul eden bir yaklaşımdır.

Yüksek veri içeren internet loglarının RDMS veri tabanlarında tutulması pek tavsiye edilmiyor.

Başka bir örnek olarak üstteki link de açıklanan aşağıdaki müzik enstrümanlarını ve aksesuarlarını çevrimiçi olarak (ve mağaza ağında) satan bir şirketi düşünelim. Üst düzey bir şirketin başarılı olması için çözmesi gereken bir takım sorunlar vardır:

  • Müşterileri mağazalarına (hem sanal hem de fiziksel) çekmesi.

  • Müşterilere ilgili oldukları ürünlerin sunulması (Piyaniste bateri seti satmaya çalışmamak gerekir).

  • Müşteriler satın almaya karar verdiklerinde, ödeme ve nakliyeyi işlerinin organize edilmesi.

Şirket bu sorunları çözmek için tasarlanmış bir dizi mevcut teknoloji arasından seçim yapabilir:

  • Tüm ürünleri MongoDB, Cassandra, DynamoDB veya DocumentDB gibi belge tabanlı bir veritabanında saklayın.

    • Belge veritabanlarının birçok avantajı vardır:

      • Esnek şema,

      • Parçalama (daha büyük veritabanlarını daha küçük, daha yönetilebilir kümelere bölme),

      • High availability, ve Replication yetekleri sağlar.

  • Grafik tabanlı bir veritabanı (Büyük veri işleme motoru Apache Spark için Neo4j, Tinkerpop/Gremlin veya GraphFrames gibi) kullanarak önerileri modelleyin:

    • Bu tür veritabanları müşteriler ve tercihleri ​​arasındaki gerçek ve soyut ilişkileri yansıtır. Böyle bir grafiğin madenciliği paha biçilmezdir ve bir müşteri için daha uygun bir teklif üretebilir. Arama yapmak için bir şirket Apache Solr veya ElasticSearch gibi aramaya özel bir çözüm (search-tailored solution) kullanabilir. Böyle bir çözüm, hızlı, dizine alınmış metin arama özellikleri sağlar.

  • Bir ürün satıldıktan sonra, işlem normalde iyi yapılandırılmış bir şemaya (ürün adı, fiyat vb.) sahiptir. Bu tür verileri depolamak (ve daha sonra işlem ve raporlamak) ilişkisel veritabanları için en uygunudur.

Connection Pooling

Java, Go, .NET gibi diller yapıları gereği connection pooling’i uygulama içerisinden yapabilmektedir. PHP gibi script diller ise yapıları gereği tam anlamıyla connection pooling yapamadıkları için bu işi yapacak harici yazılımlara ihtiyaç duymaktadırlar.

PgBouncer

Her gelen bağlantı isteğinde yeni bir DB connection açmak gerektiğinden ve limitlerin üstünde gelen yeni trafikleri karşılamak için üst limitlerini artırmak yerine kullanılan ideal çözüm PgBouncer gibi bir connection pooling aracı kullanmaktır. Connection Pooling kısaca DB bağlantılarını cacheleyip, gelen yeni bağlantılarda varolan DB bağlantısını kullananmaktır diyebiliriz. Bu sayede her seferinde yeni bir bağlantı açmaktan ötürü doğan zaman ve memory kaybınını azaltabiliriz.

Postgresql bir connectioni handle edebilmek için bir kaç MB memory kullanırken PgBouncer sadece 2KB memory kullanır. Ayrıca normal DB connection açmak süre bakımından da PgBouncer’a göre daha fazla zaman alır.

Her bir pool client’dan gelen connectionları karşılar ve clientlardan gelen sorguları sıraya sokup DB connection üzerinden çalıştırır.

PgPool

Veri tabanlarını hem yedekleme hem de master daki yükü dengeleme için kullanılan yöntemler vardır.

Master yazılan veriler yedek veri tabanlarına da yazılmalıdır. SQL sorgularının yazma kısımları sadece master iletilir. Okuma olarak da slave den de okuyabilir. Böylece master ın iş yükü azaltılır.

Write-Ahead Logging (WAL)

PostgreSQL'in transaction loglama konusuna yaklaşımını gösteren WAL kavramı

“Veri dosyalarında tabloların ve dizinlerin bulunduğu yerlerdeki değişikliklerin yazılabilmesi (write) için, öncelikle bu değişikliklerin kaydedilmesi, yani değişiklikleri tanımlayan günlük kayıtların (log) kalıcı depolamaya alınması gerekir.”

Bu prosedürü takip edersek, her işlemde veri sayfalarını diske atmamız gerekmez, çünkü bir çökme durumunda veritabanını günlüğü kullanarak kurtarabiliriz.

2020

Connection pooling için veya açık kaynak yazılımlarını kullanabilirsiniz. Eğer yük dengeleme (load balancing), failover, switchover gibi ihtiyaçlarınız bulunmuyor ve sadece connection pooling ihtiyacınız varsa daha lightweight bir araç olan PgBouncer’ı önerebilirim.

https://www.gunduz.org/seminer/pg/PostgreSQLde%C3%96l%C3%A7ekleme-DevrimG%C3%BCnd%C3%BCz-OWG2013.pdf
Pgpool-II
PgBouncer
LogoThe Pros and Cons of 8 Popular Databases - KeyCDNKeyCDN
LogoMost Popular Databases In The WorldCsharpCorner
LogoMost Popular Databases in 2020: Here's How They Stack Up - OrmucoOrmuco
Logo2019 Database Trends: SQL vs. NoSQL - Top DatabasesScaleGrid Blog - Fully Managed Cloud Databases Tips
LogoMicroservice Mimari’lerde Veritabanı TasarımıMedium
https://dergipark.org.tr/en/download/article-file/297870
LogoPolyglot persistence: what is it and why does it matter? | Packt HubPackt Hub
LogoPostgreSQL’de Bağlantı Yönetimi (connection pooling)Medium
LogoPgBouncer kullanımı · Mesut Taşçı
LogoPostgreSQL 9.4 Replication with RepMgr and PgBouncer on Ubuntu 14.04Medium
Logopgpool Wiki
LogoPostgresql Multi-Master Replication(Pgpool-II) - Veritabanı Bilgi HavuzuVeritabanı Bilgi Havuzu
LogoSetup a redundant PostgreSQL database with repmgr and pgpoolJensd's I/O buffer
Logorepmgr - Replication Manager for PostgreSQL clusters
LogoPostgreSQL Write-Ahead Logging (WAL) Mekanizması - KartacaKartaca
PostgreSQL'de WAL Kavramı | MadBlog
Data Storage Landscape changes
Data stores overview
Database System Monitoring
Drawbacks, Benefits and Challenges of Polyglot Persistence