PostgreSQL Sauvegardes Avancées

Formation DBA5

Dalibo SCOP

8 janvier 2018

Licence Creative Commons CC-BY-NC-SA

Vous êtes libres de redistribuer et/ou modifier cette création selon les conditions suivantes :

  • PaternitĂ©

  • Pas d'utilisation commerciale

  • Partage des conditions initiales Ă  l'identique

Sauvegardes avancées

PostgreSQL

Introduction

  • OpĂ©ration essentielle de sĂ©curisation des donnĂ©es
  • PrĂ©senter les techniques de sauvegardes disponibles
  • CrĂ©er une politique de sauvegarde

Au menu

  • StratĂ©gies de sauvegarde et restauration
  • Sauvegardes logiques et restauration
  • Sauvegardes physiques et restauration
  • Scripts de sauvegarde et de restauration

Objectifs

  • Choisir les mĂ©thodes de sauvegarde les mieux adaptĂ©es Ă  son contexte
  • MaĂ®triser la sauvegarde logique (dump/restore)
  • MaĂ®triser la sauvegarde Ă  chaud et le PITR

DĂ©finir une politique de sauvegarde

  • Pourquoi Ă©tablir une politique ?
  • Que sauvegarder ?
  • Ă€ quelle frĂ©quence sauvegarder les donnĂ©es ?
  • Quels supports ?
  • Quels outils ?
  • VĂ©rifier la restauration des sauvegardes

Objectifs

  • SĂ©curiser les donnĂ©es
  • Mettre Ă  jour le moteur de donnĂ©es
  • Dupliquer une base de donnĂ©es de production
  • Archiver les donnĂ©es

Différentes approches

  • Sauvegarde Ă  froid des fichiers
    • aussi appelĂ©e sauvegarde physique
  • Sauvegarde Ă  chaud en SQL
    • aussi appelĂ©e sauvegarde logique
  • Sauvegarde Ă  chaud des fichiers (PITR)

RTO/RPO

  • RPO (Recovery Point Objective)
    • Perte de DonnĂ©es Maximale Admissible
  • RTO (Recovery Time Objective)
    • DurĂ©e Maximale d'Interruption Admissible
  • DĂ©finissent la politique de sauvegarde/restauration
RTO et RPO

Industrialisation

  • Évaluer les coĂ»ts humains et matĂ©riels
  • IntĂ©grer les mĂ©thodes de sauvegardes avec le reste du SI
    • sauvegarde sur bande centrale
    • supervision
    • plan de continuitĂ© et de reprise d'activitĂ©

Documentation

  • Documenter les Ă©lĂ©ments clĂ©s de la politique :
    • perte de donnĂ©es
    • rĂ©tention
    • temps de rĂ©fĂ©rence
  • Documenter les processus de sauvegarde et restauration
  • Imposer des rĂ©visions rĂ©gulières des procĂ©dures

Points d'attention

  • Externaliser les sauvegardes
  • Stocker plusieurs copies
    • de prĂ©fĂ©rence dans des endroits diffĂ©rents
  • Sauvegarder les fichiers de configuration
  • Tester la restauration

Sauvegardes logiques

  • Extraction Ă  chaud des donnĂ©es dans un fichier
  • Photo des donnĂ©es au dĂ©but de l'opĂ©ration
    • quelle que soit la durĂ©e de la sauvegarde
    • restauration Ă  cet Ă©tat
  • Large choix d'options pour sĂ©lectionner les donnĂ©es

Outils

  • Dump
    • pg_dump extrait le contenu d'une base en texte (SQL) ou binaire
    • pg_dumpall extrait une instance en totalitĂ© au format texte
  • Restore
    • psql exĂ©cute le SQL des dumps au format texte
    • pg_restore restaure un dump binaire dans une base

Formats

Format Dump Restore

plain (ou SQL)

pg_dump -Fp ou pg_dumpall

psql

tar

pg_dump -Ft

pg_restore

custom

pg_dump -Fc

pg_restore

directory

pg_dump -Fd

pg_restore

Limites

  • Restaurations partielles très difficiles avec le format plain (SQL)
  • Limite inhĂ©rente au format tar POSIX pour les versions antĂ©rieures Ă  la 9.5
  • ParallĂ©lisation du dump seulement possible avec le format directory (9.3+)
  • Sauvegarde de la dĂ©finition des objets globaux seulement possible avec pg_dumpall
  • Pas de support des formats binaires par pg_dumpall

=> il faut combiner pg_dump et pg_dumpall pour avoir la sauvegarde la plus flexible.

Avantages

  • Simple et rapide Ă  mettre en Ĺ“uvre
  • Sans interruption de service
  • IndĂ©pendante de la version de PostgreSQL
  • GranularitĂ© de sĂ©lection Ă  l'objet
  • Ne conserve pas la fragmentation des tables et des index

Inconvénients

  • DurĂ©e d'exĂ©cution dĂ©pendante des donnĂ©es et de l'activitĂ©
  • Efficace pour des volumĂ©tries infĂ©rieures Ă  200 Go
  • Restauration Ă  l'instant du dĂ©marrage de l'export uniquement
  • Impose d'utiliser plusieurs outils pour sauvegarder une instance complète
  • NĂ©cessite de recalculer les statistiques de l'optimiseur, les FSM et VM des tables Ă  la restauration

Options de connexion

  • -h / $PGHOST / socket Unix
  • -p / $PGPORT / 5432
  • -U / $PGUSER / utilisateur du système
  • -d / $PGDATABASE / utilisateur de connexion
  • Gestion des mots de passe
    • pas d'option en ligne de commande
    • $PGPASSWORD
    • .pgpass

Impact des privilèges

  • Les outils se comportent comme des clients pour PostgreSQL
  • PrĂ©fĂ©rer un rĂ´le super-utilisateur autorisĂ© dans pg_hba.conf
  • Dans le cas contraire
    • la connexion Ă  la/aux base(s) de donnĂ©es doit ĂŞtre autorisĂ©e
    • le rĂ´le doit pouvoir lire le contenu de tous les objets Ă  exporter

