Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output...

59
1 Dans les coulisses d’une infrastructure hautement disponible PG Day France – 19 Juin 2019

Transcript of Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output...

Page 1: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

1

Dans les coulisses d’uneinfrastructure hautement disponible

PG Day France – 19 Juin 2019

Page 2: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

2

Auteur

• Julien Riou

• DBA depuis 2012

• Tech lead dans l’équipe databases à OVH depuis 2015

• pgterminate @ github

PG Day France – 19 Juin 2019 Auteur

Page 3: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

3

Sommaire

• Contexte

• Haute disponibilité

• Sauvegardes et restaurations

• Business intelligence

• Mises à jour

• La suite

PG Day France – 19 Juin 2019 Sommaire

Page 4: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

4PG Day France – 19 Juin 2019 Contexte

Page 5: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

5

Produits

Cloud

Serveurs dédiés

VPS

Public cloud

Private cloud

Stockage

Web hosting

Noms de domaine

Hébergement web et sites

Solutions E-mail

SSL / CDN

Office & Solutions Microsoft

Platform

Kubernetes

Logs & Metrics Data Platforms

Databases

Big data

AI & Machine Learning

Télécom

Offres Internet

Téléphonie

SMS / Fax

Bureau virtuel

OverTheBox

PG Day France – 19 Juin 2019 Contexte

Page 6: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

6

PérimètreBases internes

60 3000 700 400

Clusters Applications Utilisateurs Bases de

données

PG Day France – 19 Juin 2019 Contexte

Page 7: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

7

Réagir vite

PG Day France – 19 Juin 2019 Haute disponibilité

Page 8: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

8

En cas de panne

• Monitoring

• Développeurs

• Support

• Twitter

PG Day France – 19 Juin 2019 Haute disponibilité

Page 9: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

9

Cluster type

• MySQL

• PostgreSQL

PG Day France – 19 Juin 2019 Haute disponibilité

Page 10: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

10

Promotion automatique

• Patroni

– Zalando

– Opensource

– Python

PG Day France – 19 Juin 2019 Haute disponibilité

Page 11: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

11

PromotionElection de leaderPassage en mode sécurité

APIRépartition de charge

Gestion dynamique de la configuration

RéplicationGestion automatiqueReprise après panne

PG Day France – 19 Juin 2019 Haute disponibilité

Page 12: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

12

Promotion

PG Day France – 19 Juin 2019 Haute disponibilité

Page 13: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

13

Promotion

PG Day France – 19 Juin 2019 Haute disponibilité

Page 14: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

14

Promotion

PG Day France – 19 Juin 2019 Haute disponibilité

Page 15: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

15

Automatiser les opérations

PG Day France – 19 Juin 2019 Haute disponibilité

Page 16: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

16

Réplication

PG Day France – 19 Juin 2019 Haute disponibilité

Page 17: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

17

Réplication

PG Day France – 19 Juin 2019 Haute disponibilité

Page 18: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

18

Réplication

PG Day France – 19 Juin 2019 Haute disponibilité

Page 19: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

19

Réplication

PG Day France – 19 Juin 2019 Haute disponibilité

Page 20: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

20

Réplication

PG Day France – 19 Juin 2019 Haute disponibilité

Page 21: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

21

Rediriger le trafic

PG Day France – 19 Juin 2019 Haute disponibilité

Page 22: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

22

Répartition de charge

• HAProxy

• Patroni API

• confd

PG Day France – 19 Juin 2019 Haute disponibilité

Page 23: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

23

HAProxy

• Mode TCP

• Probes HTTPS

• 2 pools de connexion (= 2 ports)

– Lectures et écritures

– Lectures seules

• Fichier d’état

– server-state-base /var/lib/haproxy/state

– socat ${sock} - <<< "show servers state ${backend}" > /var/lib/haproxy/state/${backend}

PG Day France – 19 Juin 2019 Haute disponibilité

Page 24: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

24

Patroni API

$ curl -i -X OPTIONS https://localhost:443/primaryHTTP/1.0 200 OK$ curl -i -X OPTIONS https://localhost:443/replicaHTTP/1.0 503 Service Unavailable

PG Day France – 19 Juin 2019 Haute disponibilité

Page 25: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

25

confd

Découvre les

nodes01Crée la

configuration

HAProxy02

Vérifie la

configuration

HAProxy03

Reload le service

HAProxy04

PG Day France – 19 Juin 2019 Haute disponibilité

Page 26: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

26

Répartition de charge

