Postgresql WAL (Write Ahead Log) Dosyaları
WAL Dosyaları Nedir?
Write ahead log kavramı postgres’in internal özelliklerinden birisidir. WAL dosyalarında veri tabanı üzerinde işletilen transaction’ların kayıtları tutulur. Bütün veri tabanlarında bulunan transaction log yapısı, veri tabanında bir hata veya beklenmedik bir kapanma işlemi meydana gelse dahi veri kaybı riskini 0’a indirmek için tasarlanmış yapılardır. WAL kayıtları sayesinde point-in-time recovery(PITR) ve Streaming replication işlemleri mümkün hale gelir. Postgresql’de WAL dosyaları $PGDATA/pg_wal dizininde tutulur.
Veri tabanında transaction log kayıtlarının tutulmadığı durumu düşündüğümüzde, shared buffer poolda değiştirilmiş ama diske henüz değişikliklerin kalıcı olarak yazılmadığı durumlarda bir kesinti veya veri tabanı kapanması olduğunda 1 ve 2 numaralı transactionların tabloya eklediği veriler kaybedilir.
WAL dosyalarında tutulan kayıtlara WAL data veya XLOG records denir. XLOG kayıtları memory’de WAL buffer alanında tutulur ve transaction commit veya rollback edildiğinde WAL dosyalarına (WAL segment file) yazılır. LSN (Log Sequence Number) ise XLOG kayıtlarının transaction log dosyasında nerde bulunduğunu belirten unique numaradır.
- Checkpointer, checkpoint işlemini gerçekleştiren bir background process’tir. Ve checkpointer işlemi tetiklendiği zaman checkpoint record olarak adlandırılan bir XLOG kaydını mevcut WAL segment file’a yazılır. Bu kayıt en son REDO point’in yerini de içerir.
- Şekil 2’deki gibi TABLE_A’ya bir insert cümlesi geldiğinde TABLO shared buffer’a alınır. Ve ilgili Page’e veri insert edilir. Bu insert işlemi için bir XLOG kaydı oluşturulur ve WAL buffer’a LSN1 kaydı ile yazılır. Daha sonra TABLE_A’nın LSN bilgisi LSN_0’dan LSN_1’e güncellenir. (Bu tabloda değişiklik yapan en son transaction bilgisi bu yöntemle izlenir)
- Bu transaction commit edildiğinde WAL bufferdaki bütün XLOG kaydı WAL segment dosyalarına yazılır.
- İkinci bir insert cümlesi geldiğinde veri yine ilgili Page’e yazılır ve bu transaction için de LSN2 isimli bir XLOG kaydı WAL bufferda oluşturulur. TABLE_A’anın LSN bilgisi LSN2 olarak güncellenir.
- Ve bir commit tetiklendiğinde yine 3.adımdaki işlemler meydana gelir.
Bu adımdan sonra bir kesinti veya beklenmedik bir durum sonucu shared pool’daki verinin kaybedildiği bir durumda Recovery işlemi şu şekilde yapılır ;
Şekil 3. Recovery işlem adımları
- İlk adımda postgresql WAL kayıtlarını okur ve Şekil2’de gerçekleştirilen ilk insert işleminin XLOG kayıtlarından TABLE_A’nın ilgili page’ini shared buffer’a yükler.
- Bu aşamada tablonun LSN bilgisi ile XLOG kaydında yer alan LSN bilgisi karşılaştırılır. Eğer XLOG kaydının LSN bilgisi TABLO_A’nın LSN kaydından büyük ise bu transaction’lar yeniden işletilir. Eğer XLOG kaydın LSN bilgisi TABLE_A’nın LSN kaydından küçük ise bir işlem yapılmaz ve diğer WAL datanın okunmasına geçilir.
- 2.adımda yapılan işlemler tekrar edilir ve kayıp diğer transaction’ın gerçekleştirdiği veri’de TABLO_A’ya insert edilir.
WAL Parametreleri
Postresql.conf dosyasında WAL dosyalarının yönetimi ile ilgili parametreler bulunur.
Wal_level : WAL dosyasına yazılacak bilginin seviyesini belirler. Default olarak bu parametre Replica değerindedir. WAL dosyalarının arşivlenmesi ve replication işlemleri için gerekli olan seviye budur. Aynı zamanda standby server üzerinde read-only sorgular çalıştırabilmesine de olanak sağlar. WAL seviyesi Minimal olarak ayarlandığında verinin base backup ve WAL loglarından yeninden yapılandırılmasına imkan verilmez. Ancak bazı operasyonlar sırasında minimal seviyede log yazılması işlemleri hızlandırır.
Fsync : Bu parametre’nin değeri on/off olabilir. Wal kayıtlarının diske anında yazılıp yazılmayacağının kararını verir. Değeri on ise WAL bufferda bulunan kayıtları anında diske yazar. Off ise bufferda tutulan WAL datasını belirli aralıklar ile diske yazar.
Synchronous_commit : on, off, local ve remote_write değerlerinden birisini alır. Default değeri on’dur. Bu parametre ile WAL kayıtlarının wal dosyalarına gecikmeli olarak yazılması sağlanabilir.
Wal_sync_method : WAL kayıtlarının disk üzerine hangi yöntem ile yazılacağını belirler. Fsync parametresi on ise bu parametre kullanılabilir.
Wal_buffer : Memory’de wal buffer alanının boyutunu belirleyen parametredir. Shared buffer içinden allocate edilir. Default değeri -1’dir. Bu değer shared buffer’ın %3’ünün wal buffer olarak allocate edilmesi anlamına gelir.
Backup WAL files
archive_mode = on # enables archiving; off, on, or always
# (change requires restart)
archive_command = ‘test ! -f /wal_archive/%f && cp %p /wal_archive/%f’ # command to use to archive a logfile segment
# placeholders: %p = path of file to archive
# %f = file name only
# e.g. ‘test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f’
- AWS nedir? – Cloud 101 - Mayıs 16, 2024
- Vector Databases - Mayıs 15, 2024
- Data Dünyası Nereye Gidiyor? - Mayıs 8, 2024