Postgresql Veri tabanı Mimarisi ve Çalışma Prensibi
Postgresql Client-Server mimarisinde multi process hizmet veren bir RDBMS yazılımıdır. Birçok veri tabanı mimarisinde olduğu gibi Postgresql mimarisi de Background processler ve memory alanından oluşur. Çoklu process yapısında Postgresql server üzerinde hizmet veren processler bir ana process tarafından yönetilir. Postgresql server üzerinde hizmet veren process türleri;
Postgres server process : Postgresql server üzerinde çalışan main process’tir.
Backend process : Client tarafından gönderilen bütün ve sorgu ve statement’ları yakalayan processlerdir.
Background process : Veri tabanı sunucusunun arka planda gerçekleşen yönetimsel işlemlerini gerçekleştirmekle yükümlü olan processlerdir.
Replication associated processes : Streaming işleminden sorumlu processtir.
Postgres Server Process
Postgresql server’ın yönetimini gerçekleştiren ana process’tir. Ve process hiyerarşisinde en üstte yer alır. Eski sürümlerde postmaster olarak adlandırılmaktaydı. Pg_ctl start komutu sunucuya verildiğinde postgres server process başlatılır ve bu process tarafından shared memory area bellekten allocate edilir. Daha sonra background processler başlatılır, varsa bir replication mimarisi replication processleri başlatılır ve veri tabanı sunucusu kullanıcıdan gelen istekleri dinlemeye başlar. Kullanıcıdan bir bağlantı isteği geldiğinde postgres processi tarafından bir backend processi başlatılır ve kullanıcıdan gelen bütün talepleri bu backend process yakalar.
Postgres server process sunucu üzerinde sadece bir portu dinler. Default olarak 5432 portunu dinler. Buna rağmen birden çok postgresql server aynı sunucu üzerinden hizmet verebilir. Aynı sunucu üzerinde çalışan farklı Server processler farklı port adreslerini dinleyecek şekilde ayarlanmalıdır.
Backend Process(Postges)
Backend process postgres olarak da adlandırılır. Bir backend process postgresql server process tarafından başlatılır ve bağlı kullanıcıdan gelen bütün sorgu taleplerine karşılık verir. Client ile TCP protokolü ile iletişim kurar. Bir kullanıcı bağlantısını kestiği zaman Backend process işlemi de terminate edilir. Eğer veri tabanı sunucusu bir WEB uygulaması gibi bir uygulamaya hizmet veriyor ise ( kısa sürede bir çok kullanıcı bağlanıp işini bitirip disconnect oluyor ise) Connection taleplerine karşılık verme ve bağlantılar için backend process yaratma işlemleri maliyeti arttırır. (Performansa olumsuz etki). Postgresql tarafında native bir connection pooling yapısı olmadığı için pooling işlemi middleware katmanında pgbouncer veya pgpool gibi uygulamaların kullanılması ile gerçekleştirilir.
Background Processes
Veri tabanı sunucusunun arka planda çalışan processleridir.
Background writer : Shared buffer pool’da bulunan dirty blokların diske yazılması işlemini gerçekleştirmekle görevli processtir. Veri tabanları sık erişilen veriyi her seferinde diskten okuma yazma yapmak yerine veriyi memory’de bir alanda tutarak değişiklikleri bu alan üzerinde yapar. Daha sonra belirli olaylar geliştiğinde (checkpoint işlemi, shared buffer pool’un dolması vb) memory’deki veri kalıcı olarak diske yazılır.
Checkpointer : Checkpoint işleminin gerçekleştirilmesinden sorumludur.
Autovacuum launcher : Vacuum prosesinin otomatik olarak belirli zamanlarda tetiklenmesini sağlar. Vacuum işlemi daha sonraki bölümlerde ayrıntılı olarak anlatılmıştır.
WAL writer : WAL bufferda bulunan veriyi WAL dosyalarına kalıcı olarak yazmakla sorumlu işlemdir.
Statistic collector : Veri tabanı istatistiklerinin toplanmasını sağlayan processtir.
Logger : Error mesajlarını log dosyalarına yazan processtir. Archiving : Arşivleme işlemini gerçekleştiren processtir
Postgresql Memory Yapıları
Postgresql veri tabanında memory yapısı Local memory area ve Shared memory area olmak üzere iki temel bileşenden oluştur. Local memory area her backend process’in kendi kullanımı için ayrılan memory alanıdır. Shared memory area ise bütün process’ler tarafından paylaşımlı olarak kullanılan memory alanıdır.
Local Memory area : Her backend process kullanıcıdan gelen sorgulama işlemleri sırasında kullanmak için memory’den bir alan allocate eder. Bu alan local memory area’dır. Kendi içinde temp_buffer, work_mem ve maintenance_work_mem gibi 3 farklı alana ayrılır.
- Work_mem : Sorgulama işlemleri sırasında join, order by, distinct operasyonları için kullanılır.
- Maintenance_work_mem : Reindex, vacuum gibi maintenance operasyonları için kullanılır.
- Temp_buffer : Temporary table’ların tutulduğu alandır.
Shared memory area : Postgresql server başlatıldığında memory’den allocate edilen alandır.
- Shared buffer pool : Verinin daha hızlı okuma yazma işlemi yapmak için tutulduğu alandır. Veri bu alanda değiştirilir ve background writer işlemi ile data file’lara yazılır.
- WAL buffer : Veri kaybının yaşanmaması için kullanılan transaction kayıt dosyalarına WAL dosyası denir(XLOG kaydı olarak da bilinir). WAL kayıtları dosyalara yazılmadan önce memory’de bu alanda tutulur.
- Commit log : Commitlog (CLOG), Concurency(tutarlılık) kontrolünü sağlamak için transactionların durumunu tutar(in progress,commited,aborted).
Veri Tabanı Fiziksel ve Mantıksal Yapıları
Postgresql veri tabanı sunucusu kavramını veri tabanı, memory bileşenleri ve processler oluşturur. Veri tabanı kavramı ise disk üzerinde yer alan veri dosyalarından ibarettir. Veri tabanının fiziksel veri dosyalarının dışında bir de logical bileşenleri bulunur. Logical bileşenler verinin yönetimini kolaylaştıran yapılardır.
Postgresql veri tabanı sunucusunda database cluster kavramı bir postgresql instance’ının hizmet verdiği birden çok veri tabanına karşılık gelmektedir.
Logcial yapılar arasında tablo, index, view vb veri tabanı objeleri bulunur. Bütün veri tabanı objelerinin unique bir OID (object id) değeri bulunur.
Veri tabanı fiziksel yapıları ise disk üzerinde somut olarak bulunan dosyalardır. PGDATA dizinin altında ve alt dizinlerinde bulunan dosyalar veri tabanı fiziksel bileşenlerini oluşturur.
PGDATA dizini altında veri tabanı dosyaları alt dizinler şeklinde OID deperlerine göre ayrılır. PGDATA altında bulunan dosyalar şunlardır;
- PG_VERSION : Postgresql server’ın major versiyon bilgsini tutan dosyadır.
- pg_hba.conf : Veri tabanına bağlanacak client’ların yetkilendirilme işlemlerini tutan dosyadır.
- pg_ident.conf : Postgresql user name mapping işlem bilgilerini tutan dosyadır.
- postgresql.conf : Konfigürasyon parametrelerinin tutulduğu dosyadır.
- postgresql.auto.conf : ALTER SYSTEM komutu ile set edilen konfigürasyon parametrelerinin tutulduğu dosyadır.
- postmaster.opts : Server’ın son başlatıldığı opsiyon bilgilerini tutar.
- Base/ dizinin altında her veri tabanı için bir dizin oluşturulur ve ilgili veri dosyaları bu dizinlerde tutulur.
- Global/ dizini altında cluster bazında bilgileri tutan tablolar’ın dosyaları yer alır. (Örneğin pg_database, pg_control)
- Pg_wal : WAL dosyalarının tutulduğu dizindir. (10. Versiyondan önce pg_xlog )
- Pg_stat : istatistik bilgilerinin tutulduğu dizindir.
Veri tabanları için base dizini altında bir alt dizin oluşturulur. Her tablo ve index bu dizin altında 1GB’dan az olacak şekilde fiziksel dosyalar halinde tutulur. Tablo ve indexler relfilenode denilen bir ID aracılığı ile yönetilir.
- AWS nedir? – Cloud 101 - Mayıs 16, 2024
- Vector Databases - Mayıs 15, 2024
- Data Dünyası Nereye Gidiyor? - Mayıs 8, 2024