Brown Bag Lunch sur inviation chez Novapost pour présenter les axes de réflexions pour la gestion de la montée en charge de PostgreSQL. Présentations de différents axes de travail afin d
1. PostgreSQL quatre ans après
Rodolphe Quiédeville
Novapost
21 mai 2014
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 1 / 43
2. Axes de travail
10 axes de travail pour améliorer les performances et monter en
charge en étant serein.
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 2 / 43
3. Axes de travail
10 axes de travail pour améliorer les performances et monter en
charge en étant serein.
pgtune
hardware
tablespaces
replication
connection pooler
vaccum
materialized views
partitionnement
index
query
???
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 2 / 43
5. pgtune
Script d’optimisation des paramètres de postgresql.conf. L’étape
numéro une de toute optimisation.
utilisation
pgtune -i /etc/postgresql/9.1/main/postgresql.conf
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 4 / 43
6. pgtune
Fait des propositions d’adaptation des paramètres de configuration au
matériel
Postulat
pgtune considère qu’un seul cluster tourne sur la machine et que
celle-ci est dédiée au serveur de base de données
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 5 / 43
7. pgtune
Fait des propositions d’adaptation des paramètres de configuration au
matériel
Postulat
pgtune considère qu’un seul cluster tourne sur la machine et que
celle-ci est dédiée au serveur de base de données
Restart
certains paramètres nécessite un redémarrage pour leur prise en
compte
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 5 / 43
8. pgtune
Sortie du script
Example
#custom_variable_classes = ’’ # list of custom variable class names
default_statistics_target = 50
maintenance_work_mem = 176MB
constraint_exclusion = on
checkpoint_completion_target = 0.9
effective_cache_size = 2GB
work_mem = 18MB
wal_buffers = 8MB
checkpoint_segments = 16
shared_buffers = 704MB
max_connections = 80
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 6 / 43
10. hardware
PostgreSQL a plusieurs flux de lecture/écriture, il faut en profiter tant
que faire se peut.
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 8 / 43
11. hardware
PostgreSQL a plusieurs flux de lecture/écriture, il faut en profiter tant
que faire se peut.
plusieurs disques
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 8 / 43
12. hardware
PostgreSQL a plusieurs flux de lecture/écriture, il faut en profiter tant
que faire se peut.
plusieurs disques
plusieurs contrôlleurs
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 8 / 43
13. hardware
PostgreSQL a plusieurs flux de lecture/écriture, il faut en profiter tant
que faire se peut.
plusieurs disques
plusieurs contrôlleurs
RAID10 au lieu de RAID5
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 8 / 43
14. hardware
PostgreSQL a plusieurs flux de lecture/écriture, il faut en profiter tant
que faire se peut.
plusieurs disques
plusieurs contrôlleurs
RAID10 au lieu de RAID5
les WAL d’un coté les données de l’autre
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 8 / 43
16. Tablespace
Les tablespaces permettent de définir l’emplacement dans le système
de fichiers où seront stockés les fichiers représentant les objets de la
base de données.
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 10 / 43
17. Tablespace
Les tablespaces permettent de définir l’emplacement dans le système
de fichiers où seront stockés les fichiers représentant les objets de la
base de données.
séparer les tables des index
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 10 / 43
18. Tablespace
Les tablespaces permettent de définir l’emplacement dans le système
de fichiers où seront stockés les fichiers représentant les objets de la
base de données.
séparer les tables des index
séparer les tables d’archives des données fraiches
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 10 / 43
19. Tablespace
Les tablespaces permettent de définir l’emplacement dans le système
de fichiers où seront stockés les fichiers représentant les objets de la
base de données.
séparer les tables des index
séparer les tables d’archives des données fraiches
lier les spécificités physique du stockage à l’utilisation logique des
données (session en SSD)
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 10 / 43
20. Tablespace
Création
CREATE TABLESPACE espace_rapide LOCATION ’/mnt/sda1/postgresql/data’;
Création de la table
CREATE TABLE foo(i int) TABLESPACE espace1;
Le déplacement de données existantes est également possible.
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 11 / 43
23. replication
Vaste programme. La réplication est un des sujets les plus discutés
des bases de données à ce jour.
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 14 / 43
24. replication
Vaste programme. La réplication est un des sujets les plus discutés
des bases de données à ce jour.
synchrone/asynchrone
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 15 / 43
25. replication
Vaste programme. La réplication est un des sujets les plus discutés
des bases de données à ce jour.
synchrone/asynchrone
warn/hot standby
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 15 / 43
26. replication
Vaste programme. La réplication est un des sujets les plus discutés
des bases de données à ce jour.
synchrone/asynchrone
warn/hot standby
single/multi master
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 15 / 43
27. replication
Vaste programme. La réplication est un des sujets les plus discutés
des bases de données à ce jour.
synchrone/asynchrone
warn/hot standby
single/multi master
granularité au niveau table
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 15 / 43
28. replication
Vaste programme. La réplication est un des sujets les plus discutés
des bases de données à ce jour.
synchrone/asynchrone
warn/hot standby
single/multi master
granularité au niveau table
incore/middleware (pgpool-II)
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 15 / 43
29. replication
Vaste programme. La réplication est un des sujets les plus discutés
des bases de données à ce jour.
synchrone/asynchrone
warn/hot standby
single/multi master
granularité au niveau table
incore/middleware (pgpool-II)
Warning
La réplication est simple à mettre en oeuvre, la gérer au jour le jour est
un travail de tous les jours.
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 16 / 43
31. connection pooler
L’utilisation d’un pooler de connection est intéressant quand un grand
nombre de connections sont créees pour de courtes durées. Un
pooler peut aussi être intéressant conjointement avec une réplication.
pgbouncer
pgpool-II
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 18 / 43
33. vaccum
La commande VACUUM doit traiter chaque table régulièrement pour
plusieurs raisons :
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 20 / 43
34. vaccum
La commande VACUUM doit traiter chaque table régulièrement pour
plusieurs raisons :
pour récupérer ou ré-utiliser l’espace disque occupé par les lignes
supprimées ou mises à jour
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 20 / 43
35. vaccum
La commande VACUUM doit traiter chaque table régulièrement pour
plusieurs raisons :
pour récupérer ou ré-utiliser l’espace disque occupé par les lignes
supprimées ou mises à jour
pour mettre à jour les statistiques utilisées par l’optimiseur de
PostgreSQL
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 20 / 43
36. vaccum
La commande VACUUM doit traiter chaque table régulièrement pour
plusieurs raisons :
pour récupérer ou ré-utiliser l’espace disque occupé par les lignes
supprimées ou mises à jour
pour mettre à jour les statistiques utilisées par l’optimiseur de
PostgreSQL
pour mettre à jour la carte de visibilité qui accélère les parcours
d’index seuls
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 20 / 43
37. vaccum
La commande VACUUM doit traiter chaque table régulièrement pour
plusieurs raisons :
pour récupérer ou ré-utiliser l’espace disque occupé par les lignes
supprimées ou mises à jour
pour mettre à jour les statistiques utilisées par l’optimiseur de
PostgreSQL
pour mettre à jour la carte de visibilité qui accélère les parcours
d’index seuls
pour prévenir la perte des données les plus anciennes à cause
d’un cycle de l’identifiant de transaction (XID) ou d’un cycle de
l’identifiant de multixact.
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 20 / 43
38. vaccum
La commande VACUUM doit traiter chaque table régulièrement pour
plusieurs raisons :
pour récupérer ou ré-utiliser l’espace disque occupé par les lignes
supprimées ou mises à jour
pour mettre à jour les statistiques utilisées par l’optimiseur de
PostgreSQL
pour mettre à jour la carte de visibilité qui accélère les parcours
d’index seuls
pour prévenir la perte des données les plus anciennes à cause
d’un cycle de l’identifiant de transaction (XID) ou d’un cycle de
l’identifiant de multixact.
autovaccum
Si vous ne savez pas à quoi sert autovaccum, laissez faire
autovaccum.
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 21 / 43
40. Vues matérialisées
Le meilleur de la table et de la vue.
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 23 / 43
41. Vues matérialisées
Le meilleur de la table et de la vue. Les meilleures alliées des
business analyst.
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 24 / 43
42. Vues matérialisées
Le meilleur de la table et de la vue. Les meilleures alliées des
business analyst.
se crée comme une vue
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 24 / 43
43. Vues matérialisées
Le meilleur de la table et de la vue. Les meilleures alliées des
business analyst.
se crée comme une vue
crée une table physique
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 24 / 43
44. Vues matérialisées
Le meilleur de la table et de la vue. Les meilleures alliées des
business analyst.
se crée comme une vue
crée une table physique
porte ses propres index
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 24 / 43
45. Vues matérialisées
Le meilleur de la table et de la vue. Les meilleures alliées des
business analyst.
se crée comme une vue
crée une table physique
porte ses propres index
scinde les flux de requêtes
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 24 / 43
46. Vues matérialisées
Le meilleur de la table et de la vue. Les meilleures alliées des
business analyst.
se crée comme une vue
crée une table physique
porte ses propres index
scinde les flux de requêtes
doit être mise à jour suivant les besoins !
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 24 / 43
47. Vues matérialisées
Le meilleur de la table et de la vue. Les meilleures alliées des
business analyst.
se crée comme une vue
crée une table physique
porte ses propres index
scinde les flux de requêtes
doit être mise à jour suivant les besoins !
le REFRESH prend un ACCESS EXCLUSIVE LOCK (corrigé en
9.4)
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 24 / 43
48. Vues matérialisées
Le meilleur de la table et de la vue. Les meilleures alliées des
business analyst.
se crée comme une vue
crée une table physique
porte ses propres index
scinde les flux de requêtes
doit être mise à jour suivant les besoins !
le REFRESH prend un ACCESS EXCLUSIVE LOCK (corrigé en
9.4)
New !
A partir de PostgreSQL 9.3
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 24 / 43
49. Vues matérialisées
Création
CREATE MATERIALIZED VIEW resume_ventes AS
SELECT
no_vendeur,
date_facture,
sum(mtt_facture)::numeric(13,2) as mtt_ventes
FROM facture
WHERE date_facture < CURRENT_DATE
GROUP BY
no_vendeur,
date_facture
ORDER BY
no_vendeur,
date_facture;
CREATE UNIQUE INDEX ventes_resume_vendeur
ON sales_summary (no_vendeur, date_facture);
Mise à jour
REFRESH MATERIALIZED VIEW resume_ventes;
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 25 / 43
51. partitionnement
Le partitionnement fait référence à la division d’une table logique
volumineuse en plusieurs parties physiques plus petites.
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 27 / 43
52. partitionnement
Le partitionnement fait référence à la division d’une table logique
volumineuse en plusieurs parties physiques plus petites.
utilise l’héritage de table
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 27 / 43
53. partitionnement
Le partitionnement fait référence à la division d’une table logique
volumineuse en plusieurs parties physiques plus petites.
utilise l’héritage de table
partitionnement par échelon
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 27 / 43
54. partitionnement
Le partitionnement fait référence à la division d’une table logique
volumineuse en plusieurs parties physiques plus petites.
utilise l’héritage de table
partitionnement par échelon
partitionnement par liste
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 27 / 43
55. partitionnement
Création table maître
SQL
CREATE TABLE mesure (
id_ville int not null,
date_trace date not null,
temperature int,
ventes int
);
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 28 / 43
56. partitionnement
Création des tables filles avec contraintes
SQL
CREATE TABLE mesure_a2006m02 (
CHECK ( date_trace >= DATE ’2006-02-01’ AND date_trace < DATE
’2006-03-01’ )
) INHERITS (mesure);
CREATE TABLE mesure_a2006m03 (
CHECK ( date_trace >= DATE ’2006-03-01’ AND date_trace < DATE
’2006-04-01’ )
) INHERITS (mesure);
...
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 29 / 43
57. partitionnement
Création des index
SQL
CREATE INDEX mesure_a2006m02_date_trace ON mesure_a2006m02 (date_trace);
CREATE INDEX mesure_a2006m03_date_trace ON mesure_a2006m03 (date_trace);
...
CREATE INDEX mesure_a2007m11_date_trace ON mesure_a2007m11 (date_trace);
CREATE INDEX mesure_a2007m12_date_trace ON mesure_a2007m12 (date_trace);
CREATE INDEX mesure_a2008m01_date_trace ON mesure_a2008m01 (date_trace);
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 30 / 43
58. partitionnement
Création des trigger
SQL
CREATE OR REPLACE FUNCTION mesure_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO mesure_a2008m01 VALUES (NEW.*);
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
SQL
CREATE TRIGGER insert_mesure_trigger
BEFORE INSERT ON mesure
FOR EACH ROW EXECUTE PROCEDURE mesure_insert_trigger();
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 31 / 43
59. partitionnement
Attention à l’utilisation
SQL
rodo@[local]:5432 rodo=> explain select * from mesure ;
QUERY PLAN
--------------------------------------------------------------------------
Append (cost=0.00..55.40 rows=3541 width=16)
-> Seq Scan on mesure (cost=0.00..0.00 rows=1 width=16)
-> Seq Scan on mesure_a2006m02 (cost=0.00..27.70 rows=1770 width=16)
-> Seq Scan on mesure_a2006m03 (cost=0.00..27.70 rows=1770 width=16)
(4 rows)
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 32 / 43
61. index
Il s’avère que la seule chose que les développeurs doivent
connaître est l’indexation. En fait, l’indexation d’une base de
données est un travail de développeurs car l’information la
plus importante pour une bonne indexation ne se situe ni au
niveau de la configuration du système de stockage ni dans la
configuration du matériel, mais plutôt au niveau de
l’application :
« comment l’application cherche ses données ».
Markus Winand - http://use-the-index-luke.com/fr
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 34 / 43
62. index
Trop d’index nuit à la performance. Mettre à jour un index qui n’est
jamais lu n’est pas forcément nécessaire.
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 35 / 43
63. index
Trop d’index nuit à la performance. Mettre à jour un index qui n’est
jamais lu n’est pas forcément nécessaire.
SQL
indexrelname | idx_scan | idx_tup_read | idx_tup_fetch
--------------------+----------+--------------+---------------
job_job_fkposte_id | 0 | 0 | 0
job_job_region_id | 0 | 0 | 0
job_job_company_id | 43 | 323 | 305
job_job_author_id | 0 | 0 | 0
job_job_pkey | 22968 | 22930 | 22911
(5 rows)
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 35 / 43
65. query
La ré-écriture des requêtes et le travail coté application
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 37 / 43
66. query
La ré-écriture des requêtes et le travail coté application
la requête la plus rapide est celle qui n’est pas éxecutée
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 37 / 43
67. query
La ré-écriture des requêtes et le travail coté application
la requête la plus rapide est celle qui n’est pas éxecutée
rien ne sert de ré-écrire les index si les requêtes ne les utilisent
pas
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 37 / 43
68. query
La ré-écriture des requêtes et le travail coté application
la requête la plus rapide est celle qui n’est pas éxecutée
rien ne sert de ré-écrire les index si les requêtes ne les utilisent
pas
certains axes d’optimisation ne sont pas compatible avec les
framework mal conçus
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 37 / 43
71. schema
Last but not least, le schema reste la source numéro un des
problèmes de performance et de montée en charge.
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 40 / 43
72. schema
Last but not least, le schema reste la source numéro un des
problèmes de performance et de montée en charge.
table
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 40 / 43
73. schema
Last but not least, le schema reste la source numéro un des
problèmes de performance et de montée en charge.
table
view
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 40 / 43
74. schema
Last but not least, le schema reste la source numéro un des
problèmes de performance et de montée en charge.
table
view
index
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 40 / 43
75. schema
Last but not least, le schema reste la source numéro un des
problèmes de performance et de montée en charge.
table
view
index
"les jointures c’est bon mangez-en"
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 40 / 43
77. Conclusion
Tout modification structurelle doit s’accompagner d’un processus de
validation itératif.
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 42 / 43
78. Conclusion
Tout modification structurelle doit s’accompagner d’un processus de
validation itératif.
1 rédaction d’un protocole de test avec son jeu de données
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 42 / 43
79. Conclusion
Tout modification structurelle doit s’accompagner d’un processus de
validation itératif.
1 rédaction d’un protocole de test avec son jeu de données
2 mesure des indicateurs
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 42 / 43
80. Conclusion
Tout modification structurelle doit s’accompagner d’un processus de
validation itératif.
1 rédaction d’un protocole de test avec son jeu de données
2 mesure des indicateurs
3 modification d’un paramètre
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 42 / 43
81. Conclusion
Tout modification structurelle doit s’accompagner d’un processus de
validation itératif.
1 rédaction d’un protocole de test avec son jeu de données
2 mesure des indicateurs
3 modification d’un paramètre
4 mesure des même indicateurs
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 42 / 43
82. Conclusion
Tout modification structurelle doit s’accompagner d’un processus de
validation itératif.
1 rédaction d’un protocole de test avec son jeu de données
2 mesure des indicateurs
3 modification d’un paramètre
4 mesure des même indicateurs
5 analyse des résultats
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 42 / 43
83. Conclusion
Tout modification structurelle doit s’accompagner d’un processus de
validation itératif.
1 rédaction d’un protocole de test avec son jeu de données
2 mesure des indicateurs
3 modification d’un paramètre
4 mesure des même indicateurs
5 analyse des résultats
6 goto 3 | 1
Rodolphe Quiédeville (Freelance) PostgreSQL quatre ans après 21 mai 2014 42 / 43