pg_dump - Options

  • Base de donnĂ©es : -d ou en fin de commande
  • Format : -F (p, t, c, d)
  • Fichier de sortie : -f chemin, sortie standard sinon
  • SĂ©lection : -a, -s, -n, -N, -t, -T, -O, -x, --section
  • Compression : -Z 0-9
  • ParallĂ©lisme (format directory, 9.3+) : -j jobs

pg_dumpall - Options

  • Limiter le dump aux donnĂ©es globales (rĂ´les et tablespaces) : -g
  • Limiter le dump aux rĂ´les : -r
  • Limiter le dump aux tablespaces : -t
  • SĂ©lection : -a, -s, -O, -x

psql

  • Client standard capable d'exĂ©cuter du SQL au format texte (plain)
  • -f permet de spĂ©cifier l'emplacement du fichier dump
  • -1 permet d'exĂ©cuter la restauration en une transaction
    • -v ON_ERROR_ROLLBACK=ON : faire un rollback en cas d'erreur et continuer la restauration
    • -v ON_ERROR_STOP=ON : arrĂŞter l'exĂ©cution Ă  la première erreur (rollback complet)

pg_restore - Options

  • Attention : -f indique un fichier de sortie
    • Le dump est indiquĂ© en fin de ligne de commande
    • EntrĂ©e standard sinon
  • Format : -F (t, c, d), dĂ©tectĂ© automatiquement
  • SĂ©lection : -a, -I, -n, -O, -P, -s, -t, -T, -x, --section
  • Transaction : -1

pg_restore - Base de données

  • -d indique la base de donnĂ©es de connexion
  • Avec -C (crĂ©er la base de donnĂ©es cible)
    • pg_restore se connecte (-d) et exĂ©cute CREATE DATABASE
    • pg_restore se connecte Ă  la nouvelle base et exĂ©cute le SQL
  • Sans -C
    • pg_restore se connecte (-d) et exĂ©cute le SQL
  • Sans -d
    • pg_restore affiche le SQL (permet de dĂ©bugger)

pg_restore - Table des matières

  • Pour les sĂ©lections plus complexes
    • obtenir la table des matières avec -l
    • choisir les Ă©lĂ©ments Ă  restaurer
    • fournir la liste avec -L liste.txt
  • Les dĂ©pendances doivent ĂŞtre respectĂ©es

Sauvegardes physiques Ă  froid

  • Une sauvegarde Ă  froid impose l'arrĂŞt de l'instance
  • Outils système Ă  utiliser pour sauvegarder et restaurer
  • L'instance complète doit ĂŞtre sauvegardĂ©e :
    • PGDATA
    • tous les tablespaces
    • journaux de transactions (fichiers WAL)
    • fichiers de configuration

Outils

  • Outils au niveau système de fichiers
  • Non spĂ©cifiques Ă  PostgreSQL
  • Pour rĂ©duire la durĂ©e d'interruption de service :
    • rsync Ă  chaud, puis rsync Ă  froid
    • snapshots des systèmes de fichiers

Avantages

  • Simple et rapide
  • De nombreux outils disponibles
  • Efficace pour les fortes volumĂ©tries

Inconvénients

  • ArrĂŞt de la production
  • Sauvegarde de l'instance complète Ă  un instant t
  • Conservation de la fragmentation
  • Impossible de changer d'architecture ou de version

Sauvegardes physiques Ă  chaud et PITR

  • Sauvegarde en deux parties :
    • les fichiers de donnĂ©es
    • les journaux de transactions archivĂ©s
  • PostgreSQL archive les journaux de transactions
  • L'administrateur rĂ©alise une copie des fichiers de donnĂ©es
  • Point In Time Recovery : on applique les transactions archivĂ©es jusqu'Ă  un point donnĂ©

Le mode recovery

  • PostgreSQL Ă©crit les donnĂ©es deux fois :
    • d'abord dans les journaux de transactions (fichiers WAL)
    • puis dans les fichiers de donnĂ©es de manière asynchrone
  • En cas d'arrĂŞt brutal, les journaux de transactions sont rejouĂ©s sur les fichiers de donnĂ©es
    • il s'agit du mode recovery
    • le rejeu des transactions permet de retourner Ă  l'Ă©tat cohĂ©rent
  • Le contrĂ´le du mode recovery permet le PITR

Archivage des journaux de transaction

  • Choisir le rĂ©pertoire d'archivage
  • Configurer PostgreSQL, dans postgresql.conf :
    • wal_level : replica ou logical
    • archive_mode : on ou always
    • archive_command : texte de la commande
    • archive_timeout : temps en secondes
  • RedĂ©marrer l'instance si wal_level et archive_mode ont changĂ©, recharger sinon

Sauvegarde Ă  chaud / basebackup

  • L'archivage doit fonctionner sans erreur
  • Se connecter et exĂ©cuter SELECT pg_start_backup('label', true);
  • Copier l'ensemble des fichiers de l'instance :
    • fichiers de donnĂ©es ($PGDATA) et de configuration
    • tablespaces
  • Mais ignorer :
    • fichier postmaster.pid
    • rĂ©pertoires log, pg_wal, pg_replslot
  • Se connecter et exĂ©cuter SELECT pg_stop_backup();

Restauration PITR - fichiers de données

  • Restaurer les fichiers et rĂ©pertoires suivants :
    • $PGDATA
    • les tablespaces (mettre Ă  jour $PGDATA/pg_tblspc si nĂ©cessaire)
    • fichiers de configuration
  • Ne pas restaurer les fichiers suivants :
    • fichiers WAL de l'instance, i.e. $PGDATA/pg_wal (on restaurera les WAL archivĂ©s)
    • fichiers postmaster.pid et postmaster.opts
    • traces si elles sont incluses

Restauration PITR - recovery.conf

  • PostgreSQL restaure lui-mĂŞme les WAL archivĂ©s au dĂ©marrage
  • L'instance doit pouvoir accĂ©der aux fichiers WAL archivĂ©s
  • CrĂ©er le fichier $PGDATA/recovery.conf :
    • restore_command
    • recovery target settings : recovery_target_* parameters
    • Standby server settings

