Red Hat Enterprise, CentOS, Scientific or Oracle için Postgresql kurulumu

Servetbulut
5 min readNov 18, 2020

Merhaba,

Bu yazımızda Red Hat Enterprise, CentOS, Scientific ve Oracle serverların 6,7,8 versiyonları için, postgresql 10,11,12,13 editionlarında benzer şekilde kurabileceğiniz bir yazı paylaşıyorum.Lınux bilgisi çok az olan bir kişide bu kurulumu yapabilecek şekilde basit yazdım.

terminali açıyoruz.root usera geçiş yapıp ve ‘cd’ ile en başa dönüyoruz.

sudo yum -y update
sudo systemctl reboot

Yukarıdaki kod ilk sistemi update ediyoruz ve update bittikten sonra sistemi yeniden başlatıyoruz.

Sitem yeniden başladıktan sonra root usera geçiş yapıyoruz.Depo postgresql servislerinin bulunduğu bir dosya, depoyu yüklemek için(root ile devam ediyoruz);

sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

açık postgresql modül varsa disable etmek için(root ile devam ediyoruz);

sudo dnf -qy module disable postgresql

postgresql kurmak için(root ile devam ediyoruz);

sudo dnf install -y postgresql13-server

başka paketleri yüklemek için bunu da kurmamız gerekiyor.(root ile devam ediyoruz)

dnf install postgresql13-server postgresql13-contrib

daha sonra (root ile devam ediyoruz);

sudo /usr/pgsql-13/bin/postgresql-13-setup

İnit db tüm dbleri etkileyen önemli değişiklerin olduğu bir db.
Ve init db de değişiklik yapmak istersek user değiştiriyoruz.(bundan sonra postgres userla devam edicez);

su - postgres

initdb de yapılabileceğimiz değişiklikleri görmek için(postgres userla devam ediyoruz);

/usr/pgsql-13/bin/initdb --help

datachecksum pageler üzerinde yapılan bir data kontrol parametresidir.
kesinlikle yapılması gerekenlerden datachecksum değerini aktif etmek için(postgres userla devam ediyoruz);

export PGSETUP_INITDB_OPTIONS='-k'

tekrardan root usera geçiş yapıyoruz.(root olarak devam ediyoruz)

logout

daha sonra tekraradan initdb oluşturuyoruz.(root olarak devam ediyoruz)

sudo /usr/pgsql-13/bin/postgresql-13-setup initdb

postgresql enable etmek için(root olarak devam ediyoruz);

sudo systemctl enable --now postgresql-13

daha sonra tekrar postgresql usera bağlanıyoruz;(postgres userla devam ediyoruz)

su - postgres

ve sonra aşağıdaki kodu yazıyoruz ve veritabanına bağlanıyoruz;

psql

ve postgresql e bağlanmış olduk. çıkmak için aşağıdaki kodu kullanıyoruz.

\q

çıktıktan sonra burada postgresql.conf dosyasını açıp parametreleri ayarlamak için;

nano postgresql.conf
vi postgresql.conf (alternatif)

Not: Yaptığımız değişiklikleri aktif etmek için başındaki ‘#’ karakterlerini silmemiz gerekiyor.

ve buradan açıklama satırına alınmış #listen_addresses = ‘localhost’ adresini açıklamadan çıkarıp localhost yerine ‘*’ yazarak diğer yerlerden de erişmek için sunucunun ip’si ni artık kullanılabilir hale getiriyoruz(ama dışarı değil sadece sistem içinden). Bu yapılan değişiklikten sonra restart yapmamız gerekiyor açıklama kısmında da görünüyor zaten.

listen_addresses = '*'

ve yine hemen altında bulunan max_connections 300 yapıyoruz ve max connection sayısını belirlemiş oluyoruz.Tahmini connection
sayısına göre CPU ve RAM ile orantılı olarak arttırabiliriz test olduğu için ben şuanlık 300 seçtim.;

max_connections = 300

