- Transaction log, pgnin önemli bir parçasıdır,
- RDBMS'in, bir sistem arızası meydana geldiğinde bile herhangi bir veriyi kaybetmemesi gerekir.
- Hiçbir verinin kaybolmamasını sağlamak için bir veritabanı sistemindeki tüm değişikliklerin ve eylemlerin geçmiş günlüğüdür.
- Günlük zaten yürütülen her işlem hakkında yeterli bilgi içerdiğinden, veritabanı sunucusu, sunucu çökmesi durumunda işlem günlüğündeki değişiklikleri ve eylemleri yeniden yürüterek veritabanı kümesini kurtarabilmelidir.
- Point-in-Time Recovery (PITR)'de kullanılır.
- Streaming Replication (SR)'da kullanılır.
- pg 7.1'den önce insert ve update işlemlerinde her page değişikliğinde diske sync call gönderirdi.
-
wal buffer: memory
-
wal segment: kalıcı disk
-
LSN: unique log sequence number kullanılıyor. (izlemek için bu terim çok kullanılıyor.) WAL'deki bir konumu gösteren bir işaretçidir. PG içinde işaretsiz 64 bit değer olarak temsil edilir; PG'nin dışında, eğik çizgi (/) ile ayrılmış 2 onaltılık sayı olarak gösterilir;
- Birinci sayı, bir WAL dosyasındaki segment'in idsini gösterir.
- ikinci sayı, o segment dosyası içindeki ofsettir.
- LSN ne kadar büyükse VT'de o kadar büyüktür.
- page file içindeki pd_lsn değeri, bu pagei en son hangi WAL'ın değiştirdiğini söyler.
-
redo point: recover ederken checkpoint olmuş ve diske buraya yazılmış buradan itibaren kurtarılacak.
-
recovery checkpoint ile sıkı bir şekilde ilgilidir.
SELECT pg_walfile_name(pg_current_wal_lsn()), pg_current_wal_lsn();
pg_walfile_name | pg_current_wal_lsn
--------------------------+--------------------
000000010000000300000081 | 3/812FCF08
(1 row)
select * from pg_walfile_name_offset(pg_current_wal_lsn());
file_name | file_offset
--------------------------+-------------
000000010000000000000001 | 8866032
(1 row)
WAL dosyasının adını 3 parçaya ayırarak okumak gerekir.
00000001|00000003|00000081
-
1-8: zaman çizgisi (timeline) (restore operasyonlarında anlamlı)
-
9-16: mantıksal WAL dosyalarını göster
-
17-24: fiziksel WAL'ı ifade eder. PostgreSQL bu kısmı segment olarak adlandırır. Her biri varsayılan olarak 16MB boyuttadır.
-
Her bir mantıksal WAL, 255 tane dosyadan(fiziksel WAL) oluşan 4080 MB toplamı olan bir dosyalar bütünüdür.
-
Yeni kurulmuş bir sistem,
000000010000000100000001
den başlar.0000000100000001000000FF
'e kadar gider, sonra,000000010000000200000000
'a geçer.
Yukarıdaki SELECT pg_current_wal_lsn();
sorgusundan dönen 3/812FCF08 çıktı 2 parçaya ayrılır.
- WAL dosyasının mantıksal WAL'daki yerini söyler.
- Bu mantıksal dosyanın başından itibaren ne kadar ilerde (offset) olduğunu gösterir. Bu rakamlar birbirlerinden mantıksal ve fiziksel yeri çıkarabilmektedir. WAL'ın yeri, WAL dosyalarının recovery ve replication işlemlerindeki rolünden dolayı kritiktir.
WAL
-
Her biri 16MB dir.
-
Dolunca yenisine geçer.
-
Elle de tetiklenebilir.
-
"select pg_switch_wal()" yazılmakta olan segmenti geçerek diğer wal segment dosyasına geçer.
-
WAL segment denir.
-
pg_wal içinde tutulur.
-
3 durumda yenisine geçer:
- dolunca
select pg_switch_wal()
ilearchive_mode
etkinkenarchive_timeout
gerçekleşirse
-
WAL dosyaları
max_wal_size
aşarsa, bir checkpoint başlatılır. -
wal_keep_size
ve replication slots özelliği de WAL segmenti dosyalarının sayısını etkiler.
- recovery (Sunucu ya da servis aniden kapanmışsa db dosyalarını kullanılabilir duruma getirmek için master servisi wal dosyalarını okuyarak db'yi stabil hale getirir.)
- sunucu başlangıcında (wal'ın kaldığı yeri db tutarlılığı ile kontrol eder.)
- replikasyonda (streaming replication wal dosyalarını aktararak yapılır.)
- incremental yedekleme (repmgr vb backup yazılımları doğrudan wal dosyalarını aktarır ve wal içerisindeki bir transactiona a dönebilir. )
wal_level = minimal # minimal, replica, or logical
# minimal sadece servis çakılırsa ve acil kapatmada kullanılabilir
# replica read only replika sunucuyu beslemek ya da pitr yapma işine yarar.
# logical ise logical replikasyon da kullanılabilir.
wal_sync_method = fsync # the default is the first option
# fsync olmazsa diske yazmadan ok dönebilir. Bu vt bozulması riski oluşturur.
# fsync off olursa "wal_sync_method" parametresi geçersiz olur.
# fdatasync eski sürümlerde sadece
wal_compression = off
# sıkıştırmayı etkinleştirir.
wal_log_hints = off
# also do full page writes of non-critical updates
wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers
# -1 shared buffera göre oto yapsın
wal_writer_delay = 200ms # 1-10000 milliseconds
# ne kadar sıklıkla wal diske flash edilsin. Büyük değerler disk performansını olumsuz etkileyebilir.
wal_writer_flush_after = 1MB
# bu kadar boyuttan sonra diske flush edilsin. birim yoksa page olarak ölçülür, 0 anında diske flush eder.
max_wal_size = 1GB
# toplam wal miktarı bu rakama çıkabilir. Çok aktif sistemlerde bu rakama ulaşınca checkpoint yapar.
min_wal_size = 80MB
# bunun altında sistem wal dosyalarını silmez, geri dönüştürür.
max_wal_senders = 10
# max wal sender process sayısı, standby serverlarda sayı primaryden düşük olamaz.
wal_sender_timeout = 60s
# Wal replikasyonunu beklemek için maksimum zamanı ayarlar
- Checkpoint dirty durumdaki bellekte duran verinin topluca diske yazılma işlemidir.
- her checkpoint yapılırken pg_control'e checkpoint pozisyonu yazılır. pg geri kalkarken buradaki bilgiye göre recover eder.
Bu olay sırasında DB aşağıdaki 3 olayı gerçekleştirir.
- Shared buffer'daki tüm dirty (değiştirilmiş) blockları bulur.
- Tüm bu veriyi dosya sistemi belliğine yazar.
- Fiziksel diske yazmak için fsync() çalıştırır.
4 şekilde çalışır:
- Elle komut olarak çalıştırma.
- Başka bir komutun ihtiyaç duymasından dolayı çalışma (
pg_start_backup('<backup_adi>')
,CREATE DATABASE
, ya dapg_ctl stop|restart
gibi.) - Son **checkpoint'**ten sonra belirlenmiş zamanın geçmesi
Belirli aralık
: **checkpoint_timeout
(seconds) **ile belirleriz.
- Son **checkpoint'**ten sonra belirlenmiş miktarda WAL üretilmiş olması.
-
Belirli miktar
max_wal_size
(GB) olarak belirlenmektedir. Her bir WAL 16MB olduğundan WAL dosyası sayısı =max_wal_size
/ WAL boyutu olarak düşünebiliriz. -
Checkpointlerin WAL miktarına değil de zamana bağlı olarak gerçekleştiriliyor olması istenen bir durumdur. Eğer WAL miktarından dolayı gerçekleşiyorsa
max_wal_size
parametresinin büyütülmesi tavsiye edilmektedir.
Ayrıca checkpoint_completion_target
(0-1 arasında float) bir sonraki checkpointin diğeriyle arasındaki mesafenin ne kadar zamanda bitmesi gerektiğini belirler. Yani bir sonraki CHECKPOINT 10 dk sonra ise 0.5 değeri checkpoint işlemini 5 dk'ya dağıtarak bitirmesini zorlar. 0.9 %90 zamanında bitirmesini sağlar. Bu sayede checkpointten kaynaklanan io yükselmeleri zamana dağıtılarak performans kazancı sağlanır.
- pg_control dosyası, checkpoint temel bilgilerini içerdiğinden, veritabanı kurtarma için kesinlikle gereklidir. Bozuk veya okunamıyorsa, bir başlangıç noktası elde edemediğinden kurtarma işlemi başlatılamaz.
- 40 satırdan fazla bilgi saklar.
/usr/lib/postgresql/14/bin/pg_controldata -D <PG_DATA>
- archiver işlemi yapar.
- her dosya değişikliğinde dosya başka bir yere arşivlenir.
- Aktarılan dosyaya archive log denir.
- Yedekleme ve replikasyon için kullanılır.
# /home/postgres/archives/ altında arşivler
archive_command = 'cp %p /home/postgres/archives/%f'
- Bir yedekleme yazılımıyla yönetin.