====== 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"
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 --cluster ${VERSION}/${INST} -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 --cluster ${VERSION}/${INST} -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"
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 --cluster ${VERSION}/${INST} -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 --cluster ${VERSION}/${INST} -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