POSTGRESQL MİMARİSİ

Muhammet Günay
7 min readAug 5, 2023

--

Merhabalar,
PostgreSQL nedir, postgreSQL’in tarihçesi, nerelerde kullanıldığı ve PostgreSQL mimarisi hakkında sizlere bilgi veriyor olacağım.

PostgreSQL Nedir?

PostgreSQL, RDBMS modeli kullanan ve SQL sorgulama dilini destekleyen bir VTYS (Veritabanı Yönetim Sistemi)’dir.
Oracle’la benzerliği nedeniyle yüksek lisans maliyetlerinden kaçınmak, aynı işlevi aynı performansla yapmak gibi nedenlerden dolayı tercih edilir. Çünkü PostgreSQL ücretsiz ve açık kaynak kodlu bir yazılımdır. PostgreSQL aynı zamanda iyi performans veren, güvenli ve geniş özellikleri olan bir VTYS’dir. PostgreSQL’den türetilmiş popüler ticari veri yönetim ürünler geliştirilmiş olup bunlardan lisans ücreti alınmaktadır. Örneğin;
EnterpriseDB: PostgreSQL tabanlı ticari bir veritabanı yönetim sistemidir. Oracle ve Microsoft SQL Server’a alternatif olarak kullanılabilir.

PostgreSQL Tarihi

- 1986 yılında Kaliforniya Üniversitesi Berkeley’de Ingres projesinin bir parçası olarak geliştirilmeye başlandı.
-İlk sürümü 1989 yılında piyasaya sürüldü.
-1994 yılında Postgres95 adıyla yeni bir sürüm yayınlandı ve SQL dili geliştirilerek POSTQUEL ile değiştirildi.
- 1997 yılında ilk açık kaynak sürümü yayınlandı ve Postgre95 adı PostgreSQL olarak değiştirildi.
-Birçok sürüm güncellemesi ve özellik eklemesiyle günümüze kadar geliştirildi.
-Günümüzde hala aktif bir şekilde geliştirilmeye devam ediyor ve yaygın şekilde kullanılıyor.

PostgreSQL’in Bazı Avantajları;

-Ekonomiktir, lisans ücreti yoktur fakat postgresql den türetilmiş ticari ürünler bulunmaktadır.
-PostgreSQL istenildiği Kadar sunucuya kurabilir ve dağıtımı yapılabilir.
-Yönetimi, yedeklemesi, bakımı ve izlemesi kolaydır.
-Yüksek güvenliklidir. Yüksek erişilebilirliklidir.
- ACID tam uyumludur.
-Birçok işletim sistemi tarafından desteklenmektedir.
-Hata mesajları ve log sistemi açıktır, anlaşılırdır.
-Aktif bir topluluk tarafından desteklenmektedir.Tüm dünyadan geliştiricisi bulunur.

PostgreSQL’in Mimarisi
Postgresql Client-Server mimarisinde multi process hizmet veren bir RDBMS(Relational Database Management System-ilişkisel veritabanı yönetim sistemi) yazılımıdır.

Her VTYS de olduğu gibi postgresql de memory alanı background process ve diskler üzerinde bulunan fiziksel dosyalardan oluşur.

  • Memory alanı
  • Background process
  • Veritabanı fiziksel dosyaları.

Postgresql Memory Yapıları

Postgresql memory yapısı Local memory area ve Shared memory area olmak ikiye ayrılır.

Not: Veri tabanı yönetim sistemlerinde (VTYS) verilerin diskten önce bellek (memory) alanında işlenmesi ve sonuçlarının elde edilmesi, performans açısından önemlidir.

Shared memory area:

bütün process’ler tarafından paylaşımlı olarak kullanılan memory alanıdır

