1. Giriş
70'li yıllarda önerilen ilişkisel veri tabanı modelinin en güçlü açık kaynak kodlu temsilcisi olan PostgreSQL, kullanıcılarına sağladığı avantajlar sayesinde halen etkin olarak kullanılmaktadır. Güvenlik, hız, mekansal veri desteği gibi avantajlı özellikler sunan PostgreSQL lisans maliyetlerini de ortadan kaldırmıştır. Client-server mimarisinde multi-process hizmet veren bir ilişkisel veri tabanı yönetim sistemidir. Aynı zamanda mekansal veri desteği sunan ilk ilişkisel veri tabanı yönetim sistemlerinden biridir.
PostgreSQL mimarisi memory, process ve disk üzerindeki dosyalardan oluşur. Process'ler postgres server, backend, background, replication associated process olmak üzere 4 ana başlıkta incelenebilir.
2. PostgreSQL Mimarisi
2.1. Postgres Server Process
Önceki sürümlerde postmaster olarak adlandırılan postgres server process pg_ctl yardımcı programının start komutu ile postgres server başlatılır. Postgres server process server çalıştığında ayağa kalkan ilk process'tir ve diğer process'lerin parent process'idir. Sistem başlatıldığında shared memory'den postgresql server'in kullanacağı ram alanı allocate edilir ve background process'ler başlatılır. Varsa replication processler çalıştırılır ve sunucu kullanıcıyı dinlemeye başlar. Kullanıcıdan bir talep geldiği zaman bir backend process başlatılır ve kullanıcıdan gelen tüm talepleri de bu backend process yakalar.
Postgres server process default olarak 5432 portu olmak üzere aynı anda yalnızca bir portu dinler. Ancak port numaraları farklı olmak üzere aynı hostta birden fazla PostgreSQL veri tabanı çalıştırmak mümkündür.
2.2. Backend Process
Backend process (postgres), postgres server process tarafından başlatılan ve istemciden gelen sorgu ve statement'ları yakalayacan process'tir. Postgres istemciyle tek TCP bağlantısı üzerinden iletişim kurar ve bağlantı kesildiğinde process sonlandırılır. Postgres aynı anda yalnızca bir veri tabanı üzerinde operasyonlar gerçekleştirebildiği için bağlantısı sırasında veri tabanını açıkça belirtmek gereklidir.
PostgreSQL'in dahili bağlantı havuzu olmadığı için kısa zamanda sık sık bağlanma/bağlantıyı kesme gibi işlemlerde (web sitesi hizmetleri gibi) backend proces oluşturma maliyeti artacaktır. Bu maliyetin veri tabanı üzerindeki olumsuz etkilerini minimize etmek için pgbouncer ve pgpool-II gibi connection pooling yazılımları önerilir.
2.3. Backgorund Process
Her bir background process'in kendine özel fonksiyonu ve işleri vardır. Genel olarak sunucuda arka planda çalışan yönetimsel işleri gerçekleştiren process'lerdir. ps -ef komutu ile işletim sistemi üzerinde çalışan processleri, ps -ef | grep postgres komutu ile komutu ile postgresle ilgli çalışan background processleri görüntüleyebiliriz. Background process'ler logger, checkpointer, background writer, walwriter, autovacuum launcher, stats collector olarak sıralanabilir.
Background Writer : Shared buffer pool’da bulunan dirty blokların (değiştirilmiş bloklar) memory’den kalıcı diske yazılması işlemini gerçekleştirir.
Checkpointer : Her checkpoint_timeout periodunda ve max_wal_size parametresi aşıldığında checkpoint işlemini gerçekleştirir.
Autovacuum Launcher : Vacuum process’inin otomatik olarak belirli zamanlarda başlatılmasından sorumlu process’tir.
Wal Writer : Wal bufferda bulunan veriyi wal dosyalarına kalıcı olarak yazmakla sorumludur. Wal dosyaları transaction bilgilerini tutan log dosyalardır. Sistemde ani kapanma durumunda veri kaybı oluşmasını önlemek ve veritabanını recover etmek için kullanılan dosyalardır.
Statistic Collector : Verittabanı istatistiklerinin toplanmasını sağlayan processtir.
Logger : Hata mesajlarını log dosyalarına yazan processtir.
Archiving : Archive.log modundayken WAL dosyasını belirtilen dizine kopyalar.s
3. PostgreSQL Memory Yapıları
PostgreSQL'de memory yapıları local ve shared memory area olmak üzere ikiye ayrılır.
3.1. Local Memory Area
Her backend processinin kendi kendi kullanımı için açılan memory alanıdır. Kullanıcıdan gelen sorgulama işlemleri sırasında kullanmak için memoryden allocate edilen alandır. Work_mem, maintenance_work_mem ve temp_buffer olmak üzere 3 temel yapıdan oluşur.
work_mem : Sorgulama işlemleri sırasında join, order by, distinct gibi ifadeler için kullanılan geçici memory alanıdır.
maintenance_work_mem : Reindex, vacuum gibi bakım işlemleri için kullanılan alandır.
temp_buffer : Geçici tabloların tutulduğu bellek alanıdır.
3.2. Shared Memory Area
Tüm processler tarafından paylaşımlı olarak kullanılan memory alandır.Server başlatıldığında postmaster tarafından memoryden allocate edilen alandır. Bu alanda shared buffer pool, wal buffer ve commit log (CLOG) gibi 3 bileşenden oluşur.
shared buffer pool :Daha hızlı okuma yazma işlemi yapılması için verinin tutulduğu memory alanıdır. Veri her seferinde diskten okunup yazılmaz. Bu alanda tutulur ve değiştirilir. Daha sonra background writer devreye girerek değişen blokları data filelara yazar.
wal buffer :Veri kaybını önlemek için kullanılan transaction kayıt dosyalarına wal dosyaları denir. Bu kayıtların dosyalara yazılmadan önce memoryde tutulduğu alana denir.
CLOGCommit log, tutarlılık kontrolü için transactionların durumunun (in progress, committed, aborted) tutulduğu alandır.