Qual é a melhor maneira de criar a configuração de replicação de mestre-escravo do MySQL e solucionar problemas?

14

Eu sou muito novo na Administração de Banco de Dados.

Enfrento muitos problemas ao configurar a replicação master-slave do mysql.

Também enfrento problemas regulares de solução de problemas de replicação mysql.

Alguém pode ajudar a entender como devo lidar com tudo isso?

Abdul Manaf
fonte
Algumas perguntas: Por que você precisa fazer replicação, o que você está tentando obter? Qual é o SO de cada computador que participa da replicação? Qual é a versão do MySQL em cada computador? As tabelas MyISAM, InnoDB são outra coisa?
Craig Efrein
@CraigEfrein Eu preciso definir a replicação, pois esses servidores serão usados ​​na produção. Estou usando o Debian / ubuntu em cada máquina. mysql5.1 como vaersion. As tabelas principais são o InnoDB.
Abdul Manaf
Ok, vou postar uma configuração que usei entre dois debians daqui a pouco. Isso pressupõe, é claro, que você tenha o MySQL instalado em todos os computadores e que todos eles usem a mesma versão e tenham espaço em disco suficiente. Ao usar a replicação do MySQL, você deve pensar sobre onde está colocando seus logs de lixeira, que podem crescer bastante dependendo de vários fatores. Vou incluir essas informações no meu post
Craig Efrein 2/11/11

Respostas:

19

Forneci links para tutoriais. Lembre-se de que, no Ubuntu, o arquivo my.cnf está em /etc/mysql/my.cnf e não em /etc/my.cnf, como no tutorial da howtoforge. Na minha configuração, eu não usei FLUSH TABLES WITH READ LOCK; no mestre. Se o servidor principal tiver muita atividade de gravação, talvez seja necessário bloquear suas tabelas executando esse comando antes de fazer o backup. Se você usa FLUSH TABLES WITH READ LOCK ;, após o backup, você deseja executar UNLOCK TABLES. Se você tiver algum problema, me avise.

Aqui está o tutorial que encontrei no howto forge, feito para o Redhat / CentOS: http://www.howtoforge.com/mysql_database_replication

Outro tutorial que parecia bom para o Ubuntu http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ubuntu-master-to-slave/

Aqui está a configuração que eu usei:

No servidor MASTER

Configure o servidor principal:

vi /etc/mysql/my.cnf

[mysqld]

# bind-address = 127.0.0.1 (comment this out)
server_id           = 1
log_bin             = /var/log/mysql/mysql-bin.log
log_bin_index       = /var/log/mysql/mysql-bin.log.index
max_binlog_size     = 100M
expire_logs_days    = 1

Reinicie o MySQL:

/etc/init.d/mysql restart

Conecte-se ao console do mysql: mysql -u root -ppassword

Crie e conceda permissões ao usuário de replicação.

GRANT REPLICATION SLAVE ON *.* TO 'replication'@'ipaddressofslave' IDENTIFIED BY 'replicationuserpassword';

Certifique-se de copiar essas informações em algum lugar ou deixá-las visíveis

SHOW MASTER STATUS \G;
mysql> show master status \G;
            File: mysql-bin.000001
        Position: 100
    Binlog_Do_DB: 
Binlog_Ignore_DB:

mysql> quit 

Despejar o banco de dados em um arquivo:

mysqldump -u root -p databasename > /tmp/databasename-backup.sql

Copie o dump do banco de dados no servidor escravo usando scp ou use ftp, se desejar:

scp /tmp/databasename-backup.sql root@ipaddressofslave:/tmp/

No servidor SLAVE

Edite a configuração do mysql:

vi /etc/mysql/my.cnf
[mysqld]

# slave server configuration
server_id           = 2

# this is optional, but I find it useful to specify where the relay logs go to control.  
# Don't forget to create the /var/log/mysql directory and give mysql rights to it.  
# chown mysql:mysql -R /var/log/mysql
# disk space
relay_log           = /var/log/mysql/mysql-relay-bin
relay_log_index     = /var/log/mysql/mysql-relay-bin.index
relay_log_space_limit = 2000M

Reinicie o MySQL: /etc/init.d/mysql restart

Restaure o backup:

mysql -u root -ppassword nameofthedatabase < /tmp/databasename-backup.sql

Conecte-se ao MySQL:

mysql -u root -ppassword

stop slave;

# master log file and master_log_pos taken from show master status above
CHANGE MASTER TO master_host='ipaddressmaster', master_port=3306, master_user='replication', master_password='replicationuserpassword', master_log_file='mysql-bin.000001', master_log_pos=100;

start slave;

