1 puan yazan GN⁺ 2025-12-24 | 1 yorum | WhatsApp'ta paylaş
  • PostgreSQL 18, dosya kopyalama stratejisi (FILE_COPY) ile dosya sistemi klonlama özelliğini birleştirerek veritabanlarını neredeyse anında klonlayabiliyor
  • Yeni file_copy_method = clone ayarı kullanıldığında XFS, ZFS, APFS gibi modern dosya sistemlerinin klonlama özelliğinden (FICLONE) yararlanılabiliyor
  • Benchmark sonuçlarına göre 6GB'lık bir veritabanını klonlarken mevcut WAL_LOG yöntemi yaklaşık 67 saniye, klon yöntemi ise 0,2 saniye sürüyor
  • Klonlanan veritabanları başlangıçta aynı fiziksel blokları paylaşsa da, yazma işlemi olduğunda copy-on-write ile ayrılıyor
  • Ancak yalnızca etkin bağlantı yokken klonlama yapılabiliyor ve sadece tek bir dosya sistemi içinde çalışıyor

PostgreSQL'in şablon tabanlı klonlama yapısı

  • PostgreSQL, CREATE DATABASE dbname komutunu çalıştırdığında dahili olarak template1 veritabanını klonlayarak yeni veritabanını oluşturur
    • Bu, CREATE DATABASE dbname TEMPLATE template1 ile aynı davranıştır
  • template1 yerine başka bir veritabanı belirtilebildiği için kullanıcı tanımlı şablonlar ile klonlama yapılabilir
  • PostgreSQL 18'de bu şablon sistemi anında klonlamayı mümkün kılan bir yapıya genişletildi

CREATE DATABASE ... STRATEGY

  • PostgreSQL 15'ten itibaren CREATE DATABASE ... STRATEGY parametresi eklendi ve klonlama yönteminin seçilmesi mümkün oldu
    • Varsayılan değer WAL_LOG olup Write-Ahead Log üzerinden blok düzeyinde kopyalama yapar
    • Bu yöntem I/O yükünü azaltır ve eşzamanlılık desteğini iyileştirir, ancak büyük veritabanlarında yavaştır
  • STRATEGY=FILE_COPY belirtildiğinde geleneksel dosya kopyalama yöntemine dönülebilir; PostgreSQL 18'de bunun üzerine yeni bir klonlama seçeneği eklendi

FILE_COPY ve file_copy_method

  • PostgreSQL 18'deki file_copy_method ayarı, işletim sistemi düzeyindeki dosya kopyalama yöntemini kontrol eder
    • Varsayılan değer copy'dir; tüm baytları okuyup yeni konuma yazar
    • clone olarak değiştirildiğinde dosya sisteminin klonlama özelliği (FICLONE) kullanılır; böylece anlık klonlama yapılır ve ek alan tüketilmez
  • Desteklenen dosya sistemleri: XFS, ZFS, APFS, FreeBSD ZFS
  • Kurulum adımları
    • PostgreSQL kümesini ilgili dosya sistemi üzerinde kurun
    • file_copy_method = clone ayarını yapıp yeniden yükleyin

Benchmark sonuçları

  • Yaklaşık 6GB boyutunda bir test veritabanı (source_db) oluşturulduktan sonra iki yöntem karşılaştırıldı
    • WAL_LOG yöntemi: 67.000ms (yaklaşık 67 saniye)
    • FILE_COPY + clone yöntemi: 212ms
  • Aynı veri boyutunda 300 kattan fazla hız artışı görüldü
  • Klonlanan veritabanı (fast_clone) neredeyse hiç ek disk alanı kullanmıyor

Klonlanan verinin çalışma mantığı

  • file_copy_method = clone kullanıldığında yalnızca dosya sistemi metadata'sı kopyalanır ve iki veritabanı aynı fiziksel blokları paylaşır
  • PostgreSQL'in raporladığı veritabanı boyutu mantıksal boyut olarak aynı kalır (yaklaşık 6GB)
  • Yazma işlemi olduğunda copy-on-write (COW) devreye girer ve ilgili sayfa ayrılır
    • Değiştirilen satırı içeren sayfa
    • Yeni tuple'ın yazıldığı sayfa
    • İndeks sayfaları ile FSM, visibility map sayfaları gibi diğer sayfalar
  • VACUUM çalıştırıldığında da ek sayfa ayrışmaları olur