superuser_reserved_connections kısmınıda enable ediyoruz. bu ne demek.
bi üstteki max_connections değerinde her zaman 3 kullanıcı superuser ayır demektir.Olası felaket anında müdahale için

superuser_reserved_connections = 3

Ve yine TCP alakalı aşağıdaki 4 parametreyi de enable ediyoruz.

tcp_keepalives_idle = 0   
tcp_keepalives_interval = 0
tcp_keepalives_count = 0
tcp_user_timeout = 0

en önemlilerinde shared_buffers burası tüm querylerin çalıştığı kısım o yüzden değerlerinin çok iyi ayarlanması gerekiyor.

RAM<8GB %50 Verilebilir.
8GB<RAM<=16GB 4GB verilebilir.
32GB<=RAM 8GB Verilebilir.

Yine takip edilmelidir ondan sonra daha iyi karar verilip değiştirilebilir.Genelde read ağırlıklı Dblerde biraz daha yüksek tutulabilir. Test ortamı olduğu için ve 2GB memory den dolayı;

shared_buffers = 500MB

Yine Read ağırlıklı DBlerde huge_pages de enable edilebilir performasn etkisi olan önemli bir parametre;

huge_pages = try
ve yine;
max_prepared_transactions = 0

ayrıca querylerde kallanılan order,group by ve merge işlemleri için work_mem enable ediyoruz. Bu kadar yeterlidir ama yine gerekli ise takip edilip arttırılabilir;

work_mem = 4MB

maintenance işlemleri için(index,Alter,drop,colunm ekleme,PK ekleme vb.) 1GB yeterlidir. Bu işlemlerde çok çok yavaşlık yaşanıyorsa arttırılabilir.

maintenance_work_mem = 1GByine aşagıdakileri enable ediyoruz.
temp_file_limit = -1

bir queryden arta kalanları temizlemek için kullanılan işleme vacuum işlemi denir ve parametreleri.

vacuum_cost_delay = 0                   
vacuum_cost_page_hit = 1
vacuum_cost_page_miss = 10
vacuum_cost_page_dirty = 20
vacuum_cost_limit = 200

ve yine önemli parametrelerden birisi önerilen parametrelere göre ayarlanmıştır bir querynin çağrılma süresi 10 ve katları olacak şekilde ayarlanmalıdır;

bgwriter_delay = 100ms

Querylerden kalanları temizlemek için kullanılır ve query performasına çok büyük etkisi vardır.çok önemli RAm a göre daha da yüksek tutulabilir.

bgwriter_lru_maxpages = 10000
bgwriter_lru_maxpages destek olması için 4.0 yapılması uygundur
bgwriter_lru_multiplier = 4.0
bgwriter_flush_after = 512kB

effective_io_concurrency diskin performansına göre 1–1000 arası(ssd: 100 verilebilir).Ben normal disk kullandığım için;

effective_io_concurrency = 1 

max_worker_processes arkaplanda çalışan process için cpu değeri.Ve cpu değerine göre yüksek verilmesi gerekir.

max_worker_processes = 8

MAintance işlemleri için 2 cpu ve paralel işlemleri birleştirken için de 2 cpu kullan demek

max_parallel_maintenance_workers = 2   
max_parallel_workers_per_gather = 2
max_parallel_workers = 8

diske yazılan değer ile ram her zaman senkronize olması ve data kaybının önüne geçmek için bu parametreyi de enable yapıyoruz.

fsync = on

diğer önemli bir parametre olan full_page_writes bunu da enable ediyoruz.
Bu parametre ile pagelerin son committen sonra bir kopyası pg_wa’e yazılır.
pagelerde oluşan herhangi bir bozulma yada veri kaybında geriye dönmek içi kullanılabilir. O yüzden önemli bir parametre.

full_page_writes = on

bunuda enable ediyoruz full-page lerin compresi için;

wal_compression = off

yazma işlemlerinin çokluğuna göre verilebilecek bir parametre (8MB -16MB-max 64MB )

wal_buffers =16MB

Yine sunucunun read-write durumuna göre checkpoint süresi sadece read ise 1 güne bile çıkarılabilir.