Execute SHOW SLAVE STATUS\G:

mysql> show slave status\G;
             Slave_IO_State: Waiting for master to send event
                Master_Host: ipaddressmaster
                Master_User: replication
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.0000001
        Read_Master_Log_Pos: 100
             Relay_Log_File: mysql-relay-bin.000001
              Relay_Log_Pos: 1
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 
         Replicate_Do_Table: 
     Replicate_Ignore_Table: 
    Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                 Last_Errno: 0
                 Last_Error: 
               Skip_Counter: 0
        Exec_Master_Log_Pos: 17324288
            Relay_Log_Space: 17324425
            Until_Condition: None
             Until_Log_File: 
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File: 
         Master_SSL_CA_Path: 
          Master_SSL_Cert: 
          Master_SSL_Cipher: 
             Master_SSL_Key: 
      Seconds_Behind_Master: 0
1 row in set (0.02 sec)

Posteriormente, lembre-se de que a replicação pode falhar por vários motivos. No escravo, você pode monitorar o status executando o comando SHOW SLAVE STATUS \ G; Ou configurar um trabalho cron para monitorar o status e enviar e-mails, se houver falha. Familiarize-se com a saída deste comando. Se a replicação estiver sendo executada corretamente, você deverá ver "Slave_IO_State: Aguardando que o mestre envie o evento".

Depois de obter essa configuração corretamente, posso fornecer um script para monitorar essa replicação.

Aqui está um script para monitorar o log de erros no MySQL. Se você adicionar a linha

[mysqld]

log-error = /var/log/mysql/mysql.err

reinicie o mysql: /etc/init.d/mysql restart

Em seguida, você pode usar o seguinte script para monitorar o arquivo de log. Se o log mudar de alguma maneira, você receberá um email notificando que ocorreu um erro no servidor escravo. Se você deseja que o log de erros seja verificado regularmente, será necessário adicionar esse script ao seu crontab.

Aqui está um exemplo de script: /somepath/monitor_mysql_log.sh

#! /bin/sh
MAIL_TO="[email protected]"

# This is the log that will be monitored.
# If any changes occur to this, then take appropriate action.
MONITORED_LOG=/var/log/mysql/mysql.err

# We will need this log to see whether any changes occured to /tmp/goreb.log
TEMP_LOG=/tmp/.mysql.err.1

# This is a 1-time command i.e. create the log file if it does nto exist.
[ ! -f $TEMP_LOG ] && touch -r $MONITORED_LOG $TEMP_LOG

[ $MONITORED_LOG -nt $TEMP_LOG ] && echo "an error occurred in mysql" | mail -s "Error on MySQL" $MAILTO

# Update $TEMP_LOG with the new modified date of $MONITORED_LOG
touch -r $MONITORED_LOG $TEMP_LOG

Para adicionar ao crontab.

Torne o script executável:

chmod +x /somepath/monitor_mysql_log.sh

Atualize o crontab:

crontab -e

* * * * * /somepath/monitor_mysql_log.sh

E o script será executado a cada minuto.

O script que forneci é um script que acabei de montar rapidamente. Além disso, para que seu servidor possa enviar e-mails, você precisará instalar algo como postfix ou sendmail.

Craig Efrein
fonte
muito obrigado eu fiz assim e eu era capaz de configurar a replicação ...
Abdul Manaf
você pode me fornecer o script para monitorar a replicação.
Abdul Manaf
Apenas uma observação rápida, o script que acabei de adicionar é algo que você instalaria nos servidores escravos. Você pode instalá-lo no servidor principal, mas o log de erros no servidor escravo será o que mais lhe interessa, com base na sua pergunta.
Craig Efrein
obrigado pela sua atenção. Mas, basicamente, eu estava interessado na solução de problemas de erros de replicação. Acho que esse script monitorará as alterações no log de erros para o qual eu o configurarei.
Abdul Manaf
Como o servidor escravo receberá apenas dados e não os atualizará, a maioria das informações registradas no log de erros será sobre replicação. Se, por exemplo, uma tabela no mestre for corrompida, o escravo não replicará a tabela e essencialmente parará de replicar. Se você vir um erro no log de erros do servidor escravo. Geralmente é uma boa indicação de que algo está errado com a replicação.
Craig Efrein
7

O Mysqldump é rápido, mas a restauração de despejos pode ser muito lenta para um grande banco de dados, e o bloqueio de tabelas não é aceitável em um site ativo. Uma maneira muito melhor e mais rápida de configurar escravos é usar o XtraBackup da Percona . O XtraBackup impõe pouca carga no mestre, não requer bloqueios e a restauração no escravo é muito rápida. Esse mecanismo produz um clone completo de todo o banco de dados, incluindo coisas como tabelas de usuários, que quebram algumas coisas configuradas por uma instalação de estoque, como o usuário debian-sys-maint, que não é necessariamente uma coisa ruim !

