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


  1. Adımda oid2name ile veritabanı obje id lerini görüyoruz.
  2. Adımda PGDATA dizininin içeriğini görüyoruz.
  3. 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

psql -d testdb komutu ile testdb veritabanına bağlanıp ekip adında bir tablo oluşturuyoruz.
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.

Kategori seçin...