Bu yazımızda Postgresql veritabanın wal_compression parametresini inceleyeceğiz.
Postgresql veritabanı gerçek verilerdeki değişiklikleri diske yazmadan önce değişiklik bilgilerini transaction log dosyalarına(WAL dosyalarına)
yazarak kullanıcıya yazıldı bilgisini hızlıca döner ve bu bilgiyi olası crash anında bile garanti altına almış olur.Bu wal dosyalarının varsayılan boyutu 16MB. Bu dosyaları $PGDATA/pg_wal altında görebilirsiniz.
Aslında Postgresql veritabanında herhangi bir değişiklik yapıldığında ilgili değişikliğin olduğu page belleğe alınır ve bu page wal dosyalarına yazılır. Detaylandırmak gerekirse siz bir satır güncellediğinizde o satırın olduğu page belleğe alınır, sonra o satırda güncelleme yapılır ve işlem bitmiş olur. Bu işlem sonrasında ise değişlik yapıldı bilgisi ve satırın olduğu page wal dosyalarına yazılır. İşte bu belleğe alınan page’ler wal_compression özelliği sayesinde sıkıştırılarak wal dosyalarına yazılmaktadır. Bu sayede hem disk üzerinde daha az boyutta yer tutulmuş olur hem de replikasyon olan ortamlarda daha az network bandwidth kullanılmış olur.
Küçük bir test ile aşağıdaki karşılaştırmaları yapabilirsiniz. Unutmamalıdır ki bu işlem disk boyut anlamında avantaj sağlarken cpu’ya ek yük getireceğinde canlı ortama alınmadan önce mutlaka test edilmelidir.
Not: aşağıdaki sonuçlar ortamlarınıza göre değişiklik gösterebilir.
#####Aynı işlem yeni oluşturulan veritabanında wal_compression açık iken############
wal_comression = off
postgres=# show wal_compression;
wal_compression
off
(1 row)
tablolar oluşturulmadan öncek pg_wal boyutu:
[postgres@pgforenda01 data]$ du -b -s pg_wal/
16777282 pg_wal/
pgbench ile veritabanı tabloları oluşturulur.
[postgres@pgforenda01 data]$ pgbench -p 5432 -i -s 50
dropping old tables…
NOTICE: table “pgbench_accounts” does not exist, skipping
NOTICE: table “pgbench_branches” does not exist, skipping
NOTICE: table “pgbench_history” does not exist, skipping
NOTICE: table “pgbench_tellers” does not exist, skipping
creating tables…
generating data…
….
vacuuming…
creating primary keys…
done.
tablolar oluşturulduktan sonraki pg_wal boyutu:
[postgres@pgforenda01 data]$ du -b -s pg_wal/
1308631046 pg_wal/
ek olarak aşağıdaki parametrelere benzer pgbench ile testler yaparak aradaki farkı gözlemleyebilirsiniz:
[postgres@pgforenda01 data]$ pgbench -p 5432 -c 20 -j 2 -t 1000 -M prepared
[postgres@pgforenda01 data]$ du -b -s pg_wal/
1325408262 pg_wal/
#####Aynı işlem yeni oluşturulan veritabanında wal_compression açık iken#############
wal_comression = on
[postgres@pgforenda01 data]$ psql
psql (12.5)
Type “help” for help.
postgres=# show wal_compression;
wal_compression
on
(1 row)
tablolar oluşturulmadan öncek pg_wal boyutu:
[postgres@pgforenda01 data]$ du -b -s pg_wal/
16777282 pg_wal/
pgbench ile veritabanı tabloları oluşturulur.
[postgres@pgforenda01 data]$ pgbench -p 5432 -i -s 50
dropping old tables…
NOTICE: table “pgbench_accounts” does not exist, skipping
NOTICE: table “pgbench_branches” does not exist, skipping
NOTICE: table “pgbench_history” does not exist, skipping
NOTICE: table “pgbench_tellers” does not exist, skipping
creating tables…
generating data…
….
vacuuming…
creating primary keys…
done.
tablolar oluşturulduktan sonraki pg_wal boyutu:
[postgres@pgforenda01 data]$ du -b -s pg_wal/
1207967750 pg_wal/
ek olarak aşağıdaki parametrelere benzer pgbench ile testler yaparak aradaki farkı gözlemleyebilirsiniz:
[postgres@pgforenda01 data]$ pgbench -p 5432 -c 20 -j 2 -t 1000 -M prepared -f ../pg.sql
[postgres@pgforenda01 data]$ du -b -s pg_wal/
1224744966 pg_wal/
Özetle wal_compression aşağıdaki tabloya benzer farklılık gösterecektir,dolayısıyla ortamlarınızın durumuna göre bu wal_compression parametresini mutlaka test etmenizde fayda var.
wal_compression = off | wal_compression = on | |
size after initial load | 1308631046 (1248MB) | 1207967750 (1152MB) |
size after transaction runs (bytes) | 1325408262 (1264MB) | 1224744966 (1168MB) |
Umarım faydalı olmuştur.
dba@forenda.com.tr