Shared buffer pool: Veritabanı sorguları çalıştırıldığında, sıkça erişilen veriler bu alanda saklanır. Bu sayede aynı veriye tekrar tekrar diskten erişmek yerine bellekten hızlı bir şekilde erişilir. Bir transaction (İnsert, delete ve update işlemleri gerçekleştiğinde, ilgili veriler önce shared bufferda ilgili bloklarda güncellenir. Değişen bu blocklara dirty block denir. Dirty block, değiştirilmiş ancak henüz disk üzerine yazılmamış veri bloklarını ifade eder.

WAL (Write-Ahead Logging) buffer: Transaction(işlem) kayıt dosyalarıdır. Değişiklikler shared bufferdaki “dirty block”larda yapılırken, aynı değişiklikler aynı zamanda WAL (Write-Ahead Logging) bufferında da kaydedilir. WAL dosyası (XLOG kaydı olarak da bilinir). Belirli bir checkpoint işlemine göre diske yazılır ve diske yazıldıktan sonra temizlenirler. Özellikle yüksek performans gerektiren uygulamalarda, WAL buffer’ın boyutunun arttırılması veritabanı performansını arttırabilir. Ancak WAL buffer boyutu ayarlaması yapılırken dikkatli olunmalı ve sistem gereksinimleri dikkate alınmalıdır.

Commit log(CLOG): Bir transaction’ın commit veya rollback edilip edilmediğini kontrol eder. Tutarlılık kontrolünü sağlamak için işlemlerin durum bilgisini tutar(in progress (devam eden), commited, aborted).

Temp_buffer : Temporary table’ların tutulduğu alandır. Varsayılan olarak 8MB’dır.

Local Memory area:

PostgreSQL, her bir kullanıcının veya oturumun (session) sorgularını işlerken her biri için ayrılan bellek alanına “Local Memory Area” denir. Kendi içinde temp_buffer, work_mem ve maintenance_work_mem gibi 3 farklı alana ayrılır.

Work_mem: PostgreSQL sorgularının geçici bellek ihtiyacını kontrol etmek ve büyük veri işlemlerini daha etkili hale getirmek için kullanılır. Özellikle sorgu işlemleri sırasında join, order by ve distinct operasyonları da bu bellek alanından faydalanır. Büyük veri kümeleri ile çalışırken, bu ayarın artırılması sorgu performansını artırabilir. Varsayılan değeri genellikle 4MB’dır.
Maintenance_work_mem: bakım (maintenance) işlemleri sırasında kullanılan bellek miktarını kontrol eder. Reindex, vacuum gibi maintenance(bakım) operasyonları için kullanılır. Varsayılan değer 64MB’dır

Temp_buffer: Temporary table’ların tutulduğu alandır. temporary verilerin bellekte ne kadar yer kaplayacağını kontrol eder.

Postgresql process türleri; Background Processes:

arka planda çalışan processlerdir. 7 utility process’ten oluşur. Ve postgresql başladığı andan itibaren otomatik çalışırlar.
İşletim sisteminde ps -ef | grep postgres komutu çalıştırıldığında background processleri görüntüleyebiliriz.

Background writer: Shared buffer pool’da bulunan dirty blokların diske yazma işlemi ile görevli processtir. belirli olaylar geliştiğinde (checkpoint işlemi, shared buffer pool’un dolması vb) memory’deki veri kalıcı olarak diske yazılır.
Wal writer: WAL bufferda bulunan veriyi WAL kayıt dosyalarına kalıcı olarak yazar. Bir checkpoint işlemi gerçekleştiğinde veri dosyalarındaki değişiklikler “WAL” dosyalarına kaydedilir
Checkpointer: Checkpoint işleminin gerçekleşmesinden sorumludur.
Autovacuum launcher:
Veritabanındaki veri değişikliklerini izlemek, boş alanları geri kazanmak ve veritabanının genel performansını optimize etmek gibi işlemler yapar. Gereksiz verileri temizler. Otomatik olarak çalışan bir arka plan işlemidir.
Logging Collector: SQL hataları, veritabanı hatalarını toplayıp log file’lara yazar.
Stats collector: Veri tabanı istatistiklerinin toplayan processtir.
Archiver Process: Archive_mode = on olarak set edilirse, wal kayıtlarını arşivler. Default olarak off durumdadır.

Vacuum nedir:

Postgresql’de her update işleminde aslında bir insert gerçekleşir. Veya delete işlemlerinde o satır fiziksel olarak silinmez. Sadece invisible (görünmez) duruma gelir. Bunlara dirty tuple deriz. Bu gereksiz veriler zamanla disk alanını doldurabilir ve performans sorunlarına neden olabilir. İşte burada autovacuum özelliği devreye girer. Autovacuum işlemi, veritabanındaki dirty tuple (kirli veri parçaları) görünmez verileri temizler.

Autovacuum Launcher’ın bazı önemli parametreleri:

  • Autovacuum: Autovacuum işlemlerinin açık mı yoksa kapalı mı olduğunu belirler. Bu parametre değeri “on” ya da “off” olabilir.
  • autovacuum_vacuum_scale_factor: Autovacuum işlemi tetiklenmesi için Tablodaki satırların yüzde kaçının silinmiş ya da güncellenmiş olduğunu belirler. Varsayılan değeri 0.2'dir, yani bir tablodaki satırların yüzde 20'si silinmiş ya da güncellenmişse Autovacuum işlemi tetiklenir.
  • autovacuum_analyze_scale_factor: Analiz işlemi gerçekleştirilmesi için Tablodaki satırların yüzde kaçının değiştiğine bakar. Varsayılan değeri 0.1'dir, bir tablodaki satırların yüzde 10'u değiştiğinde bir analiz işlemi gerçekleştirilir.
  • autovacuum_vacuum_cost_limit: autovacuum işleminin yürütülmesi için kullanılacak maksimum kaynak maliyetini belirler. Varsayılan değeri 200'dür. Yani autovacuum_vacuum_cost_limit maliyeti 200'ü geçtiğinde durur.
  • autovacuum_max_workers: Eşzamanlı olarak çalışan autovacuum işlemlerinin maksimum sayısını belirler. Varsayılan değeri 3'tür.

postgresql.conf Dosyası: Ana yapılandırma dosyasıdır. Parametreleri burada değiştirebiliriz. Değişikliklerin etkili olması için PostgreSQL servisi yeniden başlatılması gerekir.

ALTER SYSTEM SET komutu kullanarak, yapılandırma dosyasındaki ayarları değiştirebiliriz.

ALTER SYSTEM SET autovacuum_max_workers = 6;
ALTER SYSTEM SET vacuum_cost_limit = 300;

SET Komutu: Bir parametrenin değeri geçici olarak değiştirilebilir

SET max_connections = 200;

Bu değişiklikler sadece mevcut oturumda geçerli olacaktır ve PostgreSQL servisi yeniden başlatıldığında kaybolacaktır.

Postgres server process: PostgreSQL veritabanı sisteminde çalışan ana işlemdir. Bazı eski sürümlerde “postmaster” olarak da adlandırılır. Pg_ctl start ile PostgreSQL sunucusu başlatıldığında, ilk önce postmaster başlatılır. Shared Memory Area ‘dan bellek allocate eder. Postgres-postmaster sunucu üzerinde Default olarak 5432 portunu dinler. Kullanıcılardan gelen connection istekleri, Postgres tarafından kabul edilir ve ardından yeni bir backend process oluşturulur. Bu backend processler, kullanıcının sorgularını ve diğer isteklerini işlemek için Postgres server process ile işbirliği yaparlar.

Backend process: Kullanıcı tarafından gönderilen sorgu ve statement’ları yakalayan processlerdir.
Kullanıcı herhangi bir sorgu gönderdiğinde, PostgreSQL server yeni bir backend process oluşturur ve bu process kullanıcının sorgusunu işlemeye başlar. Sorguyu işleyip sonucu kullanıcıya geri döndürür ve bağlantı sonlandığında veya sonlandırıldığında kapatılır.

Sorgu çalışırken ihtiyaç olan local memory alanını aşağıdaki 3 parametre ile kontrol edebiliriz.
+ work_mem:
+ maintananence_work_mem:
+ temp_buffer:

Replication associated processes veri replikasyonunu sağlamak için kullanılan arka plan işlemleridir.

Replication: Bir standby veritabanı ile primary veritabanı arasındaki veri transfer işlemini sağlar. Log dosyası (WAL) kullanır ve ardından standby sunucusunda bu değişiklikleri yeniden oluşturur.

Veri Tabanı Fiziksel ve Mantıksal Yapıları Logical yapılar;

Logical bileşenler verinin yönetimini kolaylaştıran yapılardır. Tablo, index, view vb veri tabanı objeleridir. Bütün veri tabanı objelerinin unique bir OID (object id) değeri bulunur.

Veri tabanı fiziksel yapılar;

Verilerin disk üzerinde nasıl saklanacağını ve erişilebileceğini belirler. Fiziksel yapılar (data dosyaları, log dosyaları, WAL dosyaları vb.) 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 değerlerine göre ayrılır.

PGDATA altında bulunan dosyalar;

PG_VERSION: Postgresql server’ın ana versiyon bilgisini tutan dosyadır.

pg_hba.conf (Host-Based Authentication Configuration): kimlik doğrulama ve erişim kontrolü ayarlarını içeren bir yapılandırma dosyasıdır. pg_hba.conf dosyası, kullanıcıların hangi IP adreslerinden, hangi veritabanlarına ve hangi kimlik bilgileriyle bağlanabileceğini belirleyen satırlar içerir.

pg_ident.conf: Bu dosya, kullanıcıların kimlik bilgilerini belirlemek için kullanılır. pg_ident.conf dosyası PostgreSQL veritabanında kimlik doğrulama ve erişim yönetimi için kullanıcı adlarını işletim sistemi kullanıcı adlarıyla ilişkilendirmek üzere kullanılır.

postgresql.conf: konfigürasyon parametrelerinin tutulduğu dosyadır. Bu dosya, veritabanının performansını, güvenliğini, bellek yönetimini, bağlantı ayarlarını ve diğer birçok özelliği belirlemek için kullanılır.

İşte “postgresql.conf” dosyasında yapılandırabileceğimiz bazı önemli parametre örnekleri:

  • listen_addresses: PostgreSQL sunucusunun hangi IP adreslerini dinleyeceğini belirler.
  • port: PostgreSQL sunucusunun hangi portu dinleyeceğini belirler.
  • max_connections: Aynı anda kaç istemci bağlantısına izin verileceğini belirler.
  • shared_buffers: shared buffer alanının boyutunu belirler.
  • work_mem: Sorgu işlemleri için ayrılan geçici bellek miktarını belirler.
  • maintenance_work_mem: Bakım işlemleri sırasında kullanılan geçici bellek miktarını belirler.
  • effective_cache_size: Tahmin edilen toplam önbellek boyutunu belirler.
  • timezone: Veritabanının kullanacağı varsayılan zaman dilimini belirler.

postgresql.auto.conf: ALTER SYSTEM komutu ile set edilen konfigürasyon parametrelerinin tutulduğu dosyadır.

postmaster.opts: PostgreSQL 12 sürümüyle birlikte, postmaster.opts dosyası artık kullanılmıyor ve başlangıç parametreleri postgresql.conf dosyasında tanımlanıyor. Bu dosya, son olarak PostgreSQL Sunucusu’nun hangi seçeneklerle başlatıldığını tutar ve pg_ctl aracı tarafından kullanılır.

Base/ dizini, veritabanlarının fiziksel olarak saklandığı dizindir. Her bir veritabanı için Base/ dizini altında ayrı 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 ve pg_control gibi dosyalar burada yer alır.

pg_database: T üm veritabanlarının kaydını tutar. Bu dosya, veritabanlarının isimleri, sahipleri, karakter setleri ve diğer özellikleri gibi bilgileri içerir. Veri tabanlarıyla ilgili işlemler yapılırken (örneğin, yeni bir veritabanı oluşturma) bu dosya güncellenir.

Pg_wal: WAL dosyalarının tutulduğu dizindir.

Pg_stat: istatistik bilgilerinin tutulduğu dizindir.

Database cluster:

Postgresql veri tabanı sunucusunda database cluster kavramı bir postgresql instance’ının hizmet verdiği birden çok veri tabanına karşılık gelmektedir.

PostgreSQL Mimarisi hakkında olabildiğince geniş ve ayrıntılı bilgi vermeye çalıştım. Umarım Faydalı olmuştur. I hope it helped you! If you need further help, feel free to reach out to me on linkedin to contact me.

Best regards!

--

--