SlideShare uma empresa Scribd logo
1 de 27
Baixar para ler offline
2016-02-27
PostgreSQL Open Day, Rimini
Primi passi con BDR
Chris Mair
http://www.pgtraining.com
2016-02-27,PostgreSQLOpenDay,Rimini
replicazione - l'inizio
2016-02-27,PostgreSQLOpenDay,Rimini
replicazione - l'evoluzione
• 8.x - log shipping e PITR possono essere usati
per creare dei warm standby
• 9.0 - streaming replication & hot standby
• 9.1 - synchronous replication
• 9.2 - cascading replication
• 9.4 - replication slots & logical decoding
2016-02-27,PostgreSQLOpenDay,Rimini
replicazione - le alternative
• Slony (master-slave basato su trigger)
• Londiste (idem)
• Bucardo (master-slave e master-master, basato
su triggers)
• Pgpool-II (sistema ibrido: pool / load balancer /
replicatore a livello di statement / parallel query
system)
2016-02-27,PostgreSQLOpenDay,Rimini
replicazione - il futuro
• sistemi che si agganciano al logical decoding
introdotto con la 9.4
• risolve il problema del "o replico tutto o niente"
dei metodi basati su WAL (shipping o streaming)
• risolve il problema della performance e
scalability dei metodi basati su trigger
• un prodotto (recente), portato avanti da
2ndQuadrant: BDR (Bi-Directional Replication)
2016-02-27,PostgreSQLOpenDay,Rimini
BDR
• asynchronous multi-master logical replication
• molto veloce: modifiche vengono commitate sul
nodo locale prima di essere replicate
• se più nodi toccano lo stesso dato contempo-
raneamente conflitti sono inevitabili (Simon Riggs:
"The Physics of Multi-Master")
• use case ideale: sistema distribuito tra siti con
elevata latenza che vuole mettere a disposizione un
master veloce presso tutti i siti
2016-02-27,PostgreSQLOpenDay,Rimini
BDR
• BDR è un estensione PostgreSQL che richiede
dei feature che 2ndQuadrant et.al. stanno
commitando pezzo per pezzo a PostgreSQL:
• purtroppo, tuttora, anche con 9.5, c'è bisogno di
una versione patchata di PostgreSQL per BDR
• Background workers (9.3)
• Event Triggers (9.3 and 9.4)
• Replication slots (9.4)
• Logical decoding (9.4)
• Enhanced DROP event triggers (9.4)
• REPLICA IDENTITY (9.4)
• Commit Timestamps (9.5)
• Replication Origins (9.5)
• DDL Deparse hooks (9.5)
Fonte: http://blog.2ndquadrant.com/when-are-we-going-to-contribute-bdr-to-postgresql/
2016-02-27,PostgreSQLOpenDay,Rimini
BDR
• l'ultima versione disponibile ad oggi è BDR 0.9.3
per PostgreSQL (patchato) 9.4.
• docs & download:
http://bdr-project.org/docs/0.9/index.html
• abbiamo creato un setup con tre nodi seguendo
le istruzioni della versione 0.9.3
2016-02-27,PostgreSQLOpenDay,Rimini
i demo server
• tre nodi che girano sul mio portatile
2016-02-27,PostgreSQLOpenDay,Rimini
i demo server
• tre nodi che girano su macchine virtuali su un
server qui dietro
2016-02-27,PostgreSQLOpenDay,Rimini
i demo server!
(su Amazon EC2 ;)
tokyo.pgtraining.com
dublin.pgtraining.com
virginia.pgtraining.com
~ 217 ms
~ 80 ms
~ 145 ms
2016-02-27,PostgreSQLOpenDay,Rimini
i demo server
• i tre nodi hanno mutualmente la porta 5432 aperta
(firewall) e entry in pg_hba.conf per connettersi; usano
SSL (notare i tempi):
2016-02-27,PostgreSQLOpenDay,Rimini
setup dei tre nodi
# virginia
CREATE EXTENSION btree_gist;
CREATE EXTENSION bdr;
SELECT bdr.bdr_group_create(
local_node_name := 'node_virginia',
node_external_dsn := 'host=virginia.pgtraining.com dbname=pgtraining');
SELECT bdr.bdr_node_join_wait_for_ready();
# dublin (join via virginia)
CREATE EXTENSION btree_gist;
CREATE EXTENSION bdr;
SELECT bdr.bdr_group_join(
local_node_name := 'node_dublin',
node_external_dsn := 'host=dublin.pgtraining.com dbname=pgtraining',
join_using_dsn := 'host=virginia.pgtraining.com dbname=pgtraining');
SELECT bdr.bdr_node_join_wait_for_ready();
# tokyo (join via virginia)
CREATE EXTENSION btree_gist;
CREATE EXTENSION bdr;
SELECT bdr.bdr_group_join(
local_node_name := 'node_tokyo',
node_external_dsn := 'host=tokyo.pgtraining.com dbname=pgtraining',
join_using_dsn := 'host=virginia.pgtraining.com dbname=pgtraining');
SELECT bdr.bdr_node_join_wait_for_ready();
2016-02-27,PostgreSQLOpenDay,Rimini
status
pgtraining=# x
Expanded display is on.
pgtraining=# select node_status, node_name, node_local_dsn, node_init_from_dsn
from bdr.bdr_nodes;
-[ RECORD 1 ]------+-----------------------------------------------
node_status | r
node_name | node_virginia
node_local_dsn | host=virginia.pgtraining.com dbname=pgtraining
node_init_from_dsn |
-[ RECORD 2 ]------+-----------------------------------------------
node_status | r
node_name | node_dublin
node_local_dsn | host=dublin.pgtraining.com dbname=pgtraining
node_init_from_dsn | host=virginia.pgtraining.com dbname=pgtraining
-[ RECORD 3 ]------+-----------------------------------------------
node_status | r
node_name | node_tokyo
node_local_dsn | host=tokyo.pgtraining.com dbname=pgtraining
node_init_from_dsn | host=virginia.pgtraining.com dbname=pgtraining
2016-02-27,PostgreSQLOpenDay,Rimini
prime prove (demo)
2016-02-27,PostgreSQLOpenDay,Rimini
alcune cose non sono possibili
• "The Physics of Multi-Master" in azione...
2016-02-27,PostgreSQLOpenDay,Rimini
conflitti!
• 10k update sullo stesso record (= worst case)
2016-02-27,PostgreSQLOpenDay,Rimini
risoluzione dei conflitti
2016-02-27,PostgreSQLOpenDay,Rimini
ancora conflitti
• http://bdr-project.org/docs/next/conflicts-types.html
• UPDATE/UPDATE:
• non aggiornare la stessa tupla nello stesso istante su nodi
diversi ;)
• custom conflict handlers
• distributed locking a livello applicativo
• se questo succede spesso, forse non volevi il multi-master...
• e INSERT/INSERT? ... sequenze globali!
2016-02-27,PostgreSQLOpenDay,Rimini
sequenze globali
• CREATE SEQUENCE test_seq USING bdr;
• oppure setting: default_sequenceam = true
• promettono di dare nextval() unici su tutti i nodi
riservando intervalli distinti per nodo
• questi intervalli vengono assegnati con un algoritmo
distribuito di voting (maggioranza N/2+1)
• non sono obbligatorie: si può anche scegliere di
usare qualche tipo di UUID
2016-02-27,PostgreSQLOpenDay,Rimini
sequenze globali
2016-02-27,PostgreSQLOpenDay,Rimini
limitazioni delle s. globali
• non si può utilizzare setval()!
• le sequenze globali sono sempre incrementate di 1
• a differenza delle sequenze non-BDR, nextval() può
fallire se un nodo "consuma" l'intervallo che ha a
disposizione prima che la rete di nodi può votare per
assegnargli un nuovo intervallo:
ERROR: could not find free sequence value for global
sequence public.seqtest_id_seq
HINT: The sequence is refilling from remote nodes. Try again
soon. Check that all nodes are up if the condition persists.
2016-02-27,PostgreSQLOpenDay,Rimini
pg_dump?
• non avendo setval() non si riesce a
semplicemente importare un dump non-BDR...
• un trucco:
• per pg_dump + BDR: bit.ly/1n3mDmm
set default_sequenceam = '';
i bla.dump
alter sequence bla_seq using bdr;
call nextval('bla_seq') in un ciclo per portare la
sequenze oltre il massimo usato in bla
2016-02-27,PostgreSQLOpenDay,Rimini
DDL
• fino a qui, ogni operazione (che non fallisce ;) può
essere eseguita direttamente dal nodo che la riceve
• questo NON vale per il DDL (CREATE, DROP, ALTER)
- c'è bisogno di una votazione tra i nodi per cui TUTTI
devono essere d'accordo (quasi come per i d.d.l. ;)
• se anche un solo nodo non risponde, l'operazione non
procede
• questo, perché è difficile/impossibile accettare (e
risolvere) conflitti sui DDL
2016-02-27,PostgreSQLOpenDay,Rimini
DDL
tokyo non risponde... e dublin aspetta
2016-02-27,PostgreSQLOpenDay,Rimini
forse era godzilla?
• oltre il caso DDL, è importare monitorare il sistema:
se un nodo va giù, gli altri nodi accumulano i WAL,
potenzialmente fino a riempire il disco...
• si possono togliere nodi con:
SELECT bdr.bdr_part_by_node_names(ARRAY['node_tokyo']);
• occhio che a fare il join dello stesso nodo dopo ho
incontrato problemi (vedi anche mailing list) - forse
un problema di documentazione / beta-ness...
2016-02-27,PostgreSQLOpenDay,Rimini
'k thx bye ;)