Restauration PITR : différentes timelines

  • En fin de recovery, la timeline change
    • l'historique des donnĂ©es prend une autre voie
    • le nom des WAL change pour Ă©viter d'Ă©craser des archives suivant le point d'arrĂŞt
    • l'aiguillage est inscrit dans un fichier .history, archivĂ©
  • Permet de faire plusieurs restaurations PITR Ă  partir du mĂŞme basebackup
  • recovery_target_timeline permet de choisir la timeline Ă  suivre

Restauration PITR : illustration des timelines

Les timelines

Adapter la configuration

  • postgresql.conf
    • port
    • listen_addresses
    • data_directory
    • …
  • pg_hba.conf

Avantages

  • Sauvegarde sans interruption de service
  • Restauration Ă  la transaction près
  • Efficace pour les fortes volumĂ©tries

Inconvénients

  • Restauration de l'instance complète
  • Conservation de la fragmentation
  • Impossible de changer d'architecture ou de version
  • Point dans le temps souvent difficile Ă  trouver

Écriture d'un script de sauvegarde

  • Un script de sauvegarde doit :
    • ĂŞtre testĂ©
    • ĂŞtre documentĂ©
    • gĂ©rer la sauvegarde dans son intĂ©gralitĂ©
    • gĂ©rer les cas d'erreur

Points d'attention

  • Le script de sauvegarde doit au minimum :
    • ĂŞtre commentĂ©
    • ĂŞtre versionnĂ©
    • renvoyer un code d'erreur diffĂ©rent de zĂ©ro si un problème est survenu
    • permettre de tracer les diffĂ©rentes Ă©tapes de la sauvegarde
    • annuler la sauvegarde en cours en cas d'erreur
    • gĂ©nĂ©rer des sauvegardes valides (il convient donc de les tester)

Documenter le script

  • La documentation devrait :
    • dĂ©tailler l'architecture de sauvegarde
    • expliquer le fonctionnement du script (options, …)
    • ses dĂ©pendances (logiciels, points de montage, …)
    • ĂŞtre relue et validĂ©e par toute l'Ă©quipe
    • permettre de trouver la documentation associĂ©e Ă  la restauration

Spécificités d'un script de sauvegarde logique

  • pg_dumpall -g : dĂ©finition des rĂ´les et des tablespaces
  • pg_dump : contenu de chaque base de donnĂ©es
  • Restent la dĂ©finition des configurations des bases et les ACL…
  • Attention aux fichiers de configuration

Spécificités d'un script de sauvegarde PITR - Archivage des WALs

  • PrĂ©requis : configurer l'archivage des WAL
  • La commande d'archivage peut ĂŞtre un script
    • dans ce cas, attention Ă  bien tester les codes de retour !
  • Utiliser pg_start_backup() et pg_stop_backup()
    • mĂŞme en cas d'utilisation d'un mĂ©canisme de snapshot (virtualisation, baie…)

Spécificités d'un script de sauvegarde PITR - la copie

  • Laisser le temps Ă  pg_start_backup() de terminer avant de dĂ©marrer la sauvegarde
  • Ne pas oublier de fichiers lors de la copie (tablespaces, …)
  • Laisser le temps Ă  pg_stop_backup() de terminer avant de dĂ©clarer la sauvegarde valide
  • Penser Ă  sauvegarder et rĂ©fĂ©rencer les WAL archivĂ©s rĂ©fĂ©rencĂ©s dans le .backup

Spécificités d'un script de sauvegarde PITR - rétention

  • GĂ©rer une pĂ©riode de rĂ©tention pour les sauvegardes ET les WAL archivĂ©s
  • attention Ă  bien conserver tous les fichiers WAL archivĂ©s nĂ©cessaires Ă  la restauration

Écriture d'un script de restauration

  • Un script de restauration doit :
    • ĂŞtre testĂ©
    • ĂŞtre documentĂ©
    • permettre la restauration intĂ©grale de l'instance
    • dĂ©tecter et signaler les erreurs rencontrĂ©es

Points d'attention

  • Le script de restauration doit au minimum :
    • ĂŞtre commentĂ©
    • ĂŞtre versionnĂ©
    • faire un rĂ©capitulatif des actions effectuĂ©es et demander validation
    • renvoyer un code d'erreur diffĂ©rent de zĂ©ro si un problème est survenu
    • permettre de tracer les diffĂ©rentes Ă©tapes de la restauration
    • remettre l'instance dans un Ă©tat complètement fonctionnel

