AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 8859
Accepted
KajMagnus
KajMagnus
Asked: 2011-12-07 14:43:10 +0800 CST2011-12-07 14:43:10 +0800 CST 2011-12-07 14:43:10 +0800 CST

Replicação do PostgreSQL: ID da linha do tempo fora de sequência, quando o antigo mestre se tornou escravo

  • 772

Configurei a replicação master slave no PostgreSQL, seguindo este tutorial:
http://wiki.postgresql.org/wiki/Binary_Replication_Tutorial#Binary_Replication_in_6_Steps

Funcionou bem. Agora promovi o escravo e configurei o mestre original para ser um escravo do novo mestre, novamente seguindo o tutorial no link acima.

No entanto, a replicação não funciona mais. O novo escravo (ou seja, o antigo mestre) registra erros como:

FATAL:  terminating walreceiver process due to administrator command
LOG:  out-of-sequence timeline ID 1 (after 2) in log file 0, segment 1, offset 0

ou como:

LOG:  unexpected timeline ID 1 in log file 0, segment 1, offset 0

O que estou fazendo errado?

Detalhes a seguir

Quando promovi o ex-escravo, parece que começou uma nova linha do tempo, nº 2:

LOG:  received promote request
FATAL:  terminating walreceiver process due to administrator command
LOG:  record with zero length at 0/18B5148
LOG:  redo done at 0/18B50F0
LOG:  last completed transaction was at log time 2011-12-05 08:39:43.872041+00
LOG:  selected new timeline ID: 2
LOG:  archive recovery complete
LOG:  database system is ready to accept connections

Existem 2 linhas de tempo no pg_xlogdiretório do novo mestre (ou seja, o antigo escravo):

new-master$ tree pg_xlog
    pg_xlog
    ├── 000000010000000000000001
    ├── 000000020000000000000001
    ├── 00000002.history
    └── archive_status
        └── 00000002.history.ready

Desligo o novo master e o novo slave. No novo escravo, eu faço isso:

new-slave$ cd /var/lib/pgsql/9.1/data/
new-slave$ rm *
new-slave$ mkdir pg_xlog ; chmod 700 pg_xlog
new-slave$ rsync -a  --exclude pg_xlog --exclude postgresql.conf --exclude recovery.conf --exclude recovery.done --exclude postmaster.pid --exclude 'server.*'  \
     dw0azewdbpv11danny:/var/lib/pgsql/9.1/data/*  .
new-slave$ ... restore postgresql.conf etcetera from backup,
             ... change settings following instructions in tutorial

Eu começo o novo mestre e o novo escravo. Mas o escravo diz FATAL: encerrando o processo walreceiver :

LOG:  database system was interrupted; last known up at 2011-12-06 21:49:49 UTC
LOG:  creating missing WAL directory "pg_xlog/archive_status"
LOG:  entering standby mode
LOG:  streaming replication successfully connected to primary
LOG:  unexpected timeline ID 1 in log file 0, segment 1, offset 0
FATAL:  terminating walreceiver process due to administrator command
LOG:  unexpected timeline ID 1 in log file 0, segment 1, offset 0
LOG:  unexpected timeline ID 1 in log file 0, segment 1, offset 0
...

O pg_xlog no novo escravo:

new-slave$ tree pg_xlog/
pg_xlog/
├── 000000020000000000000001
└── archive_status

Eu deveria ter rsync pg_xlogtambém? Eu fiz isso: desligar mestre e escravo, rsync pg_xlog, iniciar escravo, iniciar mestre. Então a replicação parece funcionar: o novo escravo diz:

LOG:  database system was shut down at 2011-12-06 22:10:14 UTC
LOG:  entering standby mode
LOG:  consistent recovery state reached at 0/19A4420
LOG:  database system is ready to accept read only connections
LOG:  record with zero length at 0/19A4420
FATAL:  could not connect to the primary server: could not connect to server: Connection refused
                Is the server running on host "dw0azewdbpv11danny" (46.137.XX.YY) and accepting
                TCP/IP connections on port 5432?

LOG:  streaming replication successfully connected to primary

Mas quando faço qualquer coisa no novo mestre:

insert into moo (mää) values (23);

Em seguida, a replicação falha. O novo escravo diz:

LOG:  could not receive data from client: Connection reset by peer
LOG:  out-of-sequence timeline ID 1 (after 2) in log file 0, segment 1, offset 0
FATAL:  terminating walreceiver process due to administrator command
LOG:  out-of-sequence timeline ID 1 (after 2) in log file 0, segment 1, offset 0
LOG:  out-of-sequence timeline ID 1 (after 2) in log file 0, segment 1, offset 0

O mestre diz:

LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started
LOG:  could not receive data from client: Connection reset by peer

Mas eu não reiniciei nenhuma conexão!

Se eu reiniciar o escravo, ele falha instantaneamente: FATAL: encerrando o processo do walreceiver :

LOG:  database system was shut down in recovery at 2011-12-06 22:24:37 UTC
LOG:  entering standby mode
LOG:  consistent recovery state reached at 0/19A4420
LOG:  database system is ready to accept read only connections
LOG:  redo starts at 0/19A4420
LOG:  record with zero length at 0/19A4510
LOG:  streaming replication successfully connected to primary
LOG:  out-of-sequence timeline ID 1 (after 2) in log file 0, segment 1, offset 0
FATAL:  terminating walreceiver process due to administrator command

Arquivos de configuração:

---- new master & slave: ----
wal_level = hot_standby
#archive_mode = off   (default)

---- new master: ----
max_wal_senders = 5
wal_keep_segments = 100

---- new slave: ----
hot_standby = on

---- recovery.conf, on the new slave: ----
standby_mode = 'on'
primary_conninfo = 'host=dw0azewdbpv11danny user=... password=...'

O que estou fazendo errado? Como posso transformar o antigo mestre em escravo?

(É melhor se eu não deletar todos os arquivos no novo escravo antes de mim rsync?
Ou devo executar initdbno novo escravo antes de mim rsync?
Você sabe se existe algum tutorial sobre como converter um mestre em um escravo? )

Atenciosamente, KajMagnus

postgresql replication
  • 1 1 respostas
  • 5562 Views

1 respostas

  • Voted
  1. Best Answer
    KajMagnus
    2011-12-07T22:43:51+08:002011-12-07T22:43:51+08:00

    Achei uma solução:

    Adicione recovery_target_timeline = 'latest'
    a recovery.conf no novo mestre (o antigo escravo).

    Agora a replicação funciona bem: o novo mestre escolhe a linha do tempo correta.

    Aqui estão algumas informações sobre esse parâmetro e muitos outros parâmetros em recovery.conf:
    http://pgpool.projects.postgresql.org/pgpool-II/doc/recovery.conf.sample

    Aqui estão mais algumas informações sobre esse parâmetro:
    http://www.postgresql.org/docs/9.1/static/warm-standby.html#STANDBY-SERVER-SETUP

    • 4

relate perguntas

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve