Depolama Yapısı
Postgresql mimarisini 3 ana yapı oluşturur. Bunlar; memory, proses ve dopolama
(storage cluster) demiştik. Memory ve prosesleri anlattık. Şimdi sıra storage yani
depolama yapısında.
Cluster terimi daha çok aktif-aktif cluster, aktif-pasif cluster gibi yüksek erişilebilirlik ve
felaket kurtarma çözümlerinde kullanılırken Postgresql’de farklı bir kullanımı vardır.
Postgresql’de database cluster; tek instance tarafından yönetilen veritabanı yığını anlamına gelir. Dosya yapısı açısından düşündüğümüzde tüm verinin saklandığı tek klasördür. Data klasörü (directory) ya da data area da denir.
Postgresql veritabanı apt veya yum ile hazır paketlerden kurulduğunda ;
- Bağımlı paketlerin kurulumu,
- Kodun derlenmesi,
- Postgres kullanıcısının oluşturulması,
- Klasörlerin oluşturulup hakların verilmesi,
- initdb ile database cluster ın oluşturulması,
- systemctl scriptinin oluşturulması,
- instance ın başlatılması adımları otomatik olarak yapılmaktadır.
Database cluster kavramı kaynak koddan kurulum ile daha net anlaşılacaktır.
Kaynak Koddan Postgresql Yazılımının Kurulumu
# Adım 1 Gerekli paketlerin kurulumu apt-get -y install build-essential gcc libreadline-dev zlib1g-dev # Adım 2 Kullanıcının oluşturulması useradd postgres # Adım 3 Klasörlerin oluşturulup hakların verilmesi # Binary için mkdir -p /pg/13.4 chown -R postgres:postgres /pg # Adım 4 Data için mkdir -p /pgdata/13.4 chown postgres:postgres -R /pgdata/13.4 # Adım 5 Kaynak kodların indirilmesi wget https://ftp.postgresql.org/pub/source/v13.4/postgresql-13.4.tar.gz tar xvfz postgresql-13.4.tar.gz # Kurulum opsiyonlarını görmek için /tmp/config.txt e yazdırıyoruz. cd postgresql-13.4 ./configure --help > /tmp/config.txt # Adım 6 ./configure --prefix=/pg/13.4 make make install # Not, Dtrace ve proseslerden trace alabilmek için aşağıdaki parametrelerle konfigure edilmeli. ./configure --enable-debug --enable-dtrace --enable-cassert prefix=/pgdata/13.4 # Adım 7 cd contrib make make install
ls -l /pg/13.4
total 12
bin
include
lib
share
ls -l /pgdata/13.4
total 0
Buraya kadar sadece yazılım kuruldu.
“Software only” kurulum da denilebilir.
/pg/13.4 dizinine binary ve çalıştırılabilir (executable ) dosyalar geldi.
Şu an için /pgdata/13.4 dizini boş.
initdb ile database cluster’ının oluşturulması
# /pgdata/13.4 klasöründe database cluster oluşturulur. su - postgres /pg/13.4/bin/initdb -D /pgdata/13.4 -E unicode # Instance açılır. /pg/13.4/bin/pg_ctl -D /pgdata/13.4 -l pg.log start postgres@srv2:~$ sudo netstat -ntlp tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 2450/postgres
Farklı klasörlerde ve farklı TCP porttan çalıştırma şartı ile istenildiği kadar databasecluster oluşturup instance çalıştırabilirsiniz, burada limit donanımdır. “-l” ile log dosyası belirtilir. Örnekte, instance açılırken logları pg.log yazıyor olacak.
postgres@srv2:~$ ls -l /pgdata/13.4/ base pg_serial global pg_snapshots log pg_stat pg_commit_ts pg_stat_tmp pg_dynshmem pg_subtrans pg_hba.conf pg_tblspc pg_ident.conf pg_twophase pg.log PG_VERSION pg_logical pg_wal pg_multixact pg_xact pg_notify postgresql.auto.conf
srv2 makinesinde kaynak koddan kurulum yapıldı. Binary ve database cluster dizinlerine biz karar verdik.
Postgresql binary ($PGHOME): /pg/13.4/
Database cluster : /pgdata/13.4/
Konfigurasyon dosyaları : /pgdata/13.4/
Kurulum apt ile yapıldığında ise pathler vs. default ayarlarla gelir.
Örnek olarak depsql01 makinesindeki cluster dizinine bakalım.
Database cluster : /var/lib/postgresql/13/main
Konfigurasyon dosyaları : /etc/postgresql/13/main

- Adımda oid2name ile veritabanı obje id lerini görüyoruz.
- Adımda PGDATA dizininin içeriğini görüyoruz.
- Adımda ise veritabanı obje id’ lerine karşılık gelen klasörleri görüyoruz.
Cluster içeriği

Cluster İçerisindeki Dosyalar

Block Size
root@srv2:~# dumpe2fs /dev/sda1 | grep -i 'block size'
dumpe2fs 1.44.5 (15-Dec-2018)
Block size: 4096
root@srv2:~# echo A > test.txt
root@srv2:~# du -sh test.txt
4.0K test.txt
postgres=# show block_size;
block_size
------------
8192 -----> 8KB
8192 -----> 8KB
İşletim sistemi blok boyutu (operating system block size) İşletim sistemleri veriyi yazıp okuyabilmek için diski bloklara böler. Blok boyutu disk formatlanırken belirlenir. (1024 bytes (1K), 2K, 4K, 8K, 16K…) Örnekte görüleceği üzere işletim sisteminin blok boyutu (4096 byte) 4KB. test.txt dosyasına bir karakter yani byte’lık veri girilmesine rağmen 4KB’lık yer kaplar.
Database blok boyutu (block size) İşletim sistemi blok boyutu kadar ya da katları olabilir. Örnekte, işletim sisteminin blok boyutu 4KB veritabanın blok boyutu da 4KB, 8KB, 16KB gibi 2’ nin kuvvetleri olabilir. Veritabanı blok boyutu (database block size, block_size) default değeri 8KB’dir. Derleme sırasında –with-blocksize parametresi ile değiştirmek mümkündür. Tablolardaki satırların veritabanı blok boyutunu aşmaması performans artırıcı bir unsurdur. Genel olarak OLTP sistemler için küçük blok boyutu performans artışı sağlarken OLP yani raporlama yapılan veritabanlarında büyük blok boyutları performansa artı etki yapar.
CREATE TABLE ekip(isim varchar(30), sirket varchar(50), per_no serial);
INSERT INTO ekip(isim,sirket) VALUES('Mehmed','Dataera');
testdb=# select * from ekip ;
isim | sirket | per_no
--------+---------+--------
Mehmed | Dataera | 1
(1 row)
testdb=# select pg_relation_filepath('ekip') ;
pg_relation_filepath
----------------------
base/16384/16403 ---> ekip tablosunun yazıldığı veri dosyası
(1 row)
testdb=# \! du -sh /pgdata/13.4/base/16384/16403
8.0K /pgdata/13.4/base/16384/16403
komutu ile testdb veritabanına bağlanıp ekip adında bir tablo oluşturuyoruz.psql -d testdb
Bu tabloya 14 karakterlik veri girişi yapıyoruz.
Ekip tablosunun işletim sistemindeki yerini buluyoruz.
En son çalıştırdığımız komut ile de işletim sistemi üzerinde bu tablosunun ne kadar yer kapladığını görüyoruz.
14 karakter yani 14 byte veri girişi yapılmasına rağmen 8KB yani 8192 byte’ lık alan
kapladığını görüyoruz.

Ekip tablosu, 16403 isimli dosyaya yazılmaktadır. Veri girişi oldukça bu dosya büyümeye devam eder.
POSTGRESQL CLUSTER

Soldaki resimde default gelen veritabanları ile birlikte kullanıcıların oluşturduğu bir adet veritabanı, default tablespace içerisinde yer almaktadır.
İkinci resimde ise kullanıcıların oluşturdukları veritabanları gene kullanıcıların
oluşturduğu erp_tbs adlı tablespace içerisinde yer almaktadır.
Veritabanlarını oluştururken tablespace belirtilmezse default tablespace olan
pg_default içerisinde oluşturur.
Bağlı olunan veritabanında tablo, index vb. objeler oluşturulurken tablespace
belirtilmezse veritabanının bulunduğu tablespace içerisinde oluşturulur.
Mantıksal olarak tablespace seçilirken fiziksel olarak bu tablespace bizim belirlediğimiz bir diske yazmaktadır. Mantıksal ve fiziksel yapının ayrı olması yönetimsel esneklik sağlar. Her hangi bir nedenden tablespace’i başka bir diske aldığımızda yazılım bundan etkilenmez.
