42.91 IOPS en moyenne en lecture contre 5575.55 pour le disque principal !
apt install rsyncpsqlSHOW data_directory;/var/lib/postgresql/11/mainsystemctl stop postgresqlsystemctl status postgresql/ final au 2 chemins) :--dry-run : rsync -av /var/lib/postgresql /data --dry-run --dry-run : rsync -av /var/lib/postgresql /datamv /var/lib/postgresql/11/main /var/lib/postgresql/11/main.bakvi /etc/postgresql/11/main/postgresql.confdata_directory = '/data/postgresql/11/main'systemctl start postgresqlsystemctl status postgresqlpsqlSHOW data_directory;cd /var/lib/postgresql/; rm -fR 11/ vi ~/.psqlrc\timing
sudo -i -u postgres psql -c "CREATE ROLE admin WITH LOGIN PASSWORD '<mot-de-passe>';"psql -c "ALTER USER admin WITH SUPERUSER CREATEDB CREATEROLE REPLICATION;"psql : createdb -E UTF8 -O admin adminexitpsql\q psql -c "CREATE ROLE geonatadmin WITH LOGIN PASSWORD '<mot-de-passe>';" GRANT pg_read_server_files TO geonatadmin ; createdb -E UTF8 -O geonatadmin geonature2db ) psql -c "CREATE ROLE geonatatlas WITH LOGIN PASSWORD '<mot-de-passe>';"createdb -E UTF8 -O geonatatlas gnatlas ) psql -c "CREATE ROLE telegraf WITH LOGIN PASSWORD '<mot-de-passe>';"postgres avec : psql -c "GRANT CONNECT ON DATABASE postgres TO telegraf;"psql -c "ALTER USER telegraf SUPERUSER CONNECTION LIMIT 3;"createdb -E UTF8 -O telegraf telegrafpostgresql.conf avec : vi /etc/postgresql/12/main/conf.d/01_override.conf pour ouvrir le port 5432 sur l'IP privé de l'instance db-srv avec la propriété : listen_addresses = 'localhost,10.0.1.20,172.18.5.1'
vi /etc/postgresql/12/main/pg_hba.conf pour :# IPv4 local connections: ... host all all 10.0.1.20/32 scram-sha-256
# GeoNature host geonature2db geonatadmin 10.0.1.10/32 scram-sha-256 host gnatlas geonatadmin 10.0.1.10/32 scram-sha-256 host gnatlas geonatatlas 10.0.1.10/32 scram-sha-256 host postgres telegraf 172.18.5.0/24 scram-sha-256
systemctl restart postgresqlss -tunelp | grep 5432 doit afficher : tcp LISTEN 0 128 172.18.5.1:5432 0.0.0.0:* uid:108 ino:18316865 sk:11 <-> tcp LISTEN 0 128 10.0.1.20:5432 0.0.0.0:* uid:108 ino:498249 sk:12 <-> tcp LISTEN 0 128 127.0.0.1:5432 0.0.0.0:* uid:108 ino:498248 sk:13 <-> tcp LISTEN 0 128 [::1]:5432 [::]:* uid:108 ino:498247 sk:14 v6only:1 <->
netstat -anpt|grep :5432 doit afficher : tcp 0 0 172.18.5.1:5432 0.0.0.0:* LISTEN 29707/postgres tcp 0 0 10.0.1.20:5432 0.0.0.0:* LISTEN 31259/postgres tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 31259/postgres tcp6 0 0 ::1:5432 :::* LISTEN 31259/postgres
telnet 10.0.1.20 5432nft add rule ip filter INPUT ip daddr 10.0.1.20 tcp sport 1024-65535 tcp dport 5432 ct state new,established counter acceptnft add rule ip filter OUTPUT ip saddr 10.0.1.20 tcp sport 5432 tcp dport 1024-65535 ct state established counter accept/var/log/postgresql/*.log { weekly rotate 10 copytruncate delaycompress compress notifempty missingok su root root }
postgresql.conf) via le fichier 01_override.conf avec : vi /etc/postgresql/12/main/conf.d/01_override.conf # General shared_preload_libraries = 'pg_stat_statements,pg_prewarm' # Log log_destination = stderr logging_collector = on # Use logrotate for rotation. See: /etc/logrotate.d/postgresql-common #log_rotation_age = 1d #log_rotation_size = 100MB # Log format for PgBadger. See: https://pgbadger.darold.net/documentation.html#REQUIREMENT log_line_prefix= '%t [%p]: db=%d,user=%u,app=%a,client=%h ' lc_messages = 'C.UTF-8' log_autovacuum_min_duration = 0 log_checkpoints = on log_connections = on log_disconnections = on log_lock_waits = on log_temp_files = 0 log_error_verbosity = default # Activity stats track_activity_query_size = 20480 compute_query_id = on track_io_timing = on track_wal_io_timing = on track_functions = 'pl' # Extenssion pg_stat_statements config pg_stat_statements.max = 10000 pg_stat_statements.track = all
L'idée est d'adapter rapidement la configuration de Postgresql fournie par défaut aux caractéristiques de l'instance abritant le serveur Postgresql. Pour cela nous utiliserons le site https://pgtune.leopard.in.ua/.
# DB Version: 11 # OS Type: linux # DB Type: web/data warehouse # Total Memory (RAM): 15 GB # CPUs num: 4 # Data Storage: ssd
# DB Version: 12 # OS Type: linux # DB Type: web # Total Memory (RAM): 15 GB # CPUs num: 4 # Data Storage: ssd
ssh admin@db-<region>-sinp sudo -ivi /etc/postgresql/15/main/conf.d/02_optimize.conf# DB Version: 11 # OS Type: linux # DB Type: web/data warehouse # Total Memory (RAM): 15 GB # CPUs num: 4 # Data Storage: ssd max_connections = 100 shared_buffers = 3840MB effective_cache_size = 11520MB maintenance_work_mem = 1920MB checkpoint_completion_target = 0.7 wal_buffers = 16MB default_statistics_target = 100 random_page_cost = 1.1 effective_io_concurrency = 200 work_mem = 24MB min_wal_size = 4GB max_wal_size = 16GB max_worker_processes = 4 max_parallel_workers_per_gather = 2 max_parallel_workers = 4 max_parallel_maintenance_workers = 2 # ATTENTION : ne pas limiter idle_in_transaction_session_timeout à 5mn10s car la mise à jour de l'Atlas nécessite plus ! #idle_in_transaction_session_timeout=310000
systemctl restart postgresql SHOW <ma-variable>; apt install libdbd-pg-perl libdbi-perl perl-modulesmkdir ~/bin/; cd ~/bin/wget -O postgresqltuner.pl postgresqltuner.plchmod +x postgresqltuner.plsource ~/.bashrc postgresqltuner.pl --host=localhost --database=geonature2db --user=admin --password=<mot-de-passe>vi /etc/postgresql/15/main/conf.d/02_optimize.confcat /proc/cpuinfopse est présent : indique le support des Huges Pages de 2MBpdpe1gb est présent : indique le support des Huges Pages de 1GBHugepagesize dans la sortie de : cat /proc/meminfopdpe1gb) et que Hugepagesize indique 2MB, vous pouvez changer cette valeur en suivant les indications de la page 34 de ce document PDF.cat /data/postgresql/15/main/postmaster.pid ou cat /var/lib/postgresql/15/main/postmaster.pid c'est le nombre sur la première ligne.grep ^VmPeak /proc/<pid-pg-postmaseter>/status, affiche par exemple VmPeak: 215424 kB/etc/sysctl.conf et ajouter le nombre de Huge Pages en l'augmentatn légèrement (ex. 110 pour 106) vm.nr_hugepages = 110systemctl stop postgresqlsysctl -pvi /etc/postgresql/15/main/conf.d/02_optimize.confhuge_pages = ongrep ^Huge /proc/meminfoHugePages_Rsvd: 0systemctl start postgresqlsystemctl status postgresql/etc/sysctl.conf en recommençant les étapes précédentes.grep ^Huge /proc/meminfoHugePages_Rsvd: 64geonatadmin existe en local et que la base de données geonature2db n'existe pas en local ou peut être supprimée. Postgresql doit écouter en local (localhost) sur le port par défaut (= 5432). L'archive générée par pg_dump doit être au format directory (= "d").geonatadmin localement avec la commande (changer le mot de passe) : sudo -u postgres psql -c "CREATE ROLE geonatadmin WITH LOGIN PASSWORD '<password-local>';"
sudo -u postgres dropdb --if-exists geonature2db
ERREUR: la base de données « geonature2db » est en cours d'utilisation par d'autres utilisateurs : fermer les connexions à la base (DBeaver) ou utiliser la commande suivante pour forcer la fermeture de toutes les connexions à la base geonature2db : sudo -u postgres psql -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'geonature2db' AND pid <> pg_backend_pid();"
geonatadmin de recréer les extenssions dans la base, nous lui donnons temporairement (le temps de l’exécution de pg_restore) des droits de super-utilisateur : sudo -u postgres psql -c "ALTER ROLE geonatadmin SUPERUSER;"
template0) portant le même nom que la base distante (impossible de changer directement le nom avec pg_restore) : sudo -u postgres createdb -T template0 geonature2db
geonatadmin qui doit avoir les droits sur la base geonature2db : sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE geonature2db TO geonatadmin;"
pg_restore les emplacements de connexions restants sont réservés pour les connexions super-utilisateur non relatif à la réplicationcd /home/${USER}/tmp/ ; tar xvf /home/${USER}/tmp/2021-07-27_geonature2db.tar ; chmod +x -R /home/${USER}/tmp/2021-07-27_geonature2db/
sudo -u postgres pg_restore --host "localhost" --port "5432" -U "geonatadmin" --jobs "8" --verbose --dbname "geonature2db" "/home/${USER}/tmp/2021-07-27_geonature2db" 2>&1 | tee "./$(date +"%Y-%m-%d")_pgrestore.log"
~/tmp/2021-07-27_geonature2db. Changer l'emplacement en fonction de votre machine.tee) copie les éléments affichés à l'écran dans un fichier de log <date>_pgrestore.log.--format s'il n'est pas précisé est détecté automatiquement. Attention sinon à définir la bonne option: "c" (custom), "d" (directory), "t" (tar)--jobs indiquer seulement 3/4 du nombre de processeurs (sinon une erreur "nombre max de client atteint" peut apparaître). Dans l'exemple, 8 pour 12 CPU. Pour afficher le nombre de processeur de votre machine : grep -c ^processor /proc/cpuinfogeonatadmin : sudo -u postgres psql -c "ALTER ROLE geonatadmin NOSUPERUSER;"
gn2_sinp_paca : sudo -u postgres dropdb --if-exists gn2_sinp_paca
geonature2db soit vous en servir de template et la maintenir en local :sudo -u postgres psql -c "CREATE DATABASE gn2_sinp_paca WITH TEMPLATE geonature2db ;"
sudo -u postgres psql -c "ALTER DATABASE geonature2db RENAME TO gn2_sinp_paca;"
psql -c "ALTER DATABASE gn2_sinp_paca OWNER TO geonatadmin;"
web-srv, activer la maintenance longue de GeoNature et l'Atlas.db-srv en tant que "admin" puis passer en "root"screen -S upgrade-postgreslsudo -u postgres pg_dumpall > "/home/admin/backups/postgresql/2022-10-31_dumpall.dump" du -hs /home/admin/backups/postgresql/2022-10-31_dumpall.dumpsystemctl stop postgresqlsystemctl status postgresql postgresql@11-main apt install -y postgresql-15-postgis-3 cp /etc/postgresql/11/main/conf.d/01_optimizing.conf /etc/postgresql/15/main/conf.d/ diff /etc/postgresql/11/main/postgresql.conf /etc/postgresql/15/main/postgresql.conf listen_addresses = 'localhost,10.0.1.20,172.18.5.1' log_timezone = 'Europe/Paris' datestyle = 'ISO, DMY' timezone = 'Europe/Paris' lc_messages = 'fr_FR.UTF-8' lc_monetary = 'fr_FR.UTF-8' lc_numeric = 'fr_FR.UTF-8' lc_time = 'fr_FR.UTF-8' default_text_search_config = 'pg_catalog.french'
diff /etc/postgresql/11/main/pg_hba.conf /etc/postgresql/15/main/pg_hba.conf host all all 10.0.1.20/32 scram-sha-256 # GeoNature host geonature2db geonatadmin 10.0.1.10/32 scram-sha-256 host gnatlas geonatadmin 10.0.1.10/32 scram-sha-256 host gnatlas geonatatlas 10.0.1.10/32 scram-sha-256 # Si telegraf utilisé avec un accès basique (base postgres uniquement) : #host postgres telegraf 172.18.5.0/24 scram-sha-256 # Si telegraf utilisé avec un accès avancé (toutes les bases) : host all telegraf 172.18.5.0/24 scram-sha-256 # GeoNature : access by gnreader (read only) host geonature2db gnreader 10.0.1.20/32 scram-sha-256 host gnatlas gnreader 10.0.1.20/32 scram-sha-256
systemctl start postgresqlsudo -u postgres pg_dumpall -p 5432 | sudo -u postgres psql -d postgres -p 5433systemctl stop postgresql postgresql@11-main postgresql@15-mainvi /etc/postgresql/11/main/postgresql.conf mettre port = 5433vi /etc/postgresql/15/main/postgresql.conf mettre port = 5432systemctl start postgresql postgresql@11-main postgresql@15-mainpg_lsclustersweb-srv :sudo systemctl restart geonature geonature-atlas taxhub usershubsystemctl stop postgresql@11-mainsudo apt remove --purge postgresql-11 apt list -a --installed postgresql* puis apt autoremove s'il faut supprimer des reliquats.docker compose up -d --build borgmaticLe type de cryptage des mots de passe par défaut à changé (md5 → SCRAM-SHA-256) dans la version 14. Il est nécessaire de mettre à jour les mots de passe :
psqlSELECT rolname, rolpassword ~ '^SCRAM-SHA-256\$' AS has_upgraded FROM pg_authid WHERE rolcanlogin;
\password <login>
psql -U <login> -h localhost
mkdir ~/bin .) ou de tiret (-) car sinon ils ne sont pas exécutés. mkdir -p ~/backups/postgresql/ --format=d) qui permet une parallélisation sur plusieurs CPUs (paramètre --jobs) et une compression (paramètre --compress 9): export BACKUP_DIR="/home/${USER}/backups/postgresql"; \ export BACKUP_NAME="$(date +%F)_gonature2db"; \ export BACKUP_PATH="${BACKUP_DIR}/${BACKUP_NAME}"; \ mkdir -p "${BACKUP_DIR}"; \ pg_dump --file "${BACKUP_PATH}" --host "localhost" --port "5432" --username "geonatadmin" --verbose --format=d --jobs=$(grep -c ^processor /proc/cpuinfo) --compress 9 geonature2db ; \ tar -cvf "${BACKUP_NAME}.tar" -C "${BACKUP_DIR}" "${BACKUP_NAME}/" ; \ cd "${BACKUP_DIR}" ; \ rm -fR "${BACKUP_NAME}/" ; find "${BACKUP_DIR}" -name "*_gonature2db.tar" -type f -mtime +5 -exec rm -f {} \;
--format=p) : export BACKUP_DIR="/home/${USER}/backups/postgresql"; \ export BACKUP_NAME="$(date +%F)_gnatlas"; \ export BACKUP_PATH="${BACKUP_DIR}/${BACKUP_NAME}.sql"; \ pg_dump --file "${BACKUP_PATH}" --host "localhost" --port "5432" --username "geonatatlas" --verbose --format=p gnatlas ; \ tar -cvf "${BACKUP_NAME}.tar" -C "${BACKUP_DIR}" "${BACKUP_NAME}.sql" ; \ rm -f "${BACKUP_PATH}" ; \ find "${BACKUP_DIR}" -name "*_gnatlas.tar" -type f -mtime +365 -exec rm -f {} \;
/opt/bkp2dbx/bkp2dbx.sh "postgresql" "/home/admin/backups/postgresql/*.tar" "/home/admin/.dropbox_uploader" mkdir ~/bin scp -r bin/* admin@db-<region>-sinp:~/bin/ vi ~/.pgpass # Format: hostname:port:database:username:password localhost:5432:geonature2db:geonatadmin:<mot-de-passe> localhost:5432:gnatlas:geonatatlas:<mot-de-passe>
chmod 600 ~/.pgpass mkdir -p ~/backups/postgresql/ scp -r backups admin@db-<region>-sinp:~/dwl/ puis sur le serveur : sudo -i ; mv /home/admin/dwl/backups /etc/cron.d/