Mise à jour de l'infra postgresql avril 2014

Remarques et todo

tantor a 2 ip :

95.142.160.131

95.142.169.64

Une raison particulière à ça ? Le dns pointe sur 95.142.160.131

Installation d'etckeeper ?

durée de rétention des sauvegardes ? (5 jours pour le moment)

passer le listen_addresses à '*' sur les 2 machines pour simplifier la conf ? oui (rjuju)

envoi de mails depuis les crons ? si oui à quelle adresse ?

utilisation des liens symboliques /data plutôt que des vrais chemins /srv/data_(celeste|tantor) pour simplifier et unifier au maximum les scripts ? oui (rjuju)

les seuls scripts différents sur les 2 machines sont

le postgresql.conf (archive_command + éventuellement le listen_addresses)

le recovery.conf (primary_conninfo)

les crontabs: le script de sauvegarde PITR (rsync vers le serveur)

Actions

Suppression de l'instance 8.4 sur tantor

Création du lien symbolique /var/lib.postgresql pointant vers /srv/data_tantor/var/lib/postgresql rjuju

Migration de celeste vers postgresql 9.3.4

temps estimé : TODO

Mise en réplication entre celeste et tantor rjuju

log shipping

streaming replication

pas de hot standby

Mise en place d'une sauvegarde PITR de celeste (en plus du pg_dumpall déjà en place) rjuju

Déplacement des sauvegardes pg_dumpall + rsync de celles-ci sur le FS /data/srv_(celeste_tantor) (actuellement sur le FS / )

Installation de sysstat sur celeste et tantor rjuju

Mise en place de rapports pgBadger et pgCluu quotidiens

Détails

Suppression instance 8.4 sur tantor

A priori instance non utilisée, pas de précaution à prendre.

Sauf avis contraire ?

Migration en 9.3

Mise à jour via pg_dumpall.

Temps de l'opération à définir. La sauvegarde pg_dumpall|gz prend actuellement moins d'une minute et occupe un peu moins de 30 Mo.
tests des applicatifs en 9.3 ?

Installation de la 9.3 rjuju

Configuration du dépôts apt.postgresql.org sur tantor :

fichier /etc/apt/sources.list.d/postgresql.list

deb http://apt.postgresql.org/pub/repos/apt/ squeeze-pgdg main

+ autres étapes, voir http://wiki.postgresql.org/wiki/Apt

sudo apt-get install postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3

sur celeste et tantor

Positionner manual dans le fichier /etc/postgresql/9.2/main/start.conf sur celeste le temps de l'opération pour ne pas que l'instance 9.2 ne redémarre automatiquement.

Mise en réplication

Ajout de la clé publique de postgres@tantor sur postgres@celeste (fait par rjuju le 7/04/2014)

Création des répertoires d'archivages de WAL et des snapshots sur celeste et tantor rjuju

on utilise les liens symboliques /data point sur /srv/data_(celeste|tantor)

/data/backups/postgresql/xlog/

/data/backups/postgresql/snapshot/

Ajout d'un utilisateur de réplication

CREATE ROLE repli REPLICATION ;

création d'un mot de passe et mise en place d'un fichier .pgpass ou du trust ? Mot de passe et .pgpass (rjuju)

Modification de la configuration postgres sur celeste : rjuju

archive_mode = on
archive_command = 'rsync -a %p postgres@tantor.postgresql.fr:/data/backups/postgresql/xlog/%f'
wal_level = hot_standby # au cas où on veuille passer en hot_standby
checkpoint_completion_target = 0.9
ssl = true
log_checkpoints = on
log_disconnections = on
log_connections = on
log_line_prefix = '%t [%p]: [%l-1] db=%d,user=%u '
shared_buffers = 128MB
wal_buffers = -1
max_wal_senders = 3
port = 5432
max_connections = 100
listen_addresses = 'localhost,217.70.189.115' # ip de celeste
lc_messages = 'C'
default_text_search_config = 'pg_catalog.french'

Modification de la configuration postgres sur tantor : rjuju

archive_mode = on
archive_command = 'rsync -a %p postgres@celeste.postgresql.fr:/data/backups/postgresql/xlog/%f'
wal_level = hot_standby # au cas où on veuille passer en hot_standby
checkpoint_completion_target = 0.9
ssl = true
log_checkpoints = on
log_disconnections = on
log_connections = on
log_line_prefix = '%t [%p]: [%l-1] db=%d,user=%u '
shared_buffers = 128MB
wal_buffers = -1
max_wal_senders = 3
port = 5432
max_connections = 100
listen_addresses = 'localhost,95.142.160.131' # ip de tantor
lc_messages = 'C'
default_text_search_config = 'pg_catalog.french'

Modification du pg_hba.conf sur celeste et tantor : rjuju

#connexions locales
local all all peer
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
# pas de connexion sans ssl
hostnossl all all 0.0.0.0/0 reject
# on autorise celese et tantor
hostssl all postgres 217.70.189.115/32 md5
hostssl all postgres 95.142.160.131/32 md5
# on autorise celeste et tantor à se connecter pour la réplication
hostssl replication repli 217.70.189.115/32 md5
hostssl replication repli 95.142.160.131/32 md5
# on rejette tout le reste
hostssl all all 0.0.0.0/0 reject

