PostgreSQL et la streaming replication
jdl_2016-05
jdl_2016-05
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>PostgreSQL</strong> <strong>et</strong> <strong>la</strong><br />
<strong>streaming</strong> <strong>replication</strong><br />
Stefan Fercot<br />
19 mai 2016
Sommaire<br />
• <strong>PostgreSQL</strong>, c’est quoi ?<br />
• Instal<strong>la</strong>tion<br />
• Fonctionnement interne<br />
• Méthodes de sauvegarde (dumps, point-in-time recovery, <strong>streaming</strong> <strong>replication</strong>)<br />
• Streaming <strong>replication</strong> : r<strong>et</strong>our d’expérience d’utilisation dans un environnement de<br />
type « cluster »<br />
• Quelques chiffres des volumétries gérées
<strong>PostgreSQL</strong>, c’est quoi ?
<strong>PostgreSQL</strong><br />
• Système de base de données libre<br />
• Au sein des différentes communautés libres, <strong>PostgreSQL</strong> est souvent utilisé comme<br />
exemple à différents niveaux<br />
• qualité du code<br />
• indépendance des développeurs <strong>et</strong> gouvernance du proj<strong>et</strong><br />
• réactivité de <strong>la</strong> communauté<br />
• stabilité <strong>et</strong> puissance du logiciel<br />
• Tous ces atouts font que <strong>PostgreSQL</strong> est désormais reconnu <strong>et</strong> adopté par des milliers de<br />
grandes sociétés de par le monde
Histoire<br />
• L'origine du nom <strong>PostgreSQL</strong> remonte à <strong>la</strong> base de données Ingres, développée à l'université de Berkeley<br />
par Michael Stonebraker. En 1985, il prend <strong>la</strong> décision de reprendre le développement à partir de zéro <strong>et</strong><br />
nomme ce nouveau logiciel Postgres, comme raccourci de post-Ingres.<br />
• En 1995, avec l'ajout du support du <strong>la</strong>ngage SQL, postgres fut renommé Postgres95 puis <strong>PostgreSQL</strong>.<br />
• Aujourd'hui, le nom officiel est “<strong>PostgreSQL</strong>” (prononcez “post - gresse - Q - L”). Cependant, le nom<br />
“Postgres” est accepté comme alias.<br />
• http://www.postgresql.org/about/history
Communauté<br />
• ~ 2000 : Communauté japonaise (aujourd’hui plus de 3000 membres)<br />
• 2004 : Communauté francophone (http://www.postgresql.fr/)<br />
• 2006 : « Software in the Public Interest »<br />
• 2007 : Communauté italienne<br />
• 2008 : <strong>PostgreSQL</strong> Europe <strong>et</strong> US<br />
• 2009 : Boom des PGDay
Versions<br />
• 2010 : v9.0 → réplication intégrée<br />
• version 9.1.22, 9.2.17, 9.3.13, 9.4.8, 9.5.3<br />
• http://www.postgresql.org/support/versioning/
Références<br />
• Sponsors<br />
• http://www.postgresql.org/about/sponsors/<br />
• Skype, VMware, Dalibo, Fujitsu, RedHat<br />
• Utilisateurs clé<br />
• http://www.postgresql.org/about/users/<br />
• U.S. General Services Administration, Apple, Cisco,…<br />
• Yahoo, Instagram, Za<strong>la</strong>ndo, TripAdvisor<br />
• Le Bon Coin (http://www.postgresqlfr.org/temoignages:le_bon_coin)
Instal<strong>la</strong>tion
Méthodes<br />
• Sources<br />
• Doc : http://docs.postgresql.fr/9.5/instal<strong>la</strong>tion.html<br />
• Téléchargement : http://www.postgresql.org/download/<br />
• Yum<br />
• Doc : https://wiki.postgresql.org/wiki/YUM_Instal<strong>la</strong>tion
• Instal<strong>la</strong>tion moteur<br />
• Création utilisateur<br />
• Création du répertoire de données<br />
• Démarrage<br />
Etapes
Yum
Fonctionnement interne
PGdata
Configuration<br />
• pg_hba.conf : règles d'authentification<br />
• pg_ident.conf : configuration mécanisme d'authentification extérieur<br />
• postgresql.conf : paramétrage
Mémoire<br />
• Données en cache : shared_buffers<br />
• Mémoire de travail des transactions : work_mem
WAL<br />
• Write Ahead Logs, (appelés parfois WAL ou XLOG)<br />
• Journaux de transactions<br />
• Garantie contre les pertes de données<br />
• Modification de données sur disque en 2 temps<br />
• Mécanisme d’archivage/recyc<strong>la</strong>ge<br />
• http://www.dalibo.org/glmf108_postgresql_<strong>et</strong>_ses_journaux_de_transactions
Checkpoint<br />
• Processus s’assurant que tous les fichiers de données, écrits sur le disque,<br />
ont été mis à jour pour refléter l'information des journaux de transaction<br />
• checkpoint_timeout = 15min<br />
• checkpoint_compl<strong>et</strong>ion_targ<strong>et</strong> = 0.9
ACID<br />
• Atomicité (Atomic)<br />
• Une transaction est entière : « tout ou rien ».<br />
• Cohérence (Consistent)<br />
• Une transaction amène le système d'un état stable à un autre.<br />
• Iso<strong>la</strong>tion (Iso<strong>la</strong>ted)<br />
• Les transactions n'agissent pas les unes sur les autres.<br />
• Durabilité (Durable)<br />
• Une transaction validée provoque des changements permanents.
MultiVersion Concurrency Control (MVCC)<br />
• MVCC (Multi Version Concurrency Control) est le mécanisme interne de<br />
<strong>PostgreSQL</strong> utilisé pour garantir <strong>la</strong> cohérence des données lorsque plusieurs<br />
processus accèdent simultanément à <strong>la</strong> même table.<br />
• Chaque transaction travaille dans son image de <strong>la</strong> base, cohérent du début à <strong>la</strong> fin<br />
de ses opérations.<br />
• Une lecture ne bloque pas une écriture<br />
• Une écriture ne bloque pas une lecture<br />
• Une écriture ne bloque pas les autres écritures…<br />
• … sauf pour <strong>la</strong> mise à jour de <strong>la</strong> même ligne.
Méthodes de sauvegarde
Méthodes<br />
• Sauvegarde à froid des fichiers (ou physique)<br />
• Sauvegarde à chaud en SQL (ou logique)<br />
• Sauvegarde à chaud des fichiers (PITR)
pg_dump<br />
• Sauvegarde une base de données à chaud<br />
• Sauvegarde complète ou partielle<br />
• pg_dump est l'outil le plus utilisé pour sauvegarder une base de données<br />
<strong>PostgreSQL</strong><br />
• pg_dump b1 > b1.dump<br />
• sauvegardera <strong>la</strong> base b1 de l'instance locale sur le port 5432 dans un fichier b1.dump
Point In Time Recovery<br />
• Sauvegarde traditionnelle<br />
• sauvegarde pg_dump à chaud<br />
• sauvegarde des fichiers à froid<br />
• Insuffisant pour les grosses bases<br />
• long à sauvegarder<br />
• encore plus long à restaurer<br />
• Perte de données potentiellement importante<br />
• car impossible de réaliser fréquemment une sauvegarde
Point In Time Recovery<br />
• Les journaux de transactions contiennent toutes les modifications<br />
• Il faut les archiver<br />
• … <strong>et</strong> avoir une image des fichiers à un instant t<br />
• La restauration se fait en restaurant c<strong>et</strong>te image<br />
• … <strong>et</strong> en rejouant les journaux<br />
• entièrement<br />
• partiellement (ie, jusqu'à un certain moment)<br />
• PITR = archivage continu <strong>et</strong> récupération d'un instantané
Point In Time Recovery<br />
• archive_command = 'cp %p /mnt/backup/WAL/%f‘<br />
• archive_timeout = 900<br />
• archive_mode = on<br />
• wal_level = archive
Streaming <strong>replication</strong><br />
• Serveur standby (read-only) se connecte au primaire<br />
• Serveur primaire envoie au standby les enregistrements de WAL dès qu'ils<br />
sont générés, sans attendre qu'un fichier de WAL soit rempli<br />
• Archivage ou wal_keep_segments en cas de forte désynchronisation<br />
• Asynchrone par défaut
Streaming <strong>replication</strong>
Streaming <strong>replication</strong>
Streaming <strong>replication</strong><br />
• Etape 1<br />
• Créer dossier partagé entre les serveurs maître-esc<strong>la</strong>ve<br />
• Etape 2<br />
• Créer utilisateur <strong>PostgreSQL</strong> pour <strong>la</strong> réplication<br />
• sudo -u postgres createuser -SRD --<strong>replication</strong> -P <strong>replication</strong><br />
• Autoriser l’accès dans pg_hba.conf<br />
• host <strong>replication</strong> <strong>replication</strong> IP_esc<strong>la</strong>ve/32 md5
Streaming <strong>replication</strong><br />
• Etape 3<br />
• Modifier postgresql.conf sur le maître<br />
• listen_addresses = '*'<br />
• hot_standby = on<br />
• wal_level = hot_standby<br />
• archive_mode = on<br />
• archive_command = 'cp %p /DIR/%f‘ #Répertoire DIR partagé entre les serveurs maître-esc<strong>la</strong>ve<br />
• archive_timeout = 900<br />
• max_wal_senders=5<br />
• wal_keep_segments = 32<br />
• wal_sender_timeout = 60s
Streaming <strong>replication</strong><br />
• Etape 4<br />
• Initier <strong>la</strong> réplication sur l’esc<strong>la</strong>ve<br />
• systemctl stop postgresql-9.5<br />
• rm -rf /PGdata/*<br />
• pg_basebackup -h IP_maître -U <strong>replication</strong> -D PGdata -X stream -P
Streaming <strong>replication</strong><br />
• Créer recovery.conf sur l’esc<strong>la</strong>ve<br />
• standby_mode = 'on'<br />
• primary_conninfo = 'host=IP_maître port=5432 user=<strong>replication</strong> password=xxx application_name=NAME'<br />
• restore_command = 'cp /DIR/%f %p'<br />
• recovery_targ<strong>et</strong>_timeline = '<strong>la</strong>test'<br />
• archive_cleanup_command = 'pg_archivecleanup /DIR %r'<br />
#Répertoire DIR partagé entre les serveurs maître-esc<strong>la</strong>ve
R<strong>et</strong>our d’expérience
Streaming <strong>replication</strong><br />
• Utilisation dans un environnement de type « cluster »<br />
• Haute-disponibilité<br />
• Bascule automatique des ressources avec RHEL cluster<br />
• http://cluster<strong>la</strong>bs.org/wiki/PgSQL_Replicated_Cluster
Streaming <strong>replication</strong>
Quelques chiffres des volumétries gérées<br />
• Le Bon Coin : ~3To (160 cœurs, 1To RAM)<br />
• Max 250Go, moyenne 150Go, accroissement annuel 30Go<br />
• Exemples<br />
• 200Go : 24 cpu (6 cores physiques * 2 logique * 2 hyper-threading), 96G ram<br />
• 250Go : 8 vcpu, 40G ram. 200-500 iops
Demo
Sources<br />
• Formations http://www.dalibo.com/<br />
• http://docs.postgresql.fr<br />
• http://cluster<strong>la</strong>bs.org/wiki/PgSQL_Replicated_Cluster
Questions ?