$ haproxyctl show health# pxname svname status weightstats FRONTEND OPEN stats BACKEND UP 0read-write FRONTEND OPEN read-write node3 DOWN 10read-write node1 DOWN 10read-write node2 UP 10read-write BACKEND UP 10read-only FRONTEND OPEN read-only node3 DOWN 10read-only node1 UP 10read-only node2 DOWN 10read-only BACKEND UP 10

PG Day France – 19 Juin 2019 Haute disponibilité

Page 27: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

27

Répartition de charge

$ haproxyctl show health# pxname svname status weightstats FRONTEND OPEN stats BACKEND UP 0read-write FRONTEND OPEN read-write node3 DOWN 10read-write node1 DOWN 10read-write node2 UP 10read-write BACKEND UP 10read-only FRONTEND OPEN read-only node3 DOWN 10read-only node1 UP 10read-only node2 DOWN 10read-only BACKEND UP 10

PG Day France – 19 Juin 2019 Haute disponibilité

Page 28: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

28

Répartition de charge

$ haproxyctl show health# pxname svname status weightstats FRONTEND OPEN stats BACKEND UP 0read-write FRONTEND OPEN read-write node3 DOWN 10read-write node1 DOWN 10read-write node2 UP 10read-write BACKEND UP 10read-only FRONTEND OPEN read-only node3 DOWN 10read-only node1 UP 10read-only node2 DOWN 10read-only BACKEND UP 10

PG Day France – 19 Juin 2019 Haute disponibilité

Page 29: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

29

Répartition de charge

$ haproxyctl show health# pxname svname status weightstats FRONTEND OPEN stats BACKEND UP 0read-write FRONTEND OPEN read-write node3 DOWN 10read-write node1 DOWN 10read-write node2 UP 10read-write BACKEND UP 10read-only FRONTEND OPEN read-only node3 DOWN 10read-only node1 UP 10read-only node2 DOWN 10read-only BACKEND UP 10

PG Day France – 19 Juin 2019 Haute disponibilité

Page 30: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

30

Répartition de charge

$ haproxyctl show health# pxname svname status weightstats FRONTEND OPEN stats BACKEND UP 0read-write FRONTEND OPEN read-write node3 DOWN 10read-write node1 DOWN 10read-write node2 UP 10read-write BACKEND UP 10read-only FRONTEND OPEN read-only node3 DOWN 10read-only node1 UP 10read-only node2 DOWN 10read-only BACKEND UP 10

PG Day France – 19 Juin 2019 Haute disponibilité

Page 31: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

31

Répartition de charge

$ haproxyctl show backendsstats BACKEND UP 0read-write BACKEND UP 10read-only BACKEND UP 10

PG Day France – 19 Juin 2019 Haute disponibilité

Page 32: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

32

IP virtuelle

• keepalived/vrrp

• iputils-arping

• notify_master /usr/bin/arping -U -c 4 $IP

PG Day France – 19 Juin 2019 Haute disponibilité

Page 33: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

33PG Day France – 19 Juin 2019 Haute disponibilité

Page 34: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

34

Promotion automatique

Crédits : https://github.com/googlei18n/noto-emoji/blob/master/svg/emoji_u1f60c.svg

PG Day France – 19 Juin 2019 Haute disponibilité

Page 35: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

35

Promotion automatique

• Proxy non transparent

– pg_hba.conf

– Logs

• Protocole PROXY

• application_name

PG Day France – 19 Juin 2019 Haute disponibilité

Page 36: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

36

(Re)Trouver ses données

PG Day France – 19 Juin 2019 Sauvegardes et restaurations

Page 37: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

37

Sauvegardes et restaurations

• Accident logique

– DROP <objet> (DATABASE, ROLE, TABLE, …)

• Accident physique (panne hardware)

• Sauvegardes impactante (I/O, locks)

• Compatibilité avec le reste de l’infrastructure

• Pas de sauvegarde sans test de restauration

PG Day France – 19 Juin 2019 Sauvegardes et restaurations

Page 38: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

38

Sauvegardes et restaurations

PG Day France – 19 Juin 2019 Sauvegardes et restaurations

Page 39: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

39

Faciliter l’analyse

PG Day France – 19 Juin 2019 Business intelligence

Page 40: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

40

Business intelligence

• OLTP vs OLAP

– OLTP (On-line Transaction Processing)

– OLAP (On-line Analytical Processing)

• Les deux charges ne vont pas ensemble

• Comment ne pas bloquer le système operationel ?

PG Day France – 19 Juin 2019 Business intelligence

Page 41: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

41

Business intelligence

PG Day France – 19 Juin 2019 Business intelligence

Page 42: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

42

Avoir un système à jour

PG Day France – 19 Juin 2019 Mises à jour

Page 43: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

43