Mais conteúdo relacionado

Mais procurados

Love Your Database (ESC 2k16)
Love Your Database (ESC 2k16)Love Your Database (ESC 2k16)
Love Your Database (ESC 2k16)PgTraining
 
PostgreSQL: Point in time recovery
PostgreSQL: Point in time recoveryPostgreSQL: Point in time recovery
PostgreSQL: Point in time recoveryEnrico Pirozzi
 
Back to Basics 4: Introduzione al partizionamento orizzontale (sharding)
Back to Basics 4: Introduzione al partizionamento orizzontale (sharding)Back to Basics 4: Introduzione al partizionamento orizzontale (sharding)
Back to Basics 4: Introduzione al partizionamento orizzontale (sharding)MongoDB
 
Glusterfs: un filesystem altamente versatile
Glusterfs: un filesystem altamente versatileGlusterfs: un filesystem altamente versatile
Glusterfs: un filesystem altamente versatileIvan Rossi
 
PostgreSQL: Integrità dei dati
PostgreSQL: Integrità dei datiPostgreSQL: Integrità dei dati
PostgreSQL: Integrità dei datiEnrico Pirozzi
 
SQL Saturday 2019 - Event Processing with Spark
SQL Saturday 2019 - Event Processing with SparkSQL Saturday 2019 - Event Processing with Spark
SQL Saturday 2019 - Event Processing with SparkAlessio Biasiutti
 
