10 puan yazan GN⁺ 2024-01-16 | 1 yorum | WhatsApp'ta paylaş

Wal2 modunu etkinleştirme/devre dışı bırakma

  • SQLite'ın "Wal2" modu, "wal (Write-Ahead Logging)" moduna çok benzer.
  • Veritabanını wal2 moduna geçirmek için PRAGMA journal_mode = wal2; komutunu kullanın.
  • "wal" modundan doğrudan "wal2" moduna geçilemez; önce rollback moduna geçmek gerekir.
  • Wal modundaki bir veritabanını wal2 moduna geçirmek için PRAGMA journal_mode = delete; ardından PRAGMA journal_mode = wal2; komutlarını kullanın.
  • Wal2 modundaki veritabanlarına yalnızca ilgili branch ile derlenmiş SQLite sürümlerinden erişilebilir.
  • SQLite'ın başka bir sürümünü kullanmaya çalışırsanız SQLITE_NOTADB hatası oluşur.
  • Wal2 modundaki bir veritabanını rollback moduna geçirerek tüm SQLite sürümlerinden erişilebilir hale getirmek için PRAGMA journal_mode = delete; komutunu kullanın.

Wal2 modunun avantajları

  • Mevcut wal modunda, yazıcı veritabanına veri yazarken veritabanı dosyasını doğrudan değiştirmez; bunun yerine yeni verileri "-wal" dosyasına ekler.
  • Okuma işlemleri verileri hem özgün veritabanı dosyasından hem de "-wal" dosyasından okur.
  • Bir noktada "-wal" dosyasındaki veriler veritabanı dosyasına kopyalanır; buna "checkpoint" denir.
  • Checkpoint işlemi PRAGMA wal_checkpoint veya sqlite3_wal_checkpoint_v2() ile açıkça yapılabilir ya da PRAGMA wal_autocheckpoint ayarlanarak otomatik olarak gerçekleştirilebilir (varsayılan davranış).
  • Checkpointer yazarı engellemez ve yazar da checkpointer'ı engellemez.
  • Ancak checkpoint sırasında yazar veritabanına yazarsa, yeni veriler wal dosyasının sonuna eklenir ve wal dosyası büyümeye devam edebilir.
  • Wal2 modunda, checkpointer'ın kesintiye uğramadan tamamlanma fırsatı bulamaması nedeniyle wal dosyasının sınırsız büyümesi sorunu yaşanmaz.
  • Wal2 modunda tek bir dosya yerine iki wal dosyası ("-wal" ve "-wal2") kullanılır.
  • Veri yazıldığında, yazar ilk wal dosyasına yeni verileri eklemeye başlar.
  • İlk wal dosyası yeterince büyüdüğünde, yazar ikinci wal dosyasına veri eklemeye başlar.
  • Daha sonra ilk wal dosyası checkpoint edilebilir; ikinci wal dosyası yeterince büyüyüp ilk dosya checkpoint edildikten sonra yeniden ilk dosyaya geçilir.

Uygulama programlama

  • Kullanıcı açısından wal ve wal2 modları arasındaki temel fark checkpoint ile ilgilidir.
  • Wal modunda istediğiniz zaman checkpoint denenebilir; ancak wal2 modunda checkpoint ancak yazar "diğer" wal dosyasına geçtikten sonra mümkündür.
  • Wal modunda, işlem commit edildikten sonra wal-hook (callback), wal dosyasındaki toplam sayfa sayısını argüman olarak alarak çağrılır.
  • Wal2 modunda wal-hook, iki wal dosyasındaki toplam checkpoint edilmemiş sayfa sayısını argüman olarak alarak ya da "diğer" wal dosyası boşsa veya zaten checkpoint edildiyse 0 argümanıyla çağrılır.
  • İstemcilerin wal2 modundaki veritabanları için wal moduyla aynı checkpoint stratejisini kullanması önerilir.
  • Wal-hook, işlem diske commit edilip veritabanı kilidi serbest bırakıldıktan sonra çağrılır; ancak bu, sqlite3_step() çağrısının içinde gerçekleşir.
  • BEGIN CONCURRENT sisteminde, wal-hook içinde checkpoint çalıştırmak yerine, bu işi uygulama mutex'i serbest bırakıldıktan sonraya erteleyen bir thread kullanılabilir.