Mises à jour mineures

• clustershell

$ clush -bw @patroni$ clush -bw @patroni\&@cluster:69$ clush –bw node1,node2,node3Enter 'quit' to leave this interactive modeWorking with nodes: node[1-3]clush> psql -c 'show server_version;'---------------node[1-3] (3)---------------server_version----------------9.6.11(1 row)

PG Day France – 19 Juin 2019 Mises à jour

Page 44: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

44

Mises à jour mineures

• clustershell

$ clush –f 1 –bw node1,node2,node3Enter 'quit' to leave this interactive modeWorking with nodes: node[1-3]clush> apt-get upgrade -y

PG Day France – 19 Juin 2019 Mises à jour

Page 45: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

45

Mises à jour mineures

• clustershell

$ clush –bw node1,node2,node3Enter 'quit' to leave this interactive modeWorking with nodes: node[1-3]clush> psql -c 'show server_version;'---------------node[1-3] (3)---------------server_version----------------9.6.12(1 row)

PG Day France – 19 Juin 2019 Mises à jour

Page 46: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

46

2015

PostgreSQL 9.2

Debian Wheezy

Migration applicative

pg_dump 2017

PostgreSQL 9.4

Debian Jessie

Logical Decoding

Mises à jour majeures

pg_upgrade

PG Day France – 19 Juin 2019 Mises à jour

Page 47: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

47

2017

PostgreSQL 9.4

Debian Jessie

Standalone

pglogical

pg_dump

pg_upgrade

2019

PostgreSQL 9.6

Debian Stretch

Patroni

Mises à jour majeures

PG Day France – 19 Juin 2019 Mises à jour

Page 48: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

48

pglogical

• deadlocks

ERROR: deadlock detected at character 237DETAIL: Process 16477 waits for AccessShareLock on relation 17241 of database 17032; blocked by process 17333.

Process 17333 waits for AccessExclusiveLock on relation 4920800 of database17032; blocked by process 16477.

Process 16477: <application query>Process 17333: SELECT pglogical.replication_set_add_all_tables('default',

ARRAY['public']);HINT: See server log for query details.STATEMENT: <application query>

PG Day France – 19 Juin 2019 Mises à jour

Page 49: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

49

pglogical

• Charset

• Non supporté (doc)

ERROR: encoding conversion for binary datum not supported yetDETAIL: expected_encoding UTF8 must be unset or match server_encoding SQL_ASCIICONTEXT: slot "pgl_<slotname>", output plugin "pglogical_output", in the startup callbackLOG: could not receive data from client: Connection reset by peer

4.13 Database encoding differences

PGLogical does not support replication between databases with different encoding. We recommend using UTF-8 encoding in all

replicated databases.

PG Day France – 19 Juin 2019 Mises à jour

Page 50: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

50

pglogical

• Séquences

ERROR: duplicate key value violates unique constraint "table_pkey"

PG Day France – 19 Juin 2019 Mises à jour

Page 51: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

51

pg_upgrade

• Hardlinks (-k)

• Statistiques

$ vacuumdb --all --analyze-in-stages -j 10

PG Day France – 19 Juin 2019 Mises à jour

Page 52: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

52

pg_upgrade

PG Day France – 19 Juin 2019 Mises à jour

Page 53: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

53

Conclusion

PG Day France – 19 Juin 2019 Conclusion

Page 54: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

54

Conclusion

Meilleure stabilitéMeilleure disponibilité

Moins d’administrationMoins d’alertes

PG Day France – 19 Juin 2019 Conclusion

Page 55: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

55

Réversibilité

Haute disponibilité

Élasticité

Performance

Managed

Eat your own food

Bases de données externes

PG Day France – 19 Juin 2019 Conclusion

Page 56: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

56

Ensuite ?

PG Day France – 19 Juin 2019 La suite

Page 57: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

57

La suite

• Mise à jour vers PostgreSQL 12

• Mise à jour vers Debian 10

• Migration de MySQL vers PostgreSQL

• Automatisation, automatisation, automatisation !

PG Day France – 19 Juin 2019 La suite

Page 58: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

58

On recrute

• Opensource Database Engineers

• Site Reliability Engineers (Private Cloud, Openstack, DNS, Deploy, Observability)

• Software Engineers (containers, baremetal, web hosting)

• Backend Developpers (Python, Go)

• Et plus !

PG Day France – 19 Juin 2019 La suite

Page 59: Dans les coulisses d’une infrastructure hautement disponible · CONTEXT: slot "pgl_", output plugin "pglogical_output", in the startup callback LOG: could not receive

59

Questions

PG Day France – 19 Juin 2019