Log files - Approcci al Troubleshooting
 Log files - Approcci al Troubleshooting Log files - Approcci al Troubleshooting
Log files - Approcci al TroubleshootingFulvio Corno
 
Risoluzione DNS per IPv6: sperimentazione nella rete del dominio uniba.it
Risoluzione DNS per IPv6: sperimentazione nella rete del dominio uniba.itRisoluzione DNS per IPv6: sperimentazione nella rete del dominio uniba.it
Risoluzione DNS per IPv6: sperimentazione nella rete del dominio uniba.itValerio Como
 
Back to Basics webinar 1 IT 17 - Introduzione ai NoSQL
Back to Basics webinar 1 IT 17 - Introduzione ai NoSQLBack to Basics webinar 1 IT 17 - Introduzione ai NoSQL
Back to Basics webinar 1 IT 17 - Introduzione ai NoSQLMongoDB
 
Bookalive Klaus Kempf Presentazione: Record, Zend e archiviazione
Bookalive Klaus Kempf Presentazione: Record, Zend e archiviazioneBookalive Klaus Kempf Presentazione: Record, Zend e archiviazione
Bookalive Klaus Kempf Presentazione: Record, Zend e archiviazioneInformamuse srl
 
Introduzione DevOps con Ansible
Introduzione DevOps con AnsibleIntroduzione DevOps con Ansible
Introduzione DevOps con AnsibleMatteo Magni
 
Redis Cluster by S. Sanfilippo
Redis Cluster by S. SanfilippoRedis Cluster by S. Sanfilippo
Redis Cluster by S. SanfilippoCorley S.r.l.
 
Presentazione - Algoritmo di Dijkstra
Presentazione - Algoritmo di DijkstraPresentazione - Algoritmo di Dijkstra
Presentazione - Algoritmo di DijkstraMassimoPalmisano
 