XFS üzerinde paylaşılan blokların doğrulanması

  • filefrag -v komutuyla iki veritabanının fiziksel blokları paylaşıp paylaşmadığı doğrulanabilir
    • Başlangıç durumunda tüm extent'ler shared olarak görünür
    • Bazı satırlar güncellendiğinde ilk 40 blok (yaklaşık 160KB) ayrılır ve farklı fiziksel adreslere taşınır
    • Kalan extent'ler ise paylaşılmaya devam eder

Dikkat edilmesi gerekenler ve kısıtlar

  • Klonlama sırasında kaynak veritabanında etkin bağlantı olmamalıdır
    • Bu, dosya sisteminden değil PostgreSQL'in kendi kısıtından kaynaklanır
    • Gerçek üretim ortamlarında genellikle ayrı bir şablon veritabanı kullanılır
  • Yalnızca tek bir dosya sistemi içinde klonlama yapılabilir
    • Birden fazla tablespace farklı bağlama noktalarındaysa normal kopyalamaya geri dönülür
  • Bulut yönetimli servislerde (AWS RDS, Google Cloud SQL vb.) dosya sistemine erişim olmadığı için bu özellik kullanılamaz
    • Kendi VM veya bare metal ortamınızda ise tam kontrol mümkündür

Sonuç

  • PostgreSQL 18'deki file_copy_method = clone özelliği, işletim sistemi düzeyindeki klonlama yeteneğini doğrudan kullanarak
    büyük veritabanlarının klonlama süresini dramatik biçimde kısaltır
  • Test, geliştirme ve öğrenme ortamlarında anında klonlanabilen ve sıfırlanabilen veritabanı iş akışları kurulabilir
  • Ancak işletim tasarımında etkin bağlantı kısıtı ve tek dosya sistemi şartı dikkate alınmalıdır