Como bônus, depois de saber como fazer isso, você pode usar exatamente o mesmo mecanismo para seus backups diários. Os backups são mais lentos que o mysqldump, mas as restaurações são muito mais rápidas, o que é exatamente o que você precisa se você estiver em uma situação em que estiver em pânico e precisar restaurar um backup! Se você receber algum erro grave de replicação, use este procedimento para descartar o escravo e reconstruí-lo; realmente não demora muito.

Você precisará configurar o repositório apt / yum do Percona para sua distribuição e instalar o xtrabackuppacote no master e no slave. Também recomendo fortemente o uso do utilitário de compactação pigz (gzip paralelo, disponível na maioria dos repositórios padrão), pois faz uma enorme diferença na velocidade de backup.

O processo é assim (no Ubuntu, outras distribuições podem variar um pouco) e assume que você já instalou o MySQL no seu escravo:

  1. Primeiro, faça um backup no mestre: mkdir -p /var/xtrabackup; /usr/bin/innobackupex --slave-info --stream=tar --throttle=1500 /var/xtrabackup 2> /tmp/xtrabackup.out | /usr/bin/pigz -p 4 -c --best -q > /var/backups/mysql.tgz (ajuste o valor do acelerador para limitar o impacto do backup no serviço ativo)
  2. Copie o arquivo de backup para o escravo (use scp -l 400000 para não passar fome o mestre da largura de banda da rede para clientes ativos)
  3. Pare o mysql no escravo: service mysql stop
  4. Mova o antigo diretório de dados do MySQL para fora do caminho: mv /var/lib/mysql /var/lib/mysql2 (ou compacte-o em algum lugar, se você estiver com pouco espaço em disco)
  5. Crie um novo diretório de dados e entre nele: mkdir /var/lib/mysql; cd /var/lib/mysql
  6. Descompacte o arquivo de backup para a nova pasta: tar xvzif /path/to/backup/mysql.tgz. Observe a iopção na operação tar - ela não funcionará sem ela . Isso levará um tempo se você tiver um grande banco de dados.
  7. Execute a ferramenta Innobackupex nos arquivos extraídos: /usr/bin/innobackupex --apply-log --use-memory=6G --ibbackup=xtrabackup /var/lib/mysql . Isso efetivamente executa uma recuperação de falha nos arquivos dos logs binários. Isso leva apenas alguns segundos; use uma quantidade menor de memória se estiver em um servidor menor.
  8. Supondo que seja concluído com êxito, exclua o backup e defina a propriedade dos arquivos: rm /path/to/backup/mysql.tgz; chown -R mysql:mysql /var/lib/mysql
  9. Inicie o mysql: service mysql start
  10. Obter o nome do arquivo de log mestre e a posição do backup (nota não a informação em xtrabackup_slave_info): cat xtrabackup_binlog_info. Vai dizer algo comomysql-bin.000916 13889427
  11. Conecte-se ao MySQL e verifique se há coisas lá.
  12. Redefina as configurações de replicação usando os detalhes obtidos sobre os logs: CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000916', MASTER_LOG_POS=13889427;(Altere para corresponder aos detalhes reais do servidor de banco de dados)
  13. Reinicie o escravo: START SLAVE;
  14. Verifique o status do escravo enquanto ele alcança o mestre até que 'seconds_behind_master' seja 0: SHOW SLAVE STATUS\G

Seu escravo agora está pronto. Se necessário, agora você pode configurar a replicação circular:

  1. No escravo: FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;Anote o nome e a posição do arquivo de log (algo como mysql-bin.000031 e 17244785).
  2. No mestre CHANGE MASTER TO MASTER_HOST='192.168.0.2', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000031', MASTER_LOG_POS=17244785;:, inserindo valores do escravo que acabamos de ver.
  3. No mestre: START SLAVE;
  4. No escravo: UNLOCK TABLES;

Agora você deve estar tudo pronto com uma replicação circular.

No que diz respeito à solução de problemas, o kit de ferramentas da Percona tem todo tipo de ajuda, como soma de verificação para detectar corrupção silenciosa, medição de atraso e muito mais. As formas mais comuns de corrupção de replicação podem ser evitadas configurando binlog_format = MIXEDno my.cnf. Dito isto, na minha experiência, a replicação geralmente não é problemática.

Synchro
fonte
Qual é a sua lealdade?
Pacerier 17/02
Nenhum, exceto como um usuário satisfeito.
Synchro