PostgreSQL: Transazioni e locking
PostgreSQL: Transazioni e lockingPostgreSQL: Transazioni e locking
PostgreSQL: Transazioni e lockingEnrico Pirozzi
 
Io uso Tor e non lascio tracce! Sei proprio sicuro?
Io uso Tor e non lascio tracce! Sei proprio sicuro?Io uso Tor e non lascio tracce! Sei proprio sicuro?
Io uso Tor e non lascio tracce! Sei proprio sicuro?festival ICT 2016
 

Mais procurados (20)

Love Your Database (ESC 2k16)
Love Your Database (ESC 2k16)Love Your Database (ESC 2k16)
Love Your Database (ESC 2k16)
 
PostgreSQL: Point in time recovery
PostgreSQL: Point in time recoveryPostgreSQL: Point in time recovery
PostgreSQL: Point in time recovery
 
Back to Basics 4: Introduzione al partizionamento orizzontale (sharding)
Back to Basics 4: Introduzione al partizionamento orizzontale (sharding)Back to Basics 4: Introduzione al partizionamento orizzontale (sharding)
Back to Basics 4: Introduzione al partizionamento orizzontale (sharding)
 
Glusterfs: un filesystem altamente versatile
Glusterfs: un filesystem altamente versatileGlusterfs: un filesystem altamente versatile
Glusterfs: un filesystem altamente versatile
 
PostgreSQL: Integrità dei dati
PostgreSQL: Integrità dei datiPostgreSQL: Integrità dei dati
PostgreSQL: Integrità dei dati
 
Messa in rete
Messa in reteMessa in rete
Messa in rete
 
SQL Saturday 2019 - Event Processing with Spark
SQL Saturday 2019 - Event Processing with SparkSQL Saturday 2019 - Event Processing with Spark
SQL Saturday 2019 - Event Processing with Spark
 
Scheduling In Linux
Scheduling In LinuxScheduling In Linux
Scheduling In Linux
 
Log files - Approcci al Troubleshooting
 Log files - Approcci al Troubleshooting Log files - Approcci al Troubleshooting
Log files - Approcci al Troubleshooting
 
Risoluzione DNS per IPv6: sperimentazione nella rete del dominio uniba.it
Risoluzione DNS per IPv6: sperimentazione nella rete del dominio uniba.itRisoluzione DNS per IPv6: sperimentazione nella rete del dominio uniba.it
Risoluzione DNS per IPv6: sperimentazione nella rete del dominio uniba.it
 
Back to Basics webinar 1 IT 17 - Introduzione ai NoSQL
Back to Basics webinar 1 IT 17 - Introduzione ai NoSQLBack to Basics webinar 1 IT 17 - Introduzione ai NoSQL
Back to Basics webinar 1 IT 17 - Introduzione ai NoSQL
 
Apcamp
ApcampApcamp
Apcamp
 
SaaS con Symfony2
SaaS con Symfony2SaaS con Symfony2
SaaS con Symfony2
 
Bookalive Klaus Kempf Presentazione: Record, Zend e archiviazione
Bookalive Klaus Kempf Presentazione: Record, Zend e archiviazioneBookalive Klaus Kempf Presentazione: Record, Zend e archiviazione
Bookalive Klaus Kempf Presentazione: Record, Zend e archiviazione
 
Introduzione DevOps con Ansible
Introduzione DevOps con AnsibleIntroduzione DevOps con Ansible
Introduzione DevOps con Ansible
 
Thesis Frascino Slide iT
Thesis Frascino Slide iTThesis Frascino Slide iT
Thesis Frascino Slide iT
 
Redis Cluster by S. Sanfilippo
Redis Cluster by S. SanfilippoRedis Cluster by S. Sanfilippo
Redis Cluster by S. Sanfilippo
 
Presentazione - Algoritmo di Dijkstra
Presentazione - Algoritmo di DijkstraPresentazione - Algoritmo di Dijkstra
Presentazione - Algoritmo di Dijkstra
 
PostgreSQL: Transazioni e locking
PostgreSQL: Transazioni e lockingPostgreSQL: Transazioni e locking
PostgreSQL: Transazioni e locking
 
Io uso Tor e non lascio tracce! Sei proprio sicuro?
Io uso Tor e non lascio tracce! Sei proprio sicuro?Io uso Tor e non lascio tracce! Sei proprio sicuro?
Io uso Tor e non lascio tracce! Sei proprio sicuro?
 

Destaque