1 yorum

 
GN⁺ 2025-12-24
Hacker News yorumları
  • Bekleyemeyen ya da PG18'in tam örnek yalıtımına ihtiyaç duyanlar için, ZFS snapshot kullanarak anında dallanma yapan Velo adlı bir araç yaptım
    Herhangi bir PostgreSQL sürümünde çalışıyor ve her dalın bağımsız bir container'ı ve portu var
    100GB'lık bir DB için yaklaşık 2~5 saniyede oluşturulabiliyor
    PG18 yaklaşımından farkı, tek bir örneği paylaşmaması ve tam sunucu yalıtımı sağlaması
    GitHub bağlantısı

    • Başka bir yorumda Claude Code kullanımına yönelik şikayetler vardı ama GitHub sayfasındaki demo videosunu izleyince ilginç geldi
    • Artık çoğu yazılım AI agent desteğiyle yazılıyor; neden şikayet edildiğini bilmiyorum. Yaklaşım ilginç
    • Ben de benzer bir şeyi btrfs ile prototiplemeyi düşünüyordum
    • “sen” ifadesini ilginç bulmuştum ama intihal edildiğine dair laf edilmesi biraz şaşırttı
  • Geçmişte şirket RDS'e migration yaparken buna benzer bir sistemi kendimiz kurmuştuk
    Production migration sırasında sık sık sorun çıktığı için, bunu önlemek amacıyla şu adımları otomatikleştirmiştik

    1. RDS DB'yi kopyalamak veya yedekten yeni bir instance oluşturmak
    2. ARN'den CNAME ya da public IP çıkarmak
    3. Bunu uygulamanın DB bağlantı ayarlarına yansıtmak
    4. Sahte bir production ortamında migration çalıştırmak
      Bu süreç sayesinde local'de ya da CI'da yakalanmayan pek çok production'a özgü bug yakalayabildik
      Sonrasında bunu basit bir Ruby script ile otomatikleştirdik ve duyduğuma göre o script hâlâ kullanılıyormuş
    • Ben de o tür “veri tuhaflıkları yüzünden yalnızca production'da patlayan migration” bug'larından gerçekten nefret ediyorum. Birkaç kez bu yüzden release iptal ettim
  • Template cloning stratejisinin yapılandırılabilir olduğunu bunu okuyunca ilk kez öğrendim
    Ben Neon ile gerçek zamanlı entegre ortamlar kurdum ve Golang projem pgtestdb içinde her test için tam schema migration uygulanmış bir Postgres DB oluşturuyorum
    Daha önce bir startup'ta btrfs ile anında staging DB oluşturulduğunu görmüştüm; benzer fikirlerin tekrar tekrar ortaya çıkması ilginç
    Bu tür hızlı kopyalama ve test yetenekleri Postgres ve Sqlite'ın büyük avantajlarından biri; keşke Clickhouse ve MySQL'de de mümkün olsa

  • Son zamanlarda PostgreSQL neredeyse tüm SQL kullanım alanlarını kapsayan genel amaçlı bir DB hâline gelmiş gibi görünüyor
    Üstelik ücretsiz
    Artık başka bir SQL DB kullanmak için gerçekten bir neden kalıp kalmadığını merak ediyorum

    • Postgres harika ama MySQL'de master-master replication daha kolay, MongoDB'de coğrafi dağıtım ve sharding daha basit
      Clickhouse analitik için çok daha hızlı, Cassandra gibi DB'ler ise write-ağırlıklı workload'larda avantajlı
      Yani her DB'nin hâlâ kendine özgü güçlü yanları var
    • “Her şeyi iyi yapıyor” demek abartı
      Veri büyüdükçe performans düşüşü ya da migration sorunları ortaya çıkıyor
      Benim durumumda yerleşik partitioning performansı yetersizdi, bu yüzden özel partition yapısını kendim uygulamak zorunda kaldım
    • Postgres'in MVCC implementasyonu (copy-on-write) hâlâ verimsiz
      Bu tercih, yük arttığında çeşitli olumsuz etkilere yol açıyor
    • Eskiden MySQL/InnoDB update-ağırlıklı workload'larda daha iyiydi
      Uber'in blog yazısında da bu konu ele alınmıştı
      Buna rağmen cloud ortamında en çok Postgres'e güveniyorum
    • Postgres için henüz Vitess seviyesinde olgun bir alternatif yok
      Bu yüzden büyük ölçekli OLTP deployment'larda MySQL hâlâ daha yaygın kullanılıyor (ör. YouTube, Uber)
  • Değişmez veri yapıları (HAMT) kullanılırsa dosya sistemi türünden bağımsız olarak anında klonlanabilen bir DB yapılabilir
    Bunu teori olarak söylemiyorum; gerçekten uyguladım
    Neden daha fazla HAMT tabanlı DB olmadığını anlayamıyorum

    • Ben ClickHouse'un yazarlarından biriyim; ClickHouse da değişmez veri parçalarını kullanarak tablo klonlamayı destekliyor
      İlgili doküman bağlantısı
    • Datomic'te de bu tür klonlama yeteneğinin yerleşik olup olmadığını merak ediyorum. Uzun zamandır denemek istiyorum ama gerçek bir uygulama yapmak için henüz kendimi hazır hissetmiyorum
  • Postgres v15'te WAL_LOG'un varsayılan hâle geldiğini bilmiyordum
    Paralel CI test ortamlarında FILE_COPY stratejisine geri dönmek daha mantıklı
    Eski projem integresql için bununla ilgili bir issue açmıştım

  • Local'de Postgres tabanlı uygulamaları test etmek için basit bir GUI aracı pgtt yapmıştım
    Geliştirme ortamı kurulumunu ciddi biçimde basitleştiriyor

    • Sadece README'ye bakınca tam anlaşılmıyor; template'leri snapshot gibi ele alan bir yapısı mı var diye merak ettim
      SQL migration tekrarlarında işe yarayabilir gibi görünüyor
    • README'de bir GUI ekran görüntüsü olsa iyi olurdu ve Docker bağlantısı bozuk
  • Blogdaki diğer yazıları da okudum; genel olarak çok iyiler
    Özellikle Postgres'in range type özelliğini ilk kez öğrendim

    • range type, zaman/tarih aralığı çakışmalarını hesaplama gibi durumlarda gerçekten çok kullanışlı
  • MariaDB'de de buna benzer bir özellik olup olmadığını merak ediyorum
    Her testte DB'yi başlangıç durumuna döndürmek yavaş olduğu için uğraşıyorum
    Production'da MariaDB kullandığımız için DB değiştirmek zor
    Yine de Postgres tarafı daha iyi görünüyor

    • Her testi bir transaction session içinde çalıştırıp sonunda rollback yaparsanız başlangıç durumuna hızlıca dönebilirsiniz
      Bu yöntem oldukça verimli
    • DB'yi yeniden başlatmak sorun değilse dosya sistemi seviyesinde LVM veya btrfs snapshot kullanmak da bir seçenek
  • AWS de benzer bir özellik sunuyor
    Aurora clone dokümanı

    • Aurora'nın clone özelliği storage seviyesinde copy-on-write ile çalışıyor ama yine de yeni bir cluster provision etmek gerektiğinden yaklaşık 10 dakika sürüyor
      Entegrasyon testleri için gerçekçi değil
    • Aurora, cluster düzeyinde kopyalama yapıyor; burada tartışılan ise veritabanı düzeyinde kopyalama