Création du recovery.conf sur tantor : rjuju

standby_mode = on
primary_conninfo = 'host=celeste.postgresql.fr port=5432 user=repli'
restore_command = 'cp /data/backups/postgresql/xlog/%f %p'
# pas de cleanup comme on a une sauvegarde pitr, ils seront purgés par le cron PITR
# pas de trigger file

Mise à jour des scripts de dump

Création du nouveau répertoire, en tant que postgres, sur celeste :

mkdir -p /data/backups/postgresql
mkdir -p /data/backups/postgresql-tantor

Création du nouveau répertoire, en tant que postgres, sur tantor :

mkdir -p /data/backups/postgresql
mkdir -p /data/backups/postgresql-celeste

Déplacement des anciennes sauvegardes, sur celeste en tant que postgres:

mv /var/backups/postgresql/* /data/backups/postgresql
rmdir /var/backups/postgresql

Déplacement des anciennes sauvegardes, sur tantor en tant que postgres:

mv /var/backups/postgresql-celeste/* /data/backups/postgresql-celeste
rmdir /var/backups/postgresql-celeste

Sur celeste, crontab postgres:

0 1 * * * pg_dumpall | gzip -c > /data/backups/postgresql/pgsql.daily.sql.gz
0 2 * * 1 pg_dumpall | gzip -c > /data/backups/postgresql/pgsql.weekly.sql.gz
0 3 1 * * pg_dumpall | gzip -c > /data/backups/postgresql/pgsql.monthly.sql.gz
0 4 * 1 * pg_dumpall | gzip -c > /data/backups/postgresql/pgsql.yearly.sql.gz
# export vers Tantor
0 6 * * * rsync -av --delete /data/backups/postgresql/* tantor.postgresql.fr:/data/backups/postgres-celeste/

Sur tantor, crontab postgres:

#0 1 * * * pg_dumpall | gzip -c > /data/backups/postgresql/pgsql.daily.sql.gz
#0 2 * * 1 pg_dumpall | gzip -c > /data/backups/postgresql/pgsql.weekly.sql.gz
#0 3 1 * * pg_dumpall | gzip -c > /data/backups/postgresql/pgsql.monthly.sql.gz
#0 4 * 1 * pg_dumpall | gzip -c > /data/backups/postgresql/pgsql.yearly.sql.gz
# export vers Celeste
#0 6 * * * rsync -av --delete /data/backups/postgresql/* celeste.postgresql.fr:/data/backups/postgres-tantor/

Mise en place de la sauvegarde PITR

Script de sauvegarde PITR sur celeste: rjuju

#!/bin/bash SRVDEST="tantor.postgresql.fr" VERSION="9.3" PORT=5432 INST="main" SNAPNAME="snapshot_$(date '+%Y_%m_%d_%H_%M_%S')" PGDIR="/var/lib/postgresql/${VERSION}/${INST}/" DESTDIR="/data/backups/postgresql/snapshot/${SNAPNAME}/" rc=0 psql -p ${PORT} -c "SELECT pg_start_backup('${SNAPNAME}')" if [ $? -ne 0 ]; then echo "Unable to start backup !" exit 1 fi rsync -avp --exclude "pg_xlog/*" ${PGDIR} postgres@${SRVDEST}:${DESTDIR} if [ $? -ne 0 ]; then echo "Error during rsync of ${PGDIR} to postgres@${SRVDEST}:${DESTDIR} !" rc=1 fi psql -p ${PORT} -c "SELECT pg_stop_backup()" if [ $? -ne 0 ]; then echo "Unable to stop backup !" rc=1 fi exit ${rc}

Script de sauvegarde PITR sur tantor (en cas de switchover) : rjuju

#!/bin/bash SRVDEST="celeste.postgresql.fr" VERSION="9.3" PORT=5432 INST="main" SNAPNAME="snapshot_$(date '+%Y_%m_%d_%H_%M_%S')" PGDIR="/var/lib/postgresql/${VERSION}/${INST}/" DESTDIR="/data/backups/postgresql/snapshot/${SNAPNAME}/" rc=0 psql -p ${PORT} -c "SELECT pg_start_backup('${SNAPNAME}')" if [ $? -ne 0 ]; then echo "Unable to start backup !" exit 1 fi rsync -avp --exclude "pg_xlog/*" ${PGDIR} postgres@${SRVDEST}:${DESTDIR} if [ $? -ne 0 ]; then echo "Error during rsync of ${PGDIR} to postgres@${SRVDEST}:${DESTDIR} !" rc=1 fi psql -p ${PORT} -c "SELECT pg_stop_backup()" if [ $? -ne 0 ]; then echo "Unable to stop backup !" rc=1 fi exit ${rc}

Script de purge PITR (snapshot + WAL) sur celeste (en cas de switchover) et tantor : rjuju

#!/bin/bash RETENTION=5 # Suppression des snapshots de plus de $RETENTION jours find /data/backups/postgresql/snapshot/ -maxdepth 1 -type d -name "snapshot_*" -mtime +${RETENTION} -print -exec rm -rf {} \; # Suppression des WAL de plus de $RETENTION jours find /data/backups/postgresql/xlog -type f -mtime +${RETENTION} -print -delete

pgBadger + pgCluu

Installation de sysstat

sudo apt-get install sysstat

TODO