La bella addormentata è un tipo sveglio 1
La bella addormentata è un tipo sveglio 1La bella addormentata è un tipo sveglio 1
La bella addormentata è un tipo sveglio 1Michela Furia
 
Medicina Generale con PostgreSQL
Medicina Generale con PostgreSQLMedicina Generale con PostgreSQL
Medicina Generale con PostgreSQLEmanuele Zamprogno
 
Breve storia del giornale
Breve storia del giornaleBreve storia del giornale
Breve storia del giornaletecnoletters
 
Il quotidiano
Il quotidianoIl quotidiano
Il quotidianoromy
 

Destaque (7)

La bella addormentata è un tipo sveglio 1
La bella addormentata è un tipo sveglio 1La bella addormentata è un tipo sveglio 1
La bella addormentata è un tipo sveglio 1
 
Medicina Generale con PostgreSQL
Medicina Generale con PostgreSQLMedicina Generale con PostgreSQL
Medicina Generale con PostgreSQL
 
PostgreSQL
PostgreSQL PostgreSQL
PostgreSQL
 
1 Lezione
1 Lezione1 Lezione
1 Lezione
 
Breve storia del giornale
Breve storia del giornaleBreve storia del giornale
Breve storia del giornale
 
Il quotidiano
Il quotidianoIl quotidiano
Il quotidiano
 
I colori
I coloriI colori
I colori
 

Semelhante a Pgtraining bdr

Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBPolyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBSteve Maraspin
 
Richiami su Linux - Webmin - Reti di calcolatori
Richiami su Linux - Webmin - Reti di calcolatoriRichiami su Linux - Webmin - Reti di calcolatori
Richiami su Linux - Webmin - Reti di calcolatoriFulvio Corno
 
October 2009 - JBoss Cloud
October 2009 - JBoss CloudOctober 2009 - JBoss Cloud
October 2009 - JBoss CloudJBug Italy
 
JBoss Clouds - JBug Roma october 2009
JBoss Clouds -  JBug Roma october 2009JBoss Clouds -  JBug Roma october 2009
JBoss Clouds - JBug Roma october 2009Sanne Grinovero
 
DbUp - A real case of database migration
DbUp - A real case of database migrationDbUp - A real case of database migration
DbUp - A real case of database migrationAndrea Cirioni
 
Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...Codemotion
 
Codemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi Cluster
Codemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi ClusterCodemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi Cluster
Codemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi ClusterMatteo Baccan
 
CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL S...
CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL S...CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL S...
CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL S...Gianluca Carucci
 
PostgrSQL 9.3&9.4 - DjangoVillage
PostgrSQL 9.3&9.4 - DjangoVillagePostgrSQL 9.3&9.4 - DjangoVillage
PostgrSQL 9.3&9.4 - DjangoVillageMiriade Spa
 
VMUGIT Roma 2016 - vROps Design - Pietro Piutti
VMUGIT Roma 2016 - vROps Design - Pietro PiuttiVMUGIT Roma 2016 - vROps Design - Pietro Piutti
VMUGIT Roma 2016 - vROps Design - Pietro PiuttiVMUG IT
 
Benchmarking Cloud Native PostgreSQL
Benchmarking Cloud Native PostgreSQLBenchmarking Cloud Native PostgreSQL
Benchmarking Cloud Native PostgreSQLEDB
 
Come l’Open Source può essere alla base di un business di successo: il caso H...
Come l’Open Source può essere alla base di un business di successo: il caso H...Come l’Open Source può essere alla base di un business di successo: il caso H...
Come l’Open Source può essere alla base di un business di successo: il caso H...MariaDB plc
 
Laboratorio Di Basi Di Dati 01 Introduzione
Laboratorio Di  Basi Di  Dati 01 IntroduzioneLaboratorio Di  Basi Di  Dati 01 Introduzione
Laboratorio Di Basi Di Dati 01 Introduzioneguestbe916c
 
MySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQL
MySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQLMySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQL
MySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQLPar-Tec S.p.A.
 
Marco Zani: Come dimensionare Magento per raggiungere i Key Performance Indic...
Marco Zani: Come dimensionare Magento per raggiungere i Key Performance Indic...Marco Zani: Come dimensionare Magento per raggiungere i Key Performance Indic...
Marco Zani: Come dimensionare Magento per raggiungere i Key Performance Indic...Meet Magento Italy
 
