Методичка: PostgreSQL
Перейти к навигации
Перейти к поиску
Конфигурация системы
Организация объектов файловой системы
mkdir -p /home/postgres/{archive,backup,tablespace} /home/postgres/{cluster,wal}/$MAJOR_VERSION
chown -R postgres:postgres /home/postgres
| Директория | Назначение | Имеет поддиректорию $MAJOR_VERSION |
Применяемые права доступа |
|---|---|---|---|
| $HOME/archive | Долгосрочный архив копий баз данных | Нет | chmod 0750 |
| $HOME/backup | Осуществление систематического резервного копирования баз данных | Нет | chmod 0750 |
| $HOME/cluster | Головная директория данных кластера | Да | chmod 0700 |
| $HOME/{,lvm[0-9]/}tablespace | Директория табличных пространств | Нет | chmod 0700 |
| $HOME/{,lvm[0-9]/}wal | Директория содержит по средством символической ссылки вынесенную из директории кластера поддиректорию pg_wal | Да | chmod 0700 |
| /var/socket/postgresql | Директория подключения к СУБД посредством unix-сокета Доступ к директории имеет только СУБД и приложение, подключаемое к СУБД |
Да | chown postgres:postgres chmod 0700 setfacl -m u:$user_name:rwx setfacl -d -m u:$user_name:rwx |
| Файл | Назначение | Применяемые права доступа |
|---|---|---|
| $HOME/.pgpass | Содержание паролей подключения к базам данных | chmod 0600 |
Подсистема управления службами
Основной юнит systemd запуска службы СУБД
Имя юнита: postgresql-$MAJOR_VERSION.service
[Unit]
Description=PostgreSQL $MAJOR_VERSION database server
#Requires=home-postgres-cluster-$MAJOR_VERSION-pg_stat_tmp.mount
#After=home-postgres-cluster-$MAJOR_VERSION-pg_stat_tmp.mount
After=network.target
[Service]
Type=forking
OOMScoreAdjust=-1000
TimeoutStartSec=0
TimeoutStopSec=1h
User=postgres
Group=postgres
Environment=PGDATA=/home/postgres/cluster/$MAJOR_VERSION
ExecStart=/usr/lib/postgresql/$MAJOR_VERSION/bin/pg_ctl start -D ${PGDATA} -s
ExecStop=/usr/lib/postgresql/$MAJOR_VERSION/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/usr/lib/postgresql/$MAJOR_VERSION/bin/pg_ctl reload -D ${PGDATA} -s
[Install]
WantedBy=multi-user.target
Вспомогательный юнит systemd монтирования директории /home/postgres/cluster/$MAJOR_VERSION/pg_stat_tmp в tmpfs
Начиная с PostgreSQL 15 версии статистика сохраняется в shared memory
Имя юнита: home-postgres-cluster-$MAJOR_VERSION-pg_stat_tmp.mount
[Unit] Description=PostgreSQL $MAJOR_VERSION (pg_stat_tmp mount) DefaultDependencies=no Conflicts=umount.target Before=local-fs.target [Mount] What=tmpfs Where=/home/postgres/cluster/$MAJOR_VERSION/pg_stat_tmp Type=tmpfs Options=size=1G,mode=0700,uid=postgres,gid=postgres,nosuid,noexec,nodev [Install] WantedBy=local-fs.target
Конфигурация кластера
.pgpass
//host_name:tcp_port:base_name:role_name:password *:*:*:dbuser0:password
Переменная окружения PGPASSFILE переопределяет путь файла
pg_hba.conf
//type {local,host}, database, role, address, method {trust,md5}
//local all postgres trust
//local all all md5
local all dbuser0 md5
host all all 127.0.0.1/32 md5
postgresql.conf
listen_addresses = '127.0.0.1'
unix_socket_directories = '/var/socket/postgresql/$MAJOR_VERSION'
shared_buffers = 4GB
temp_buffers = 16MB
work_mem = 128MB
maintenance_work_mem = 1GB
max_files_per_process = 8000
bgwriter_delay = 1000ms
bgwriter_lru_maxpages = 500
bgwriter_lru_multiplier = 4.0
effective_io_concurrency = {1,100} //{HDD,SSD}
max_worker_processes = //кол-во ядер
max_parallel_maintenance_workers = //кол-во парралельных процессов на один узел / одну служебную команду
max_parallel_workers_per_gather = max_parallel_maintenance_workers
max_parallel_workers = max_worker_processes
wal_level = minimal
fsync = off
synchronous_commit = off
checkpoint_timeout = 10min
max_wal_size = 2GB
min_wal_size = 512MB
max_wal_senders = 0
max_logical_replication_workers = 0
effective_cache_size = RAM - shared_buffers
log_timezone = 'Europe/Astrakhan'
seq_page_cost = {1.0,0.5,0.1} //{HDD,SSD,NVME}
random_page_cost = {2.0,1.0,0.1} //{HDD,SSD,NVME}
autovacuum = on
autovacuum_worker_slots = 4
autovacuum_max_workers = 4
autovacuum_naptime = 30s
autovacuum_vacuum_cost_delay = 10ms
row_security = off
timezone = 'Europe/Astrakhan'
max_locks_per_transaction = 2000
escape_string_warning = off
standard_conforming_strings = off
local_number=$( grep -E -n "^#temp_buffers" postgresql.conf | cut -d ":" -f 1 )
sed -i "${local_number}i\temp_buffers = 16MB" postgresql.conf
local_number=$( grep -E -n "^#work_mem" postgresql.conf | cut -d ":" -f 1 )
sed -i "${local_number}i\work_mem = 128MB" postgresql.conf
local_number=$( grep -E -n "^#maintenance_work_mem" postgresql.conf | cut -d ":" -f 1 )
sed -i "${local_number}i\maintenance_work_mem = 1GB" postgresql.conf
local_number=$( grep -E -n "^#max_worker_processes" postgresql.conf | cut -d ":" -f 1 )
sed -i "${local_number}i\max_worker_processes = 2" postgresql.conf
local_number=$( grep -E -n "^#wal_level" postgresql.conf | cut -d ":" -f 1 )
sed -i "${local_number}i\wal_level = minimal" postgresql.conf
local_number=$( grep -E -n "^#fsync" postgresql.conf | cut -d ":" -f 1 )
sed -i "${local_number}i\fsync = off" postgresql.conf
local_number=$( grep -E -n "^#synchronous_commit" postgresql.conf | cut -d ":" -f 1 )
sed -i "${local_number}i\synchronous_commit = off" postgresql.conf
local_number=$( grep -E -n "^#max_wal_senders" postgresql.conf | cut -d ":" -f 1 )
sed -i "${local_number}i\max_wal_senders = 0" postgresql.conf
local_number=$( grep -E -n "^#row_security" postgresql.conf | cut -d ":" -f 1 )
sed -i "${local_number}i\row_security = off" postgresql.conf
local_number=$( grep -E -n "^#escape_string_warning" postgresql.conf | cut -d ":" -f 1 )
sed -i "${local_number}i\escape_string_warning = off" postgresql.conf
local_number=$( grep -E -n "^#standard_conforming_strings" postgresql.conf | cut -d ":" -f 1 )
sed -i "${local_number}i\standard_conforming_strings = off" postgresql.conf
local_number=$( grep -E -n "^#max_locks_per_transaction" postgresql.conf | cut -d ":" -f 1 )
sed -i "${local_number}i\max_locks_per_transaction = 2000" postgresql.conf