Red Hat Enterprise, CentOS, Scientific or Oracle için Postgresql kurulumu
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;