Installer un serveur PostgreSQL
C'est un serveur de base de données dont vous aurez certainement besoin pour alimenter vos sites web et applications.
Préparez databases/postgresql15-server dans vos poudrières. Dans l'exemple qui suit popeye est l'hôte et pg est la jail.
Préparez une Jail
Construisez une jail nommée pg dans /jails/pg
pour accueillir votre serveur de bases de données.
Adaptez la configuration de la jail pg :
- pg/etc/rc.conf.local
hostname="pg"
- /etc/jail.conf
pg { host.hostname = pg; ip4.addr = "lo1|192.168.0.10";# Adresse IP à attribuer. path ="/jails/pg"; # où est-elle ? mount.devfs; # postgresql a besoin de /dev/null # allow.sysvipc=1; # preferez la ligne qui suit sysvshm=inherit; # postgresql va monter des shm exec.start = "/bin/sh /etc/rc"; exec.stop = "/bin/sh /etc/rc.shutdown"; }
Notez que postgresql réclame quelques réglages pour une jail:
mount.devfs
, en fait l'installation de postgresql n'a besoin que de/dev/null
. C'est le moyen le plus rapide de l'avoir.sysvshm=inherit
ouallow.sysvipc=1
, postgresql doit pouvoir allouer une shared memory SYSV pour fonctionner,sysvipc
va ouvrir d'autres IPC que shm.
:~ ifconfig lo1 create :~ jail -c pg :~ pkg -j pg install databases/postgresql15-server
Pour que l'interface réseau soit créée au démarrage:
:~ sysrc cloned_interfaces+="lo1"
Ainsi que la jail:
:~ sysrc jail_enable="YES" :~ sysrc jail_list+="pg"
Préparation
Depuis la jail, initialisez postgresql:
:~ jexec pg :~ /usr/local/etc/rc.d/postgresql oneinitdb
Vous allez probablement permettre à l'hôte voire d'autre jail de communiquer avec votre serveur, autorisez le à écouter tout le monde:
- /var/db/postgres/data15/postgresql.conf
listen_addresses = '*'
Affinez le contrôle en autorisant tout va transiter par l’hôte:
- /var/db/postgres/data15/pg_hba.conf
host all all 192.168.0.1/24 trust
:~ service postgresql onestart 2020-04-11 13:54:50.404 UTC [19008] LOG: listening on IPv4 address "0.0.0.0", port 5432 2020-04-11 13:54:50.421 UTC [19008] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432" 2020-04-11 13:54:50.444 UTC [19008] LOG: ending log output to stderr 2020-04-11 13:54:50.444 UTC [19008] HINT: Future log output will go to log destination "syslog".
changez le mot de passe administrateur du serveur de base de données:
:~ jexec pg :~ su - postgres $ psql psql (13.8, server 15.0) WARNING: psql major version 13, server major version 15. Some psql features might not work. Type "help" for help. postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+---------+-------+----------------------- postgres | postgres | UTF8 | C | C | template0 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres (3 rows) postgres=# \password postgres Enter new password: Enter it again: postgres=# \q
Voire de le lancer au démarrage de la jail:
:~ sysrc -j pg postgresql_enable="YES"
Vous pouvez maintenant démarrer le serveur de base de données:
:~ service -j pg postgresql start
Extensions
Selon vos besoins, installez le port postgresql-contrib. Pour, par exemple, charger l'extension pg_stat_statements:
shared_preload_libraries = 'pg_stat_statements' #pg_stat_statements.track = all #pg_stat_statements.max = 10000
Tests
Est-ce que le serveur est à l'écoute ?
root@popeye# jexec pg sockstat -l USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS postgres postgres 36299 3 tcp4 192.168.0.10:5432 *:* postgres postgres 36299 5 stream /tmp/.s.PGSQL.5432 root syslogd 99367 5 dgram /var/run/log root syslogd 99367 6 dgram /var/run/logpriv
Essayons, depuis l'hôte:
root@popeye# telnet 192.168.0.10 5432 Trying 192.168.0.10... Connected to 192.168.0.10. Escape character is '^]'.
A l'aide du client databases/postgresql15-client
root@popeye# pg_isready --host=192.168.0.10 192.168.0.10:5432 - accepting connections
root@popeye# psql -U postgres --host=192.168.0.10 -W Password: psql (13.8, server 15.0) WARNING: psql major version 13, server major version 15. Some psql features might not work. Type "help" for help. postgres-# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+---------+-------+----------------------- postgres | postgres | UTF8 | C | C | template0 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres (3 rows) postgres-# \q
Socket unix
Vous avez noté la ligne de sockstat(1):
postgres postgres 36299 5 stream /tmp/.s.PGSQL.5432
Cela signifie que vous pouvez communiquer avec la serveur via une socket(2) unix.
Vous n'avez même pas besoin de configuration réseau pour communiquer avec cette jail:
root@popeye:# psql -U postgres --host=/jails/pg/tmp/ -W Password: psql (13.8, server 15.0) WARNING: psql major version 13, server major version 15. Some psql features might not work. Type "help" for help. postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+---------+-------+----------------------- postgres | postgres | UTF8 | C | C | template0 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres (3 rows) postgres=# \q
disable
à ip4
et ip6
de votre jail et l'isoler ainsi complètement du réseau.
ZFS
Si vous utilisez une jail sous ZFS vous pouvez améliorer les performances en paramétrant le dataset au mieux.
zfs get atime,compression,primarycache,recordsize,dedup,reservation zroot/JAILS/master/pg15 NAME PROPERTY VALUE SOURCE zroot/JAILS/master/pg15 atime off inherited from zroot zroot/JAILS/master/pg15 compression lz4 inherited from zroot zroot/JAILS/master/pg15 primarycache metadata local zroot/JAILS/master/pg15 recordsize 128K default zroot/JAILS/master/pg15 dedup off inherited from zroot/JAILS/master zroot/JAILS/master/pg15 reservation 1G local
Mettre à jour
Stoppez le service:
service postgresql stop
Sauvegarder les répertoires /usr/local/bin
dans /usr/local/pgold
.
Connectez vous en tant qu'utilisateur postgre
:
su - postgres
Installez la nouvelle version puis préparer la nouvelle base de données comme indiqué dans l'article. Demandez la migration:
su - postgres pg_update -b /usr/local/pgold -B /usr/local/bin/ -d ./data11 -D ./data15
Une fois la migration terminée, démarrer le service et demandez un VACUUM ANALYZE;
sur chaque base.