Laboratorio Di Basi Di Dati 03 Il D B M S Postgre S Q L
Laboratorio Di  Basi Di  Dati 03  Il  D B M S  Postgre S Q LLaboratorio Di  Basi Di  Dati 03  Il  D B M S  Postgre S Q L
Laboratorio Di Basi Di Dati 03 Il D B M S Postgre S Q Lguestbe916c
 
Roma linuxday 2013 - nodejs
Roma linuxday 2013 - nodejsRoma linuxday 2013 - nodejs
Roma linuxday 2013 - nodejsClaudio Mignanti
 
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...Codemotion
 

Semelhante a Pgtraining bdr (20)

Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBPolyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
 
Richiami su Linux - Webmin - Reti di calcolatori
Richiami su Linux - Webmin - Reti di calcolatoriRichiami su Linux - Webmin - Reti di calcolatori
Richiami su Linux - Webmin - Reti di calcolatori
 
October 2009 - JBoss Cloud
October 2009 - JBoss CloudOctober 2009 - JBoss Cloud
October 2009 - JBoss Cloud
 
JBoss Clouds - JBug Roma october 2009
JBoss Clouds -  JBug Roma october 2009JBoss Clouds -  JBug Roma october 2009
JBoss Clouds - JBug Roma october 2009
 
DbUp - A real case of database migration
DbUp - A real case of database migrationDbUp - A real case of database migration
DbUp - A real case of database migration
 
Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...
 
Codemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi Cluster
Codemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi ClusterCodemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi Cluster
Codemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi Cluster
 
CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL S...
CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL S...CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL S...
CommunityDays 2015 - NPM, GRUNT E BOWER: IL NUOVO PACKAGE MANAGER DI VISUAL S...
 
PostgrSQL 9.3&9.4 - DjangoVillage
PostgrSQL 9.3&9.4 - DjangoVillagePostgrSQL 9.3&9.4 - DjangoVillage
PostgrSQL 9.3&9.4 - DjangoVillage
 
VMUGIT Roma 2016 - vROps Design - Pietro Piutti
VMUGIT Roma 2016 - vROps Design - Pietro PiuttiVMUGIT Roma 2016 - vROps Design - Pietro Piutti
VMUGIT Roma 2016 - vROps Design - Pietro Piutti
 
Benchmarking Cloud Native PostgreSQL
Benchmarking Cloud Native PostgreSQLBenchmarking Cloud Native PostgreSQL
Benchmarking Cloud Native PostgreSQL
 
Come l’Open Source può essere alla base di un business di successo: il caso H...
Come l’Open Source può essere alla base di un business di successo: il caso H...Come l’Open Source può essere alla base di un business di successo: il caso H...
Come l’Open Source può essere alla base di un business di successo: il caso H...
 
Laboratorio Di Basi Di Dati 01 Introduzione
Laboratorio Di  Basi Di  Dati 01 IntroduzioneLaboratorio Di  Basi Di  Dati 01 Introduzione
Laboratorio Di Basi Di Dati 01 Introduzione
 
MySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQL
MySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQLMySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQL
MySQL Tech Tour 2015 - Soluzioni di alta disponibilità con MySQL
 
Marco Zani: Come dimensionare Magento per raggiungere i Key Performance Indic...
Marco Zani: Come dimensionare Magento per raggiungere i Key Performance Indic...Marco Zani: Come dimensionare Magento per raggiungere i Key Performance Indic...
Marco Zani: Come dimensionare Magento per raggiungere i Key Performance Indic...
 
J huery
J hueryJ huery
J huery
 
Laboratorio Di Basi Di Dati 03 Il D B M S Postgre S Q L
Laboratorio Di  Basi Di  Dati 03  Il  D B M S  Postgre S Q LLaboratorio Di  Basi Di  Dati 03  Il  D B M S  Postgre S Q L
Laboratorio Di Basi Di Dati 03 Il D B M S Postgre S Q L
 
Roma linuxday 2013 - nodejs
Roma linuxday 2013 - nodejsRoma linuxday 2013 - nodejs
Roma linuxday 2013 - nodejs
 
node.js everywhere
node.js everywherenode.js everywhere
node.js everywhere
 
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
 

