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 / 239639
Accepted
GuruBob
GuruBob
Asked: 2019-06-02 17:31:07 +0800 CST2019-06-02 17:31:07 +0800 CST 2019-06-02 17:31:07 +0800 CST

Escravo de replicação MySQL usando percona e docker

  • 772

Estou tentando executar um escravo de replicação do MySQL em um contêiner docker. Estamos executando o MySQL 5.7.24-27-log em produção e é do repositório percona (Ubuntu 18.04).

Eu costumava xtrabackupfazer backup, preparar e enviar um conjunto de dados inicial para replicação e, em seguida, iniciei a imagem do docker percona ( docker pull percona) assim:

$ docker run --name mysql-replication -v /replication/data:/var/lib/mysql -v /replication/docker.cnf:/etc/mysql/docker.cnf:ro -e MYSQL_ROOT_PASSWORD=xxxx -P -d percona

Meu docker.cnf simplesmente anota o server-id (eu copiei da perconaimagem).

[mysqld]
skip-host-cache
skip-name-resolve
bind-address    = 0.0.0.0
server-id       = 4

Depois de usar CHANGE MASTERetc. Eu tenho a replicação funcionando muito bem.

Minha intenção (de acordo com o volume mount -v /replication/data:/var/lib/mysql) é manter todos os dados do MySQL na máquina host e tratar o contêiner docker de replicação como efêmero, ou seja, nenhum estado mantido no contêiner. Também deve ser fácil iniciar outro contêiner de replicação, caso eu precise de um, interrompendo o contêiner existente, copiando os dados em outro lugar, alterando server-ide executando um novo contêiner.

Para testar isso, depois que ele foi configurado e executado corretamente (eu assisti Seconds_Behind_Masterao menu suspenso 0), imaginei que deveria ser capaz de excluir o contêiner e recriá-lo, e a replicação ainda funcionaria bem. Por isso, tentei isso:

$ docker stop mysql-replication
$ docker rm mysql-replication
$ docker run ... // same command as before

Quando faço isso e me conecto ao MySQL em execução no contêiner, descubro que Slave_IO_Runningé No, e depois de iniciá-lo ( START SLAVE;) recebo o seguinte (como visto em SHOW SLAVE STATUS;):

Last_Error: Could not execute Update_rows event on table databasename.tablename; Can't find record in 'tablename', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000681, end_log_pos 9952

( databasenamee tablenamesão nomes reais de banco de dados e tabelas)

No começo, pensei que provavelmente tinha estragado alguma coisa, mas tentei isso várias vezes agora para tentar resolver o problema. Using docker diff mysql-replicationnão mostra alterações no contêiner em execução que parecem ser significativas:

$ docker diff mysql-replication 
C /run
C /run/mysqld
A /run/mysqld/mysqld.pid
C /var
C /var/log
A /var/log/mysql

A pesquisa no Google sugeriu que eu preciso usar RESET SLAVE;e, START SLAVE;mas isso não parece resolvê-lo - é como se os dados (fora do contêiner) não estivessem mais sincronizados com o mestre e, portanto, a replicação não pudesse continuar.

Alguém pode escolher buracos no que estou fazendo, por favor?

Muito obrigado.

replication percona
  • 1 1 respostas
  • 565 Views

1 respostas

  • Voted
  1. Best Answer
    GuruBob
    2019-06-13T03:57:36+08:002019-06-13T03:57:36+08:00

    A causa raiz desse problema foi a ausência da relay-logopção no mysql.cnfarquivo (ou, neste caso, devido às montagens de volume do docker, o docker.cnfarquivo). Isso levou à criação e uso de arquivos como 89726507f176-relay-bin.000002inicialmente, onde 89726507f176é o nome do host da máquina (atribuído aleatoriamente pelo daemon do docker quando uma imagem é criada). Quando o contêiner foi parado, removido e recriado, um novo conjunto de arquivos foi criado e usado (por exemplo be0c801d95bc-relay-bin.000407, ), mas isso causou problemas de sincronização.

    Ao especificar explicitamente um valor para relay-logno docker.cnfarquivo, o contêiner pôde ser removido e recriado sem problemas.

    Como nota lateral, sugeri também que havia um problema com o diretório /var/log/mysql não sendo montado - este não é o caso. Se, no entanto, você especificar um valor de log_bin = /var/log/mysql/mysql-bin.logpor exemplo, isso será um requisito. Se você não especificar este caminho, parece que os logs binários são armazenados localmente em /var/lib/mysql que já está montado fora do contêiner.

    Meu arquivo final docker.cnfé o seguinte:

    [mysqld]
    skip-host-cache
    skip-name-resolve
    bind-address        = 0.0.0.0
    
    binlog-ignore-db = mysql
    replicate-ignore-db = mysql
    
    log_bin = /var/log/mysql/mysql-bin.log
    
    relay-log   = replication-1
    server_id   = 1
    

    Nota: server_id = 2no escravo de replicação.

    Observe também que, sem a relay-logopção, o comando SHOW MASTER STATUS;não retornou resultados no contêiner do banco de dados mestre.

    Há um possível problema pendente ainda que, por padrão, quando você o usa docker stop, solicita que o contêiner seja encerrado (enviando um SIGHUP para o comando docker entrypoint) e, se não for encerrado em 10 segundos, será interrompido com força. Eu preciso garantir que isso tenha tempo suficiente para desligar, pois pode demorar um pouco para se resolver enquanto estiver sob carga, possivelmente resultando em perda de dados como resultado.

    • 0

relate perguntas

  • Como você pode impedir que o escravo MySQL replique as alterações no banco de dados 'mysql'?

  • É imprudente executar a replicação no mesmo servidor físico?

  • Existe uma maneira de medir o atraso de replicação no MySQL com uma resolução inferior a 1 segundo?

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

  • 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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

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

    • 4 respostas
  • Marko Smith

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

    • 10 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
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +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

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