checkpoint_timeout = 15min               # aralık 30s-1d

Wal diskine göre log dosyaların boyutlarını, bu parametler ile ayarlıyoruz.

max_wal_size = 5GB
min_wal_size = 500MB

(0.5,0.7,0.9)Checkpoint i yukarıda verdiğimiz zaman göre ters orantılı bir değer. Yani 0.5 verdiğiniz zaman hızlı yapar ama IO arttırır 0.9 verildiğinde uzun sürer IO daha az tüketir. Orta değeri veriyorum.

checkpoint_completion_target = 0.7

İndex e bakarak giderse query’nin maliyet, rastgele giderse query’nin maliyetini aşağıdaki parametre ile belirliyoruz.

seq_page_cost = 1.0                   
random_page_cost = 2.0

RAM in %50 sini vereceğimiz diğer öenmli bir parametre benim RAM 2GB olduğu için;

effective_cache_size = 1GB

Postgresql defalut olarak logları günlük olarak tutar bunu da postgresql’in
kendi conf dosyasını açtığımızda görüyoruz.(%a sistem de bugünün günü anlamına gelir.)Sistem tarih formatını görmek içinde;

log_filename = 'postgresql-%a.log'      # günlük
log_filename = 'postgresql-%b.log' # aylık
log_filename = 'postgresql-%m-%d.log' # yıllık

postgresql in query optimizasyon için açmamız gereken önemli bir parametre bu parametre ile query süresi belirlediğimiz süreyi geçen queryleri loglayabiliriz. ben 1 dk seçtim.

log_min_duration_statement = 60000ms

her checkpointten sonra logları kaydetmek için bunu aktif etmeliyiz
Önemli bir parametre

log_checkpoints = on

logların formatını da belirleyebiliyoruz.Best practice olarak;

log_line_prefix = ‘< user=%u db=%d host=%h pid=%p time=%m app=%a > ‘

waitleri loglamamız için log_lock_waits parametresini de on yapıyoruz;

log_lock_waits = on

postgresql deki querylerin içinde ki order by ifadeleri yukarıda
ayarladığımız work_mem de ki memory değerine göre sıralama yapar.
Eğer bu data work_mem geçerse bu order by işlem disk e alınır.
Böyle querylerin optimize edilmesi gerekir. bunları takip etmek
için;

log_temp_files = 0

ve ddl işlemlerini takip etmek için;

log_statement = 'ddl'

postgresql instance name vermek istiyorsak(verimesi önerilir.)

cluster_name = ‘pgsrvt13’

ve hemen altında bulunan önemli bu parametreyi de açıyoruz.

update_process_title = on

yapılan IO ölçmemiz için;

track_io_timing = on

Function ların da çalışma istatistiklerini tutmak için;

track_functions = all 

logu tutulacak querynin karakter uzunluğu için;

track_activity_query_size = 4096

aşağıdaki parametre ile logların nasıl kaydedileceğini belirtiyoruz.
csv olarak mı yokda direk .log olarak mı belirleyebiliriz.
default olan kalabilir.

log_destination=’stderr’

ve yine aşağıdaki parametreleri açıyoruz;

autovacuum = on 
log_autovacuum_min_duration = 0
autovacuum_max_workers = 3 # aynı anda çalışan max worker sayısı
autovacuum_naptime = 1min

sonra bunları kaydedip çıkıyoruz.şimdi tekrar root user geçiyoruz;

logout

Yaptığımız değişikliklerin çoğu servis restart gerektir ve postgresql servisimizi restart ediyoruz.

systemctl restart postgresql-13

NOTLAR:

postgres de logları okumak için cd /var/lib/pgsql/13/data/log klasörüne girdikten sonra(postgres user);
tail -f postgresql-Sat.log
\x -> psql user dayken Queryleri düzgün bir şekilde kolon kolon ayırmak için;\c db_name -> postgresql de db seçmek için,değiştirmek için;\l -> dbleri listelemek için;

--

--