Pgtraining bdr

  • 1. 2016-02-27 PostgreSQL Open Day, Rimini Primi passi con BDR Chris Mair http://www.pgtraining.com
  • 3. 2016-02-27,PostgreSQLOpenDay,Rimini replicazione - l'evoluzione • 8.x - log shipping e PITR possono essere usati per creare dei warm standby • 9.0 - streaming replication & hot standby • 9.1 - synchronous replication • 9.2 - cascading replication • 9.4 - replication slots & logical decoding
  • 4. 2016-02-27,PostgreSQLOpenDay,Rimini replicazione - le alternative • Slony (master-slave basato su trigger) • Londiste (idem) • Bucardo (master-slave e master-master, basato su triggers) • Pgpool-II (sistema ibrido: pool / load balancer / replicatore a livello di statement / parallel query system)
  • 5. 2016-02-27,PostgreSQLOpenDay,Rimini replicazione - il futuro • sistemi che si agganciano al logical decoding introdotto con la 9.4 • risolve il problema del "o replico tutto o niente" dei metodi basati su WAL (shipping o streaming) • risolve il problema della performance e scalability dei metodi basati su trigger • un prodotto (recente), portato avanti da 2ndQuadrant: BDR (Bi-Directional Replication)
  • 6. 2016-02-27,PostgreSQLOpenDay,Rimini BDR • asynchronous multi-master logical replication • molto veloce: modifiche vengono commitate sul nodo locale prima di essere replicate • se più nodi toccano lo stesso dato contempo- raneamente conflitti sono inevitabili (Simon Riggs: "The Physics of Multi-Master") • use case ideale: sistema distribuito tra siti con elevata latenza che vuole mettere a disposizione un master veloce presso tutti i siti
  • 7. 2016-02-27,PostgreSQLOpenDay,Rimini BDR • BDR è un estensione PostgreSQL che richiede dei feature che 2ndQuadrant et.al. stanno commitando pezzo per pezzo a PostgreSQL: • purtroppo, tuttora, anche con 9.5, c'è bisogno di una versione patchata di PostgreSQL per BDR • Background workers (9.3) • Event Triggers (9.3 and 9.4) • Replication slots (9.4) • Logical decoding (9.4) • Enhanced DROP event triggers (9.4) • REPLICA IDENTITY (9.4) • Commit Timestamps (9.5) • Replication Origins (9.5) • DDL Deparse hooks (9.5) Fonte: http://blog.2ndquadrant.com/when-are-we-going-to-contribute-bdr-to-postgresql/
  • 8. 2016-02-27,PostgreSQLOpenDay,Rimini BDR • l'ultima versione disponibile ad oggi è BDR 0.9.3 per PostgreSQL (patchato) 9.4. • docs & download: http://bdr-project.org/docs/0.9/index.html • abbiamo creato un setup con tre nodi seguendo le istruzioni della versione 0.9.3
  • 9. 2016-02-27,PostgreSQLOpenDay,Rimini i demo server • tre nodi che girano sul mio portatile
  • 10. 2016-02-27,PostgreSQLOpenDay,Rimini i demo server • tre nodi che girano su macchine virtuali su un server qui dietro
  • 11. 2016-02-27,PostgreSQLOpenDay,Rimini i demo server! (su Amazon EC2 ;) tokyo.pgtraining.com dublin.pgtraining.com virginia.pgtraining.com ~ 217 ms ~ 80 ms ~ 145 ms
  • 12. 2016-02-27,PostgreSQLOpenDay,Rimini i demo server • i tre nodi hanno mutualmente la porta 5432 aperta (firewall) e entry in pg_hba.conf per connettersi; usano SSL (notare i tempi):
  • 13. 2016-02-27,PostgreSQLOpenDay,Rimini setup dei tre nodi # virginia CREATE EXTENSION btree_gist; CREATE EXTENSION bdr; SELECT bdr.bdr_group_create( local_node_name := 'node_virginia', node_external_dsn := 'host=virginia.pgtraining.com dbname=pgtraining'); SELECT bdr.bdr_node_join_wait_for_ready(); # dublin (join via virginia) CREATE EXTENSION btree_gist; CREATE EXTENSION bdr; SELECT bdr.bdr_group_join( local_node_name := 'node_dublin', node_external_dsn := 'host=dublin.pgtraining.com dbname=pgtraining', join_using_dsn := 'host=virginia.pgtraining.com dbname=pgtraining'); SELECT bdr.bdr_node_join_wait_for_ready(); # tokyo (join via virginia) CREATE EXTENSION btree_gist; CREATE EXTENSION bdr; SELECT bdr.bdr_group_join( local_node_name := 'node_tokyo', node_external_dsn := 'host=tokyo.pgtraining.com dbname=pgtraining', join_using_dsn := 'host=virginia.pgtraining.com dbname=pgtraining'); SELECT bdr.bdr_node_join_wait_for_ready();
  • 14. 2016-02-27,PostgreSQLOpenDay,Rimini status pgtraining=# x Expanded display is on. pgtraining=# select node_status, node_name, node_local_dsn, node_init_from_dsn from bdr.bdr_nodes; -[ RECORD 1 ]------+----------------------------------------------- node_status | r node_name | node_virginia node_local_dsn | host=virginia.pgtraining.com dbname=pgtraining node_init_from_dsn | -[ RECORD 2 ]------+----------------------------------------------- node_status | r node_name | node_dublin node_local_dsn | host=dublin.pgtraining.com dbname=pgtraining node_init_from_dsn | host=virginia.pgtraining.com dbname=pgtraining -[ RECORD 3 ]------+----------------------------------------------- node_status | r node_name | node_tokyo node_local_dsn | host=tokyo.pgtraining.com dbname=pgtraining node_init_from_dsn | host=virginia.pgtraining.com dbname=pgtraining
  • 16. 2016-02-27,PostgreSQLOpenDay,Rimini alcune cose non sono possibili • "The Physics of Multi-Master" in azione...
  • 19. 2016-02-27,PostgreSQLOpenDay,Rimini ancora conflitti • http://bdr-project.org/docs/next/conflicts-types.html • UPDATE/UPDATE: • non aggiornare la stessa tupla nello stesso istante su nodi diversi ;) • custom conflict handlers • distributed locking a livello applicativo • se questo succede spesso, forse non volevi il multi-master... • e INSERT/INSERT? ... sequenze globali!
  • 20. 2016-02-27,PostgreSQLOpenDay,Rimini sequenze globali • CREATE SEQUENCE test_seq USING bdr; • oppure setting: default_sequenceam = true • promettono di dare nextval() unici su tutti i nodi riservando intervalli distinti per nodo • questi intervalli vengono assegnati con un algoritmo distribuito di voting (maggioranza N/2+1) • non sono obbligatorie: si può anche scegliere di usare qualche tipo di UUID
  • 22. 2016-02-27,PostgreSQLOpenDay,Rimini limitazioni delle s. globali • non si può utilizzare setval()! • le sequenze globali sono sempre incrementate di 1 • a differenza delle sequenze non-BDR, nextval() può fallire se un nodo "consuma" l'intervallo che ha a disposizione prima che la rete di nodi può votare per assegnargli un nuovo intervallo: ERROR: could not find free sequence value for global sequence public.seqtest_id_seq HINT: The sequence is refilling from remote nodes. Try again soon. Check that all nodes are up if the condition persists.
  • 23. 2016-02-27,PostgreSQLOpenDay,Rimini pg_dump? • non avendo setval() non si riesce a semplicemente importare un dump non-BDR... • un trucco: • per pg_dump + BDR: bit.ly/1n3mDmm set default_sequenceam = ''; i bla.dump alter sequence bla_seq using bdr; call nextval('bla_seq') in un ciclo per portare la sequenze oltre il massimo usato in bla
  • 24. 2016-02-27,PostgreSQLOpenDay,Rimini DDL • fino a qui, ogni operazione (che non fallisce ;) può essere eseguita direttamente dal nodo che la riceve • questo NON vale per il DDL (CREATE, DROP, ALTER) - c'è bisogno di una votazione tra i nodi per cui TUTTI devono essere d'accordo (quasi come per i d.d.l. ;) • se anche un solo nodo non risponde, l'operazione non procede • questo, perché è difficile/impossibile accettare (e risolvere) conflitti sui DDL
  • 26. 2016-02-27,PostgreSQLOpenDay,Rimini forse era godzilla? • oltre il caso DDL, è importare monitorare il sistema: se un nodo va giù, gli altri nodi accumulano i WAL, potenzialmente fino a riempire il disco... • si possono togliere nodi con: SELECT bdr.bdr_part_by_node_names(ARRAY['node_tokyo']); • occhio che a fare il join dello stesso nodo dopo ho incontrato problemi (vedi anche mailing list) - forse un problema di documentazione / beta-ness...