Desmistificando Replicação no PostgreSQL
Euler Taveira
Timbira - A empresa brasileira de PostgreSQL
09 de novembro de 2012
Apresentação
I
Euler Taveira
I
I
I
I
I
Desenvolvedor PostgreSQL
Lı́der do PostgreSQL Brasil
@eulerto
http://eulerto.blogspot.com
Timbira
I
I
I
I
I
I
Diretor Técnico
A empresa brasileira de PostgreSQL
Consultoria
Desenvolvimento
Suporte 24x7
Treinamento
Sobre esta apresentação
I
esta apresentação está disponı́vel em:
http://www.timbira.com.br/material
I
esta apresentação está sob licença Creative Commons
Atribuição-Não Comercial 3.0 Brasil:
http://creativecommons.org/licenses/by-nc/3.0/br
c
b
n
Agenda
Introdução
Conceitos
Evolução
Ferramentas
Conclusão
O que é?
I
perguntas mais frequentes
I
curiosidades
I
conceitos de bancos de dados
I
como fazer
O que não é?
I
tópicos avançados
I
comparação com soluções de outros SGBDs
I
soluções de replicação a nı́vel de sistema de arquivos
I
soluções de replicação a nı́vel de hardware
Um pouco de teoria...
I
I
”Replicação significa que nós armazenamos várias cópias de
uma relação ou partições dela em sites diferentes.”
Motivação:
I
aumentar a disponibilidade
I
I
I
acelerar execução de uma consulta
I
I
I
I
problema na réplica
falha de comunicação
réplica mais próxima pode executar consulta mais rápido
balancear a carga no SGBD
tolerância a falhas (SPOF)
Como manter a réplica quando a relação é modificada?
I
I
sı́ncrono
assı́ncrono
Atualizando dados em um SGBD distribuı́do
I
comportar-se como um SGBD centralizado para usuário
I
problemas devem ser transparente para usuário
I
problemas devem ser resolvidos a nı́vel de implementação
consultas:
I
I
I
executar consultas sem se preocupar como e onde as relações
estão armazenadas
atualizações:
I
I
I
transações devem continuar sendo atômicas apesar da
replicação
cópias da relação modificada devem ser atualizadas antes da
efetivação da transação (replicação sı́ncrona)
SGBDs distribuı́dos comerciais adotaram replicação assı́ncrona
I
I
I
independência dos dados distribuı́dos
implementação mais eficiente do que sı́ncrona
transação que lê cópias da mesma relação pode obter registros
diferentes
Replicação Sı́ncrona
I
custo da replicação sı́ncrona é alto
I
I
I
I
I
bloqueio exclusivo em todas as cópias
bloqueio é mantido até que todas as cópias estejam bloqueadas
uma falha de comunicação provoca uma recuperação em todas
as réplicas que já haviam gravado os dados
várias mensagens são trocadas até a efetivação da transação
replicação sı́ncrona é indesejável ou mesmo inalcançável em
muitos cenários
Replicação Assı́ncrona
I
é bastante popular mesmo que cópias diferentes da mesma
relação tenham registros diferentes por um curto perı́odo de
tempo
I
viola o princı́pio da independência dos dados distribuı́dos
I
todavia, é aceitável na grande maioria dos cenários
Tipos:
I
I
I
offline
online
Métodos de Replicação
I
offline: armazena os dados em fita (e regularmente guarda
em outro local)
I
I
I
I
consistência de dados é boa (a não ser por erro humano ou
backup corrompido)
atualidade dos dados está prejudicada
tempo de recuperação não é crı́tico
online: cópia de dados de um servidor para outro através de
um link
I
I
I
I
tempo de recuperação (minutos a horas) é crı́tico
atualização dos dados em tempo real
sı́ncrono: ↓ capacidade e performance da replicação, ↓ tempo
de resposta do sistema
assı́ncrono: prejudica atualidade dos dados
Replicação Online
I
I
tipos podem ser: sı́ncrono ou assı́ncrono
fı́sica: cada escrita no disco é replicada em outro disco no
outro servidor
I
I
I
hardware
software
lógica: aplicação é responsável por replicar e garantir que a
escrita foi realizada em outro disco no outro servidor
Replicação Fı́sica: Hardware
nó A
nó B
postgres off
Replicação Fı́sica: Software
nó A
nó B
postgres off
Replicação Lógica
nó A
nó B
Granularidade
I
segmento de log de transação: quando um arquivo de log
de transação é arquivado, ele é aplicado no outro nó
I
I
archive timeout (longo)
buffer de log de transação: quando a transação é efetivada,
ela é transmitida e efetivada no outro nó
I
- 1 seg (curto)
Streaming Replication
Warm Standby (< 9.0)
segmento #1
aplicar em caso de desastre
segmento #2
Uso do servidor secundário
I
warm standby: o servidor secundário não aceita conexões
I
hot standby: o servidor secundário aceita conexões
Hot Standby
Warm Standby
principal
principal
réplica
réplica
Mais Alguns Conceitos...
I
alta disponibilidade: manter os serviços disponibilizados o
maior tempo possı́vel
I
balanceamento de carga: distribuir a carga de trabalho
entre 2 ou mais servidores
I
failover: processo de outro servidor assumir os serviços do
servidor principal quando o último falha
I
failback: processo de restaurar os serviços no servidor
principal para o estado anterior a falha
I
cascateamento: em replicação, servidor A replica para
servidor B, servidor B replica para servidor C e D e assim
sucessivamente
Evolução
I
8.0: warm standby
I
8.1: warm standby (melhorias)
I
9.0: replicação assı́ncrona e hot standby
I
9.1: replicação sı́ncrona
I
9.2: replicação sı́ncrona (remote write) e cascateamento
I
?.?: replicação lógica e gatilhos de eventos
Replicação até 8.4
1
2
3
4
5
6
7
8
9
I
pg standby (≥ 8.3)
I
restore command: script que espera indefinidamente arquivo
WAL
triggered = false ;
w h i l e ( ! NextWALFileReady ( ) && ! t r i g g e r e d )
{
s l e e p (100000L ) ;
/∗ w a i t f o r ˜ 0 . 1 s e c ∗/
i f ( CheckForExternalTrigger () )
triggered = true ;
}
if (! triggered )
CopyWALFileForRecovery ( ) ;
Replicação por Fluxo: Arquitetura
I
WALReceiver estabelece uma conexão (via libpq) com
servidor principal
I
servidor principal abre o processo WalSender para enviar WAL
ao servidor réplica
I
replicação sı́ncrona espera WAL ser escrito no disco do
servidor réplica
principal
réplica
postgres
wal
buffers
postgres
write?
fsync?
WAL
conexão
WALSender
WALReceiver
WAL
Replicação por Fluxo: Assı́ncrona
I
replicação por fluxo no PostgreSQL é assı́ncrona por padrão
I
se o servidor principal cair, algumas transações que foram
efetivadas podem não ter sido replicadas
I
a quantidade de dados perdidos é correspondente ao atraso da
replicação no momento da queda
Replicação por Fluxo: Sı́ncrona
I
confirma que todas as mudanças feitas na transação foram
transferidas para um servidor réplica
I
cada transação que modifica dados esperará a confirmação
que as mudanças foram escritas no log de transação de
ambos servidores
I
fornece um nı́vel mais alto de durabilidade
tempo da transação
I
I
I
I
I
I
transferir os dados entre servidor principal e réplica
escrever dados no log de transação do servidor réplica
mandar mensagem do servidor réplica para principal com ACK
escrever dados no log de transação do servidor principal
transações somente leitura, ROLLBACK e subtransações não
esperam resposta do servidor réplica
Replicação em Cascata
I
servidor réplica aceita conexões para replicação de outros
servidores réplica
I
replicação em cascata é assı́ncrona
I
não há configuração especial para habilitar a replicação em
cascata
promover um servidor réplica intermediário termina as
conexões para replicação
I
I
9.3: não será necessário refazer as réplicas
Como funciona a replicação por fluxo?
I
recuperação de registros do log de transação no servidor
secundário
I
entrega: arquivo ou fluxo (“stream”)
I
no primário: processo walsender
I
no secundário: processo walreceiver
I
privilégio REPLICATION (≥ 9.1)
I
configuração: recovery.conf e postgresql.conf
I
monitoramento: pg current xlog location (primário) e
pg last xlog {receive, replay} location (secundário)
Replicação por Fluxo: No Principal
postgresql.conf
listen addresses = ’*’
wal level = hot standby
max wal senders = 1
wal keep segments = 100
synchronous standby names = ’*’
I
criar role para replicar dados
CREATE ROLE usuario LOGIN REPLICATION;
I
no pg hba.conf :
host replication usuario 10.1.1.2/32 md5
Replicação por Fluxo: No Secundário
recovery.conf
standby mode = ’on’
primary conninfo = ’host=10.1.1.1 port=5432 user=usuario
password=minhasenha’
trigger file = ’/bd/secundario/failover.trg’
postgresql.conf
hot standby = on
Replicação por Fluxo: No Principal
I
com servidor parado
$ pg_ctl stop -D /bd/primario
waiting for server to shut down.... done
server stopped
$ rsync -av --exclude postgresql.conf \
--exclude pg_hba.conf --exclude pg_xlog/* \
--exclude pg_log/* /bd/primario/ \
[email protected]:/bd/secundario
$ pg_ctl start -D /bd/primario
server starting
Replicação por Fluxo: No Principal
I
com servidor em atividade
postgres=# select pg_start_backup(’replicacao’, true);
pg_start_backup
----------------0/5044CB4
(1 row)
$ rsync -av --exclude postmaster.pid \
--exclude postgresql.conf --exclude pg_hba.conf \
--exclude backup_label --exclude pg_xlog/* \
--exclude pg_log/* /bd/primario/ \
[email protected]:/bd/secundario
postgres=# select pg_stop_backup();
pg_stop_backup
---------------0/90D7950
(1 row)
Replicação por Fluxo: No Secundário
$ pg_ctl start -D /bd/secundario
server starting
Algumas ferramentas...
I
Slony-I
I
Londiste
I
pgpool-II
I
RubyRep
I
Postgres-XC
Slony-I: Introdução
I
sistema de replicação do principal para múltiplas réplicas
I
suporte a cascateamento e promoção de réplica
I
replica dados entre diferentes versões do PostgreSQL
I
replica dados entre diferentes sistemas operacionais e modelos
de servidores
I
replica somente algumas tabelas para réplica
I
replica diferentes conjuntos de tabelas para diferentes réplicas
I
servidores diferentes podem ser a origem dos dados para
diferentes conjuntos de tabelas
Slony-I: Ele não faz...
I
replica objetos grandes (aka blobs)
I
replica comandos DDL (por exemplo, CREATE TABLE,
ALTER TABLE e DROP TABLE)
I
replica alterações em roles
I
todavia, comandos DDL podem ser submetidos as réplicas
manualmente utilizando o slonik
Postgres-XC
todos
com
mesmo
timestamp
transações
leitura /
escrita
Postgres-XC
I
arquitetura shared nothing
I
multi-mestre sı́ncrono
escalável em leitura/escrita
I
I
I
”3,4x performance com 5 servidores comparado com um
servidor PostgreSQL”
local de tabelas transparente
I
I
tabelas replicadas
tabelas distribuı́das
I
baseado no PostgreSQL (atualmente 9.1)
I
mesma API para aplicações que já utilizam PostgreSQL
Postgres-XC: Arquitetura
Aplicações
Coordenador
Nó 1
Catálogo
Coordenador
Global
Catálogo
Nó 2
Local
GTM Proxy
Catálogo
Global
Catálogo
Local
GTM Proxy
servidor 1
servidor 2
GTM
Agenda
Introdução
Conceitos
Evolução
Ferramentas
Conclusão
Outras inúmeras perguntas...
I
A sua pergunta na lista pgbr-{geral, dev}
I
A sua pergunta na lista pgsql-{general, performance, hackers}
I
histórico das listas
blogs
I
I
I
I
http://planeta.postgresql.org.br
http://planet.postgresql.org
wiki
I
http://wiki.postgresql.org
A Timbira no PGDay-SP 2012
I
Desmistificando Replicação no PostgreSQL (Euler Taveira)
I
Fazendo uma manada de elefantes passar por baixo da porta
(Fabio Telles)
Perguntas
?
Euler Taveira de Oliveira
[email protected]
http://www.timbira.com.br
Download

Desmistificando Replicação no PostgreSQL