GN⁺ görüşü

  • SQLite'ın wal2 modu, veritabanının eşzamanlılığını ve verimliliğini artıran yeni bir journaling yaklaşımı sunuyor.
  • Wal dosyasının sınırsız büyümesi sorununu çözerek sistem kararlılığı ve performansını iyileştirmesi önemli.
  • Geliştiricilerin wal2 modunun kullanıma girmesiyle birlikte veritabanı checkpoint stratejilerini yeniden gözden geçirmesi ve daha iyi eşzamanlılık için uygun checkpoint mantığını uygulaması gerekiyor.

1 yorum

 
GN⁺ 2024-01-16
Hacker News görüşleri
  • WAL2 modunda tek bir WAL dosyası yerine iki WAL dosyası kullanılıyor. Dosyalar "<veritabanı>-wal" ve "<veritabanı>-wal2" olarak adlandırılıyor. Veritabanına veri yazıldığında, yazma işlemi ilk WAL dosyasına yeni verinin eklenmesiyle başlıyor. İlk WAL dosyası yeterince büyüdüğünde, yazma işlemi ikinci WAL dosyasına veri eklemeye geçiyor. Bu noktada ilk WAL dosyasında checkpoint yapılabiliyor (ve sonrasında üzerine yazılabiliyor); ikinci WAL dosyası yeterince büyüyüp ilk dosya da checkpoint edildikten sonra yeniden ilk WAL dosyasına dönülüyor. Bu süreç böyle devam ediyor.

    • Bu yaklaşım çok mantıklı; WAL modunun en başından beri neden böyle uygulanmadığını anlamıyorum. Muhtemelen erken sayılmış bir optimizasyon olarak görülmüştür.
    • Bu modun genel kullanıma açılmasını umuyorum.
  • Bedrock

    • Bedrock daha ilginç bir branch.
    • WAL2 + CONCURRENT özelliklerini içeriyor.
    • Expensify'nin tek bir node üzerinde 4M QPS'ye kadar ölçeklenmek için kullandığı branch buymuş (6 yıl önce).
  • WAL2 moduna benzer bir teknik olan left-right primitive için bağlantı verilmiş.

    • Bu teknik, bağlantı verilen implementasyondan daha eski ama bağımsız olarak yeniden keşfedilmiş; özellikle Noria adlı başka bir yüksek performanslı SQL veritabanını desteklemek için yazılmış.
  • WAL2 modunda tek bir WAL dosyası yerine iki WAL dosyası kullanılıyor. Dosyalar "<veritabanı>-wal" ve "<veritabanı>-wal2" olarak adlandırılıyor.

    • Kaç kişinin wal dosyasını sileceğini merak ediyorum. Sonuçta wal2ye geçildiğine göre wal dosyasının artık kaldığı düşünülebilir.
  • Microsoft SQL Server benzer bir mimari kullanıyor, ancak ayrı log dosyaları yerine fiziksel (disk üzerindeki) log dosyası içinde Virtual Log Files (VLF) ayırıyor. VLF'ler ring buffer içinde tahsis ediliyor ve binlerce olabilir.

  • Bu özelliğin henüz yayımlanmadığı anlaşılıyor.

  • WAL'ın veri bütünlüğünü korumaya ve çökme durumlarından kurtarmaya yardımcı olmak için var olması beni hep düşündürmüştü. Ama dosyanın kendisi toplu halde yazılıyor (ve diske güvenilir biçimde commit ediliyor); veritabanındaki her değişiklikten sonra değil, performans kazanmak için böyle yapılıyor. Bu durum amacını boşa çıkarmıyor mu? Bunu genel olarak, belirli bir veritabanına özel olmadan soruyorum ve buna dair bir yanıt bulamadım.

  • Bunun Litestream gibi yeni dağıtık SQLite sistemlerini nasıl etkileyeceğini merak ediyorum.

  • Yani bu temelde veritabanı için double buffering mi? Mantıklı.

  • WAL2 modu, HC-tree backend araştırmasının benchmark'larına dahil edilmişti.