Postgresql reposunu ekleyelim.
# dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# dnf module list postgresql
Last metadata expiration check: 0:01:54 ago on Thu 24 Oct 2024 07:11:35 AM UTC.
Rocky Linux 8 - AppStream
Name Stream Profiles Summary
postgresql 9.6 client, server [d] PostgreSQL server and client module
postgresql 10 [d][e] client, server [d] PostgreSQL server and client module
postgresql 12 client, server [d] PostgreSQL server and client module
postgresql 13 client, server [d] PostgreSQL server and client module
postgresql 15 client, server [d] PostgreSQL server and client module
postgresql 16 client, server [d] PostgreSQL server and client module
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
# dnf -qy module disable postgresql
Şimdi paketlerimizi indirebiliriz
# dnf install -y postgresql16 postgresql16-server postgresql16-contrib
İndirilen paketleri kontrol edelim
# rpm -qa| grep postgres
postgresql16-16.4-1PGDG.rhel8.x86_64
postgresql16-contrib-16.4-1PGDG.rhel8.x86_64
postgresql16-server-16.4-1PGDG.rhel8.x86_64
postgresql16-libs-16.4-1PGDG.rhel8.x86_64
hosts dosyamızı ayarlayalım
# echo 150.150.100.11 postgrend >> /etc/hosts
Database dosyalarımız için klasörümüzü oluşturalım ve yetkilendirmesini yapalım ayrııca postgres userına parola oluşturalım.
# mkdir -p /database/data
# chown postgres:postgres -R /database/
# passwd postgres
# su - postgres
postgres .bash_profile dosyasını düzenleyelim.
PGDATA=/database/data
export PGDATA
PATH=$PATH:/usr/pgsql-16/bin
export PATH
Postgresql servislerini çlıştırmadan önce data dosyasının yerini postgresql servis dosyasında environment PGDATA kısmını aşağıdaki gibi değiştirelim. Bu işlemi root ile yapmalıyız
# vi /usr/lib/systemd/system/postgresql-16.service
Environment=PGDATA=/database/data/
Şimdi postgres OS user ile initidb komutunu çalıştırarak database servislerini initialize ediyoruz.
$ initdb
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
fixing permissions on existing directory /database/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
pg_ctl -D /database/data -l logfile start
initialize sonrası komut satırında pg_Ctl ile çalıştırma komutunu bizim için yazdı postgresql onu alıp çalıştırıyoruz ve postgresql servisleri ağaya kalkıyor
$ pg_ctl -D /database/data -l logfile start
waiting for server to start.... done
server started
Artık çalışan bir database elimizde mevcut bundan sonrası configürasyon ayarları ile ilgili, Postgresql configürasyonu ve detaylarını aşağıdaki blog yazısını ve serisini takip ederek bilgi edinebilirsiniz.
- admin
- Ekim 28, 2024
PostgreSQL Intstallation on RHEL8 Or 9
İşletim sistemi Rocky Linux 8 veya 9 için aşağıdaki komutlar çalışacaktır. PostgreSQL 16 versiyonu için installation ve config ayarlarını veriyor…
POSTGRESQL NEDİR ?
- Mayıs 26, 2020
POSTGRESQL MİMARİSİ VE TEMEL KULLANICI İŞLEMLERİ
- Şubat 17, 2021
POSTGRESQL-13 INSTALLATION (OL-7, Centos-7, RedHat-7)
- Şubat 17, 2021
POSTGRESQL STREAM REPLICATION & CASCADE REPLICATION
- Kasım 3, 2021
Detaylı bilgiyi yukarıdan edinmenizi tavsiye ederim ancak yine burada da , postgresql veritabanına bağlantı yapabilmek adına bazı ayarları yapıyor olacağız. Öncelikle , Database client bağlantıları için izinleri girebildiğimiz pg_hba.conf dosyasını düzenleyelim. Bu dosya network üzerinden postgresql suncusuna client ve replica sunucularının bağlantı izinlerinin yapıldığı hatta , şifre metotlarının ayarlandığı ssl ve LDAP gibi bir ayarlama yapacaksak yine bu dosya üzerinden db seviyesinde ayarlamalarımızı bu dosya üzerinden yapmaktayız. Burada detayına girmeden clientların şifre ile bağlantı yapması için aşağıdaki satırı eklememiz gerekmektedir. Bu dosya PGDATA altındadır.
$ vi pg_hba.conf
host all all 0.0.0.0/0 scram-sha-256
Yine uzaktan gelecek client bağlantılarının dinlenebilmesi için postgresql.conf dosyasındaki listen_adres kısmını değiştirmeliyiz , biz heryerden gelen istekler için dinleme yapılsın diyoruz ve buna * veriyoruz.
listen_addresses = '*'
port = 5432
Firewall vs ayarlarımız yapılmış ise postgresql servislerini yeniden başlatarak veritabanına bağlantı yapabiliriz.
$ pg_ctl stop
waiting for server to shut down.... done
server stopped
$ pg_ctl start
waiting for server to start....2024-10-24 14:09:35.587 UTC [83748] LOG: redirecting log output to logging collector process
2024-10-24 14:09:35.587 UTC [83748] HINT: Future log output will appear in directory "log".
done
server started
Ayrıca 32GB bir veritabanı için de best practice kurulum ayarları aşağıdaki ayarları örnek alarak ayarlayabilirsiniz; siz memory , server ve kullanım amacınza göre aşağıdaki ayarları ölçeklemelisiniz.
Postgres Best Practice
These practices only guides you at the beginning of installation. You must monitor the system, ,get security, SLA and other requirements, and also the parameters may change according to your environments.
1-Recommended hardware specifications for a medium database to begin with;
RAM = 32GB
CPU = 8 core
DISK = must be allocated based on data size. LVM must be configured.
If different physical disks can be defined for the cluster directory and the wal directory, they must be on separate disks. Even if there is more than one database on an instance, separate tablespaces and separate disks should be defined for each database.
In the installation, an additional contrib package must be installed in the server package.
2-postgresql.conf parameters that need to be changed after installation
For 32GB server
listen_addresses = '*'
max_connections = 150
shared_buffer: 8GB # (must be maximum one in four of total RAM )
shared_preload_libraries = 'pg_stat_statements'
maintenance_work_mem=1GB
bgwriter_delay = 10ms
bgwriter_lru_maxpages = 1000
bgwriter_lru_multiplier = 4.0
wal_level = replica
wal_log_hints = on # (if checksum not enabled)
max_wal_size = 12GB
min_wal_size = 6GB
checkpoint_completion_target = 0.7
checkpoint_timeout =10
archive_mode = on
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
wal_keep_segments = 1000
log_filename = 'postgresql-%a.log'
log_min_duration_statement = 1000
log_line_prefix = '%m [%p] app=%a user=%u db=%d host=%h pid=%p '
log_lock_waits = on
log_temp_files = 0
track_io_timing = on
autovacuum = on #(It is not recommended to turn off)
log_autovacuum_min_duration = 0
autovacuum_vacuum_scale_factor = 0.01
autovacuum_analyze_scale_factor = 0.01
effective_cache_size= 24GB
In addition to the master server, there must be at least one sync replica server. If slots are to be used in replication, their losses should be considered.
3-Security Best Practices
1-Postgres user must be disabled for remote access.
2-Superuser authority should not be defined for users coming from applications.
3-Detailed access permissions must be defined from pg_hba.conf
4-Port must be used other than the postgresql default port.
5-The database version should be kept up to date with the minor and major updates.
6-Separate users and authorizations should be defined for replication backup users.
7. encrypt sensitive data with pgcrypto extension
8-Application user should not have super user account
9-do not give any privileges to public
10- revoke connect role from public
11- do not create objects in public schema
12-If it is possible for your application drop public schema
13- Give least privileges to application user that the application only can work.
14- use pg_audit extension if default auditing is not adequate for clients requirements
4-Recommended extensions to use
Default extensions to be installed:
1-pg_stat_statements
2-pg_repack
Plugins to be installed as needed:
a- foreign data wrappers
b- pg_audit
c- chkpass: determines password quality of user postgres
5-PostgreSQL system log analysis;
pgbadger
6-Connection Management:
If there is no pooling mechanism, pgbouncer can be installed.
7- Monitoring Tools
a-pg_top
b-pg_activity
c-pgadmin
d-PMM (Percona Monitoring Tool) or Zabbix
8-Backup and Recovery Strategies
We recommend one server for monitoring database and backup server.
We recommend archive mode on, and put archive log to network attached servers,
where your standby servers and backup server could read these archive logs.
It is recommended to use pg_probackup or pgbackrest as a backup tool.
They provide parallelism and incremental backup mechanisms.
Schedule backups using cron utility’s of linux
9-HA
Patroni , BFM vb.
10- Development Tools
dbeaver
pgadmin
11. Linux Kernel Settings
SET Below parameters in sysctl.conf
kernel.shmall (SHMALL) 2 * <size of RAM in the default system page size>
kernel.sem (SEMMNI) 256 * <size of RAM in GB>
For big memorys Use hugepages for linux
script to quantify Huge Pages
#!/bin/bash
pid=`head -1 $PGDATA/postmaster.pid`
echo "Pid: $pid"
peak=`grep ^VmPeak /proc/$pid/status | awk '{ print $2 }'`
echo "VmPeak: $peak kB"
hps=`grep ^Hugepagesize /proc/meminfo | awk '{ print $2 }'`
echo "Hugepagesize: $hps kB"
hp=$((peak/hps))
echo Set Huge Pages: $hp
set vm.nr_hugepages in /etc/sysctl.conf
set huge_pages=on in postgresql.conf
set below parameter in /etc/sysctl.conf
vm.swappiness default 60 set the value to 1 if you want to minimize swapping
vm.overcommit_memory A value of 2 for vm.overcommit_memory yields better performance for PostgreSQL
vm.dirty_background_ratio default value 10 if system is write intensive lower the value
vm.swappines=1
vm.overcommit_memory=2
kernel.shmmax=34359738368
kernel.shmall=8388608
vm.nr_hugepages= 4500
Bir yanıt yazın