Documenter le script

  • La documentation devrait
    • donner succintement et clairement l'usage du script
    • expliquer dans le dĂ©tail le fonctionnement du script (commandes utilisĂ©es, …)
    • dĂ©tailler les impacts (donnĂ©es Ă©crasĂ©es dans un rĂ©pertoire, …)
    • ses dĂ©pendances (logiciels, points de montage, …)
    • ĂŞtre relue et validĂ©e par toute l'Ă©quipe
    • ĂŞtre facile Ă  trouver dans une version Ă  jour (ne pas l'imprimer !)

Spécificités d'un script de restauration logique

  • Laisser pg_restore dĂ©tecter le format des dump binaires
  • N'automatiser que les restaurations rĂ©currentes
  • Demander des confirmations de façon interactive pour les suppressions de donnĂ©es
  • Utiliser les modes verbeux des commandes pour tracer l'exĂ©cution

Spécificités d'un script de restauration PITR

  • Utiliser la date et heure de fin pour choisir le basebackup Ă  utiliser
    • le point d'arrĂŞt dans le temps doit ĂŞtre après le point de cohĂ©rence
    • on peut utiliser le backup_label archivĂ© pour obtenir le STOP TIME du backup
  • Restaurer le rĂ©pertoire de donnĂ©es et les tablespaces
  • Configurer au moins restore_command dans $PGDATA/recovery.conf
  • Laisser Ă  l'utilisateur le soin de dĂ©marrer l'instance

Conclusion

  • Les techniques de sauvegarde de PostgreSQL sont :
    • complĂ©mentaires
    • automatisables
  • La maĂ®trise de ces techniques est indispensable pour assurer un service fiable.

Travaux Pratiques

PostgreSQL : Outils de sauvegarde

PostgreSQL

Introduction

  • 2 mĂ©canismes de sauvegarde natifs et robustes
  • Industrialisation fastidieuse
  • Des outils existent !!

Au menu

  • PrĂ©sentation:
    • pg_back
    • pg_basebackup
    • Barman
    • pitrery
  • Comment choisir ?

DĂ©finition du besoin - Contexte

  • Sauvegarde locale (ex. NFS) ?
  • Copie vers un serveur tiers (push) ?
  • Sauvegarde distante initiĂ©e depuis un serveur tiers (pull) ?
  • Ressources Ă  disposition ?
  • Accès SSH ?
  • OS ?
  • Sauvegardes physiques ? Logiques ?
  • Version de PostgreSQL ?
  • Politique de rĂ©tention ?

pg_back - Présentation

  • Type de sauvegardes: logiques (pg_dump)
  • Langage: bash
  • Licence: BSD (libre)
  • Type de stockage: local
  • Planification: crontab
  • OS: Unix/Linux
  • Compression: gzip
  • Versions compatibles: toutes
  • RĂ©tention: durĂ©e en jour

pg_basebackup - Présentation

  • Outil intĂ©grĂ© Ă  PostgreSQL
  • PrĂ©vu pour crĂ©er une instance secondaire
  • Permet les sauvegardes PITR

pg_basebackup - Formats de sauvegarde

  • plain
    • arborescence identique Ă  l'instance sauvegardĂ©e
  • tar
    • archive, permet la compression

pg_basebackup - Avantages

  • Sauvegarde possible Ă  partir d'un secondaire
  • Transfert des WAL pendant la sauvegarde
  • DĂ©bit configurable
  • Relocalisation des tablespaces
  • Écriture d'un recovery.conf
    • prĂ©vu pour la rĂ©plication

pg_basebackup - Limitations

  • Configuration de type rĂ©plication nĂ©cessaire
  • Pas de configuration de l'archivage
  • Pas d'association WAL archivĂ©s / sauvegarde
  • Pas de gestion de la restauration
  • Pas de politique de rĂ©tention

Barman - Présentation générale

  • 2ndQuadrant IT
  • Langage: python 2.6/2.7
  • OS: Unix/Linux
  • Versions compatibles: >= 8.3
  • License: GPL3 (libre)
  • Type d'interface: CLI (ligne de commande)

Barman - Diagramme

Architecture barman

Barman - Sauvegardes

  • Type de sauvegardes: physiques/PITR (Ă  chaud)
  • Type de stockage: local ou pull (rsync/ssh)
  • Planification: crontab
  • MĂ©thode: pg_start_backup() / rsync / pg_stop_backup()
  • IncrĂ©mentales: rsync + hardlink
  • Compression des WAL

Barman - Sauvegardes (suite)

  • Limitation du dĂ©bit rĂ©seau lors des transferts
  • Compression des donnĂ©es lors des transferts via le rĂ©seau
  • Sauvegardes concurrentes via l'extension pgespresso
    • sans l'extension Ă  partir de PostgreSQL 9.6
  • Hook pre/post sauvegarde
  • Hook pre/post archivage WAL
  • Compression WAL : gzip, bzip2, pigz, pbzip2, etc..
  • Pas de compression des donnĂ©es (sauf WAL)

Barman - Politique de rétention

  • DurĂ©e (jour/semaine)
  • Nombre de sauvegardes

Barman - Restauration

  • Locale ou Ă  distance
  • Point dans le temps: date, identifiant de transaction, timeline ou point de restauration

Barman - Installation

  • AccĂ©der au dĂ©pĂ´t communautaire PGDG
  • Installer le paquet barman

Barman - Utilisation

usage: barman [-h] [-v] [-c CONFIG] [-q] [-d] [-f {console}]
              {cron,list-server,show-server,status,check,diagnose,
              backup,list-backup,how-backup,list-files,recover,
              delete,rebuild-xlogdb}
[...]
optional arguments:
  -h, --help     show this help message and exit
  -v, --version  show program's version number and exit
  -c CONFIG, --config CONFIG
                 uses a configuration file (...)
  -q, --quiet    be quiet (default: False)
  -d, --debug    debug output (default: False)
  -f {console}, --format {console}
                 output format (default: console)

Barman - Configuration

  • /etc/barman.conf
  • Format INI
  • Configuration gĂ©nĂ©rale dans la section [barman]
  • Chaque instance Ă  sauvegarder doit avoir sa propre section
  • Un fichier de configuration par instance via la directive:
configuration_files_directory = /etc/barman.d

Barman - Configuration utilisateur

  • Utilisateur système barman

Barman - Configuration SSH

  • Utilisateur postgres pour les serveurs PostgreSQL
  • Utilisateur barman pour le serveur de sauvegardes
  • GĂ©nĂ©rer les clefs SSH (RSA) des utilisateurs système postgres (serveurs PG) et barman (serveur barman)
  • Échanger les clefs SSH public entre les serveurs PostgreSQL et le serveur de sauvegarde
  • Établir manuellement une première connexion SSH entre chaque machine

Barman - Configuration PostgreSQL

  • Adapter la configuration de l'archivage dans le fichier postgresql.conf :
wal_level = 'replica'
archive_mode = on
archive_command = 'rsync -a %p barman@bkpsrv:<INCOMING_WALS_DIR>/%f'

Barman - Configuration globale

  • Fichier barman.conf
  • Section [barman] pour la configuration globale
[barman]
barman_home = /var/lib/barman
barman_user = barman
log_file = /var/log/barman/barman.log
log_level = INFO
configuration_files_directory = /etc/barman.d

Barman - Configuration sauvegardes

  • Configuration globale des options de sauvegarde
compression = gzip
reuse_backup = link
immediate_checkpoint = false
basebackup_retry_times = 0
basebackup_retry_sleep = 30
backup_options = exclusive_backup

Barman - Configuration réseau

  • PossibilitĂ© de rĂ©duire la bande passante
  • Et de compresser le trafic rĂ©seau
  • Exemple
bandwidth_limit = 4000
network_compression = false

Barman - Configuration rétention

  • Configuration de la rĂ©tention en nombre de sauvegardes
  • Et en « fenĂŞtre de restauration », en jours, semaines ou mois
  • DĂ©clenchement d'une erreur en cas de sauvegarde trop ancienne
  • Exemple
minimum_redundancy = 5
retention_policy = RECOVERY WINDOW OF 7 DAYS
last_backup_maximum_age = 2 DAYS

Barman - Configuration des hooks

  • Lancer des scripts avant ou après les sauvegardes
  • Et avant ou après le traitement du WAL archivĂ© par Barman
  • Exemple
pre_backup_script = ...
post_backup_script = ...
pre_archive_script = ...
post_archive_script = ...

Barman - Configuration par instance

  • configuration_files_directory
    • un fichier de configuration par instance
  • Ou une section par instance

Barman - Exemple configuration par instance

  • Section spĂ©cifique par instance
  • Permet d'adapter la configuration aux diffĂ©rentes instances
  • Exemple
[pgsrv]
description = "PostgreSQL Instance pgsrv"
ssh_command = ssh postgres@pgsrv
conninfo = host=pgsrv user=postgres dbname=postgres
backup_directory =
basebackup_directory =
wals_directory =
incoming_wals_directory =

Barman - VĂ©rification de la configuration

  • La commande show-server montre la configuration
$ sudo -u barman barman show-server {<instance> | all}
  • La commande check effectue des tests pour la valider
$ sudo -u barman barman check {<instance> | all}

Barman - Statut

  • La commande status affiche des informations dĂ©taillĂ©es
    • sur la configuration Barman
    • sur l'instance spĂ©cifiĂ©e
  • Exemple
$ sudo -u barman barman status {<instance> | all}

Barman - Diagnostiquer

  • La commande diagnose renvoie
    • les informations renvoyĂ©es par la commande status
    • des informations supplĂ©mentaires (sur le système par exemple)
    • au format json
  • Exemple
$ sudo -u barman barman diagnose

Barman - Nouvelle sauvegarde

  • Pour dĂ©clencher une nouvelle sauvegarde
$ sudo -u barman barman backup {<instance> | all}
  • Le dĂ©tail de sauvegarde effectuĂ©e est affichĂ© en sortie

Barman - Lister les sauvegardes

  • Pour lister les sauvegardes existantes
$ sudo -u barman barman list-backup {<instance> | all}
  • Affiche notamment la taille de la sauvegarde et des WAL associĂ©s

Barman - DĂ©tail d'une sauvegarde

  • show-backup affiche le dĂ©tail d'une sauvegarde (taille...)
$ sudo -u barman barman show-backup <instance> <ID-sauvegarde>
  • list-files affiche le dĂ©tail des fichiers d'une sauvegarde
$ sudo -u barman barman list-files <instance> <ID-sauvegarde>

Barman - Suppression d'une sauvegarde

  • Pour supprimer manuellement une sauvegarde
$ sudo -u barman barman delete <instance> <ID-sauvegarde>
  • Renvoie une erreur si la redondance minimale ne le permet pas

Barman - Tâches de maintenance

  • La commande Barman cron dĂ©clenche la maintenance
    • rĂ©cupĂ©ration des WAL archivĂ©s
    • compression
    • politique de rĂ©tention
  • Exemple
$ sudo -u barman barman cron
  • Ă€ planifier pour une exĂ©cution rĂ©gulière
    • par exemple avec la crontab Linux

Barman - Restauration

  • Copie/transfert de la sauvegarde
  • Copie/transfert des journaux de transactions
  • GĂ©nĂ©ration du fichier recovery.conf
  • Copie/transfert des fichiers de configuration

Barman - Options de restauration

  • Locale ou Ă  distance
  • Cibles : timeline, date, ID de transaction ou point de restauration
  • DĂ©placement des tablespaces

Barman - Exemple de restauration Ă  distance

  • Exemple d'une restauration
    • dĂ©clenchĂ©e depuis le serveur Barman
    • avec un point dans le temps spĂ©cifiĂ©
$ sudo -u barman barman recover                   \
    --remote-ssh-command "ssh postgres@pgsrv"     \
    --target-time "2015-09-02 14:15:00"           \
    pgsrv 20150902T095027 /var/lib/pgsql/9.4/main

pitrery - Présentation générale

  • R&D Dalibo
  • Langage : bash
  • OS : Unix/Linux
  • Versions compatibles : >= 8.2
  • License : BSD (libre)
  • Type d'interface : CLI (ligne de commande)

pitrery - Diagramme

Architecture pitrery

pitrery - Sauvegardes

  • Type de sauvegarde : physiques/PITR
  • Type de stockage : locale ou distant (push) via rsync/ssh
  • Planification : crontab
  • MĂ©thodes : pg_start_backup() / rsync ou tar / pg_stop_backup()
  • Compression : gzip, bzip2, pigz, pbzip2, etc.
  • Compression des WAL
  • Scripts pre/post sauvegarde (hooks)
  • DĂ©duplication de fichier (rsync + lien matĂ©riel)

pitrery - Politique de rétention

  • DurĂ©e (en jours)
  • Nombre de sauvegardes

pitrery - Restauration

  • Ă€ partir des donnĂ©es locales ou distantes
  • Point dans le temps : date

pitrery - Installation

  • TĂ©lĂ©chargement depuis le site du projet
    • installation depuis les sources (tarball)
    • paquets RPM et DEB disponibles

pitrery - Utilisation

usage: pitrery [options] action [args]
options:
    -c file      Path to the configuration file
    -n           Show the command instead of executing it
    -V           Display the version and exit
    -?           Print help

actions:
    list
    backup
    restore
    purge

pitrery - Configuration PostgreSQL

  • Adapter l'archivage dans le fichier postgresql.conf
archive_mode = on
wal_level = replica
archive_command = '/usr/local/bin/archive_xlog %p'

pitrery - Configuration SSH

  • Stockage des sauvegardes sur un serveur distant
  • GĂ©nĂ©rer les clefs SSH (RSA) des utilisateurs système postgres sur chacun des serveurs (nĹ“ud PG et serveur de sauvegarde)
  • Échanger les clefs SSH publiques entre les serveurs PostgreSQL et le serveur de sauvegarde
  • Établir manuellement une première connexion SSH entre chaque serveur

pitrery - Fichier de configuration

  • Emplacement par dĂ©faut: /usr/local/etc/pitrery/pitr.conf
  • PossibilitĂ© de spĂ©cifier un autre emplacement

pitrery - Configuration connexion PostgreSQL

  • Options de connexion Ă  l'instance
PGPSQL="psql"
PGUSER="postgres"
PGPORT=5432
PGHOST="/var/run/postgresql"
PGDATABASE="postgres"

pitrery - Localisation

  • Configurer les emplacements
  • Pour l'instance Ă  sauvegarder
PGDATA="/var/lib/pgsql/9.4/data"
PGXLOG=
  • Pour la destination des sauvegardes
BACKUP_DIR="/var/lib/pitrery"
  • Pour la destination des WAL archivĂ©s
ARCHIVE_DIR="$BACKUP_DIR/archived_xlog"

pitrery - Configuration du mode de sauvegarde

  • Paramètre de configuration STORAGE
  • Deux modes possibles :
    • tar : sauvegarde complète, Ă©ventuellement compressĂ©e
    • rsync : sauvegarde complète ou diffĂ©rentielle, pas de compression

pitrery - Configuration de la rétention

  • Configuration de la rĂ©tention en nombre de sauvegardes
PURGE_KEEP_COUNT=3
  • Ou en jours
PURGE_OLDER_THAN=7
  • Les deux paramètres peuvent ĂŞtre combinĂ©s

pitrery - Configuration de l'archivage

  • L'archivage peut ĂŞtre configurĂ© pour :
    • archiver en local (montage NFS...)
    • archiver vers un serveur distant en SSH
  • Exemple
ARCHIVE_LOCAL="no"
ARCHIVE_HOST=bkpsrv
ARCHIVE_USER=pitrery
ARCHIVE_COMPRESS="yes"
  • UtilisĂ© par la commande archive_xlog

pitrery - Configuration de la compression

  • Configuration de la compression
    • des WAL archivĂ©s par la commande archive_xlog
    • des sauvegardes effectuĂ©es au format tar
  • Exemple
COMPRESS_BIN=
COMPRESS_SUFFIX=
UNCOMPRESS_BIN=
BACKUP_COMPRESS_BIN=
BACKUP_COMPRESS_SUFFIX=
BACKUP_UNCOMPRESS_BIN=

pitrery - Configuration des traces

  • Activer l'horodatage des traces
LOG_TIMESTAMP="yes"
  • Utiliser syslog pour les traces de l'archivage (archive_xlog)
SYSLOG="no"
SYSLOG_FACILITY="local0"
SYSLOG_IDENT="postgres"

pitrery - Configuration de hooks

  • ExĂ©cuter un script avant ou après une sauvegarde
PRE_BACKUP_COMMAND=
POST_BACKUP_COMMAND=

pitrery - Effectuer une sauvegarde

  • Pour dĂ©clencher une nouvelle sauvegarde
$ sudo -u postgres /usr/local/bin/pitrery backup
  • La plupart des paramètres peuvent ĂŞtre surchargĂ©s
  • Par exemple, l'option -s permet de spĂ©cifier un mode, tar ou rsync

pitrery - Suppression des sauvegardes obsolètes

  • Suppression des sauvegardes et archives ne satisfaisant plus la politique de sauvegarde
$ sudo -u postgres /usr/local/bin/pitrery purge
  • Ă€ dĂ©clencher systĂ©matiquement après une sauvegarde

pitrery - Lister les sauvegardes

  • Lister les sauvegardes prĂ©sentes et leur taille
$ sudo -u postgres /usr/local/bin/pitrery list
  • L'option -v permet d'avoir plus de dĂ©tails
    • mode de sauvegarde
    • date minimale utilisable pour la restauration
    • taille de chaque tablespace

pitrery - Planification

  • Pas de planificateur intĂ©grĂ©
    • le plus simple est d'utiliser cron
  • Exemple
00 00 * * * (   /usr/local/bin/pitrery backup                  \
             && /usr/local/bin/pitrery purge)                  \
  >> /var/log/postgresql/pitrery-$(date +\%Y-\%m-\%d).log 2>&1

pitrery - Restauration

  • Effectuer une restauration
$ sudo -u postgres /usr/local/bin/pitrery restore
  • Nombreuses options Ă  la restauration, notamment
    • l'option -D permet de modifier la cible du PGDATA
    • l'option -t permet de modifier la cible d'un tablespace
    • l'option -x permet de modifier la cible du pg_wal
    • l'option -d permet de spĂ©cifier une date de restauration

Autres outils de l'écosystème

  • De nombreux autres outils existent
  • Moins importants que les prĂ©cĂ©dents
    • rĂ©pondant Ă  des problĂ©matiques plus spĂ©cifiques
    • parfois anciens et potentiellement obsolètes
    • ou très rĂ©cents et pas encore stables

pgBackMan - présentation

  • Gestion de sauvegardes logiques
  • FonctionnalitĂ©s limitĂ©s
  • DĂ©veloppement arrĂŞtĂ©

walmgr - présentation

  • Simplifie la rĂ©plication Warm Standby
  • Membre de la suite Skytools
  • Permet la gestion de sauvegardes PITR
    • manque de fonctionnalitĂ©s
    • dĂ©veloppement arrĂŞtĂ©

WAL-E - présentation

  • Gestion de sauvegardes PITR
  • Focus sur le stockage en cloud
  • PossibilitĂ©s de restauration limitĂ©es
    • pas de gĂ©nĂ©ration du recovery.conf
    • pas de re-crĂ©ation des liens vers les tablespaces

pg_rman - présentation

  • Gestion de sauvegardes PITR
  • DĂ©veloppĂ© par NTT
  • Peu de documentation
  • Peu d'exemples d'utilisation connus

OmniPITR - présentation

  • Gestion de l'archivage et du basebackup
  • Mise en place de rĂ©plication par log-shipping
  • Outil obsolète :
    • gestion du log-shipping en interne depuis PostgreSQL 9.0 (2010)
    • pas de gĂ©nĂ©ration de recovery.conf

pgBackRest - présentation

  • Gestion de sauvegardes PITR
  • IndĂ©pendant des commandes système
    • utilise un protocole dĂ©diĂ©
  • Sauvegardes complètes, diffĂ©rentielles ou incrĂ©mentales
  • Gestion du multi-thread
  • Projet rĂ©cent (2014), non stabilisĂ©

Conclusion

  • Des outils pour vous aider!
  • Pratiquer, pratiquer et pratiquer
  • Superviser les sauvegardes!

Travaux Pratiques

PostgreSQL : Gestion d'un sinistre

PostgreSQL

Introduction

  • Une bonne politique de sauvegardes est cruciale
    • mais elle n'empĂŞche pas les incidents
  • Il faut ĂŞtre prĂŞt Ă  y faire face

Au menu

  • Anticiper les dĂ©sastres
  • RĂ©agir aux dĂ©sastres
  • Rechercher l'origine du problème
  • Outils utiles
  • Cas type de dĂ©sastres

Anticiper les désastres

  • Un dĂ©sastre peut toujours survenir
  • Il faut savoir le dĂ©tecter le plus tĂ´t possible
    • et s'ĂŞtre prĂ©parĂ© Ă  y rĂ©pondre

Documentation

  • Documentation complète et Ă  jour
    • emplacement et frĂ©quence des sauvegardes
    • emplacement des traces
    • procĂ©dures et scripts d'exploitation
  • Sauvegarder et versionner la documentation

Procédures et scripts

  • ProcĂ©dures dĂ©taillĂ©es de restauration / PRA
    • prĂ©parer des scripts / utiliser des outils
    • minimiser le nombre d'actions manuelles
  • Tester les procĂ©dures rĂ©gulièrement
    • s'assurer que chacun les maĂ®trise
  • Sauvegarder et versionner les scripts

Supervision et historisation

  • Tout doit ĂŞtre supervisĂ©
    • rĂ©seau, matĂ©riel, système, logiciels…
    • les niveaux d'alerte doivent ĂŞtre significatifs
  • Les mĂ©triques importantes doivent ĂŞtre historisĂ©es
    • cela permet de retrouver le moment oĂą le problème est apparu
    • quand cela a un sens, faire des graphes

Automatisation

  • Des outils existent
    • Pacemaker, repmgr…
  • Automatiser une bascule est complexe
  • Cela peut mener Ă  davantage d'incidents
    • voire Ă  des dĂ©sastres importants (split brain)

Réagir aux désastres

  • Savoir identifier un problème majeur
  • Bons rĂ©flexes
  • Mauvais rĂ©flexes

Symptômes d'un désastre

  • Crash de l'instance
  • RĂ©sultats de requĂŞtes erronnĂ©s
  • Messages d'erreurs dans les traces
  • DĂ©gradation importante des temps d'exĂ©cution
  • Processus manquants
    • ou en court d'exĂ©cution depuis trop longtemps

Bons réflexes 1

  • Garder la tĂŞte froide
  • RĂ©partir les tâches clairement
  • Minimiser les canaux de communication
  • Garder des notes de chaque action entreprise

Bons réflexes 2

  • Se prĂ©munir contre une aggravation du problème
    • couper les accès applicatifs
  • Si une corruption est suspectĂ©e
    • arrĂŞter immĂ©diatement l'instance
    • faire une sauvegarde immĂ©diate des fichiers
    • travailler sur une copie

Bons réflexes 3

  • DĂ©terminer le moment de dĂ©marrage du dĂ©sastre
  • Adopter une vision gĂ©nĂ©rale plutĂ´t que focalisĂ©e sur un dĂ©tail
  • Remettre en cause chaque Ă©lĂ©ment de l'architecture
    • aussi stable (et/ou coĂ»teux/complexe) soit-il
  • Éliminer en prioritĂ© les causes possibles cĂ´tĂ© hardware, système
  • Isoler le comportement prĂ©cis du problème
    • identifier les requĂŞtes / tables / index impliquĂ©s

Bons réflexes 4

  • En cas de dĂ©faillance matĂ©rielle, s'assurer de travailler sur du hardware sain et non affectĂ© !!!

Bons réflexes 5

  • Communiquer, ne pas rester isolĂ©
  • Demander de l'aide si le problème est trop complexe
    • autres Ă©quipes
    • support
    • forums
    • listes

Bons réflexes 6

  • DĂ©rouler les procĂ©dures comme prĂ©vu
  • En cas de situation non prĂ©vue, s'arrĂŞter pour faire le point
    • ne pas hĂ©siter Ă  remettre en cause l'analyse
    • ou la procĂ©dure elle-mĂŞme

Bons réflexes 7

  • En cas de bug avĂ©rĂ©
    • tenter de le cerner et de le reproduire au mieux
    • le signaler Ă  la communautĂ© de prĂ©fĂ©rence en dĂ©taillant le moyen de le reproduire

Bons réflexes 8

  • Tester complètement l'intĂ©gritĂ© des donnĂ©es
    • pour dĂ©tecter tous les problèmes
    • pour valider après restauration / correction

Mauvais réflexes 1

  • Paniquer
  • Prendre une dĂ©cision hâtive
    • exemple, supprimer des fichiers du rĂ©pertoire pg_wal
  • Lancer une commande sans la comprendre
    • exemple, pg_resetwal

Mauvais réflexes 2

  • ArrĂŞter le diagnostic quand les symptĂ´mes disparaissent
  • Ne pas pousser l'analyse jusqu'au bout

Mauvais réflexes 3

  • Ne pas documenter
    • le rĂ©sultat de l'investigation
    • les actions effectuĂ©es

Rechercher l'origine du problème

  • Quelques pistes de recherche pour cerner le problème
  • Liste non exhaustive

Prérequis

  • Avant de commencer Ă  creuser
    • rĂ©fĂ©rencer les symptĂ´mes
    • identifier au mieux l'instant de dĂ©marrage du problème

Recherche d'historique

  • Ces symptĂ´mes ont-ils dĂ©jĂ  Ă©tĂ© rencontrĂ©s dans le passĂ© ?
  • Ces symptĂ´mes ont-ils dĂ©jĂ  Ă©tĂ© rencontrĂ©s par d'autres ?
  • Attention Ă  ne pas prendre les informations trouvĂ©es pour argent comptant !

Matériel

  • VĂ©rifier le système disque (SAN, carte RAID, disques)
  • Rechercher toute erreur matĂ©rielle
  • Firmwares pas Ă  jour
    • ou rĂ©cemment mis Ă  jour
  • MatĂ©riel rĂ©cemment changĂ©

Virtualisation

  • Problèmes de mutualisation des ressources
  • Configuration du stockage virtualisĂ©
  • Rechercher toute erreur sur l'hĂ´te / la console d'administration
  • Mises Ă  jour non appliquĂ©es
    • ou appliquĂ©es rĂ©cemment
  • Modifications de configuration rĂ©centes

Système d'exploitation 1

  • Erreurs dans les traces
  • Mises Ă  jour système non appliquĂ©es
  • Modifications de configuration rĂ©centes

Système d'exploitation 2

  • OpĂ©ration d'IO impossible
    • FS plein ?
    • FS montĂ© en lecture seule ?
  • Tester l'Ă©criture sur PGDATA
  • Tester la lecture sur PGDATA

Système d'exploitation 3

  • Consommation excessive des ressources
    • OOM killer
  • Après un crash, vĂ©rifier les processus actifs
    • ne pas tenter de redĂ©marrer si des processus persistent

PostgreSQL

  • Relever les erreurs dans les traces
    • ou messages inhabituels
  • VĂ©rifier les mises Ă  jour mineures

Paramétrage de PostgreSQL 1

  • La dĂ©sactivation de certains paramètres est dangereuse
    • fsync
    • full_page_write

Paramétrage de PostgreSQL 2

  • Option --data-checksums de initdb
  • Disponible depuis PostgreSQL 9.3
  • DĂ©tecte les corruptions silencieuses
    • au prix d'un impact sur les performances

Erreur de manipulation

  • Traces système, traces PostgreSQL
  • Revue des dernières manipulations effectuĂ©es
  • Historique des commandes

Outils

  • Quelques outils peuvent aider
    • Ă  diagnostiquer la nature du problème
    • Ă  valider la correction apportĂ©e
    • Ă  appliquer un contournement
  • ATTENTION
    • certains de ces outils peuvent corrompre les donnĂ©es !

Outils - pg_controldata

  • Fournit des informations de contrĂ´le sur l'instance
  • Ne nĂ©cessite pas que l'instance soit dĂ©marrĂ©e

Outils - export/import de données

  • pg_dump
  • pg_dumpall
  • COPY
  • psql / pg_restore

Outils - pageinspect

  • Extension
  • Vision du contenu d'un bloc
  • Sans le dictionnaire, donc sans dĂ©codage des donnĂ©es
  • Affichage brut
  • UtilisĂ© surtout en debug, ou dans les cas de corruption
  • Fonctions de dĂ©codage pour heap (table), bt (btree), entĂŞte de page, et FSM
  • NĂ©cessite de connaĂ®tre le code de PostgreSQL

Outils - pg_resetwal

  • Efface les WAL courants
  • Permet Ă  l'instance de dĂ©marrer en cas de corruption d'un WAL
    • comme si elle Ă©tait dans un Ă©tat cohĂ©rent
    • ce qui n'est pas le cas
  • Cet outil est dangereux !!!
  • Utiliser cet outil va corrompre des donnĂ©es

Cas type de désastres

  • Les cas suivants sont assez rares
  • Ils nĂ©cessitent gĂ©nĂ©ralement une restauration
  • Certaines manipulations Ă  haut risque sont possibles
    • mais complètement dĂ©conseillĂ©es !

Avertissement

  • PrivilĂ©gier une solution fiable (restauration, bascule)
  • Les actions listĂ©es ici sont destructives
  • La plupart peuvent (et vont) provoquer des incohĂ©rences
  • Travailler sur une copie

Corruption de blocs dans des index

  • Messages d'erreur lors des accès par l'index
  • DonnĂ©es diffĂ©rentes entre un indexscan et un seqscan
  • Supprimer et recrĂ©er l'index (REINDEX)

Corruption de blocs dans des tables 1

  • Cas plus problĂ©matique
  • Restauration probablement nĂ©cessaire

Corruption de blocs dans des tables 2

  • Le paramètre zero_damaged_pages peut aider
  • Des donnĂ©es vont certainement ĂŞtre perdues

Corruption de blocs dans des tables 3

  • Si la corruption est importante, l'accès au bloc peut faire crasher l'instance
  • Il est tout de mĂŞme possible de rĂ©initialiser le bloc
    • identifier le fichier Ă  l'aide de pg_relation_filepath()
    • trouver le bloc avec ctid / pageinspect
    • rĂ©initialiser le bloc avec dd
    • il faut vraiment ne pas avoir d'autre choix

Corruption des WAL 1

  • SituĂ©s dans le rĂ©pertoire pg_wal
  • Les WAL sont nĂ©cessaires au recovery
  • DĂ©marrage impossible s'ils sont corrompus ou manquants
  • Si les fichiers WAL ont Ă©tĂ© archivĂ©s, les rĂ©cupĂ©rer
  • Sinon, la restauration est la seule solution viable

Corruption des WAL 2

  • pg_resetwal permet de forcer le dĂ©marrage
  • ATTENTION !!!
    • cela va provoquer des pertes de donnĂ©es
    • des corruptions de donnĂ©es sont Ă©galement probables
    • ce n'est pas une action corrective !

Corruption du fichier de contrĂ´le

  • Fichier global/pg_control
  • Contient les informations liĂ©es au dernier checkpoint
  • Sans lui, l'instance ne peut pas dĂ©marrer
  • Restauration nĂ©cessaire

Corruption du CLOG

  • Fichier contenu dans pg_xact
  • Statut des diffĂ©rentes transactions
  • Son altĂ©ration risque de causer des incohĂ©rences

Corruption du catalogue système

  • Le catalogue contient la dĂ©finition du schĂ©ma
  • Sans lui, les donnĂ©es sont inaccessibles
  • Situation très dĂ©licate

Conclusion

  • Les dĂ©sastres peuvent arriver
  • Il faut s'y ĂŞtre prĂ©parĂ©
  • Faites des sauvegardes !
    • et testez les

Travaux Pratiques