Mysql Replication


                                          André Herculano
                                      andresilveirah@gmail.com
Thursday, December 13, 12
Contexto
                    • O objetivo:
                            • Migrar aplicações de um servidor para o
                              outro com o mínimo de downtime;

                    • O Problema:
                            • Interações com a base de dados durante
                              o processo de migração poderiam levar a
                              base a um estado inconsistente;


Thursday, December 13, 12
Soluções
                  XtraBackup
          Ferramenta open source para
        backup de servidores MySql com
                engine InnoDB;

                     Prós:
        Realiza backup da base de dados
         sem a necessidade de lock nas
                    tabelas.




Thursday, December 13, 12
Soluções
          MySQL Replication + Mysqldump
          Feito através do já implementado
          processo de Master - Slave e dump
                    via Mysqldump

                             Prós:
                    Simples de implementar;
                       Nativo do banco;
                      Bem documentado;

                       Contra:
           Dump via myslqdump exige o read
                   lock das tabelas;


Thursday, December 13, 12
MySql Master- Slave




       • Toda operação que acontece no servidor master é replicado
          para os slaves. O contrário não é verdadeiro.

       • Comunicação se dá via TCP;
       • Dowtime só é necessário, caso o servidor master não tenha
          sido preparado préviamente para ser master;

Thursday, December 13, 12
#Comofas
                      1. Preparar o servidor Master para ser master (my.cnf):

                        [mysqld]
                        log-bin=mysql-bin
                        server-id=1
                        bind-address = 0.0.0.0 #ou ip do slave
                        binlog-do-db = <database1> # bancos a serem replicados
                        binlog-do-db = <database2> # bancos a serem replicados
                        binlog-ignore-db = mysql




                      2. Dar permissões para o usuário que fará a replicação

                        mysql> GRANT REPLICATION SLAVE ON *.* TO 'user'@'<ip do
                        slave>' IDENTIFIED BY 'password';




Thursday, December 13, 12
#Comofas
                      3. Obter um snapshot do master

              mysql> FLUSH TABLES WITH READ LOCK;

              # em outra sessão do mysql

              mysql > SHOW MASTER STATUS;
              +------------------+----------+--------------+------------------+
              | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
              +------------------+----------+--------------+------------------+
              | mysql-bin.000001 | 106      | db1          | mysql            |
              +------------------+----------+--------------+------------------+

              # caso o slave esteja vazio, realizar o dump do banco ainda com as
              # tabelas em lock (vide ultimo slide)

              mysql > UNLOCK TABLES;



                      Essas informações serão necessárias para a configuração do
                      slave.

Thursday, December 13, 12
#Comofas
                      4. Configurar o Slave (my.cnf):

              [mysqld]
              server-id=2
              replicate-do-db= <database1>
              replicate-do-db= <database2>

              # caso queira preparar o slave para ser um futuro master também
              log-bin=mysql-bin
              bind-address = 0.0.0.0 # ou ip do slave
              binlog-do-db = <database1> # bancos a serem replicados
              binlog-do-db = <database2> # bancos a serem replicados
              binlog-ignore-db = mysql




                      ps: para que as configurações do mysql sejam aplicadas o
                      serviço deve ser reiniciado.

                      $ sudo service mysql (ou mysqld) restart

Thursday, December 13, 12
#Comofas
                      5. Apontar o slave para o Master:

              mysql> CHANGE MASTER TO
                  ->     MASTER_HOST='master_host', #ip ou nome do host
                  ->     MASTER_USER='replication_user_name',
                  ->     MASTER_PASSWORD='replication_password',
                  ->     MASTER_LOG_FILE='recorded_log_file_name',
                  ->     MASTER_LOG_POS=recorded_log_position;



                     Aqui usamos as informações obtidas no snapshot do passo 4

                      6. Apontar o slave para o Master:

              mysql> START SLAVE;




Thursday, December 13, 12
#Comofas
                      7. Sabendo se está tudo certo:
              mysql> show slave statusG;
              ...
                              Last_IO_Errno: 0
                              Last_IO_Error:
                             Last_SQL_Errno: 0
                             Last_SQL_Error:
                Replicate_Ignore_Server_Ids:
                           Master_Server_Id: 1


                    Observar o ‘Last_IO_Error’.
                    Um erro comum é o Access Denied

                    • Verificar via telnet se a porta 3306 está aberta;
                    • Verificar os previlégios do usuário escolhido para a
                            replicação;

                    • Tentar conectar no mysql do master via terminal pelo
                            slave;

Thursday, December 13, 12
#Comofas
                      Importante:

                      Caso o Slave esteja vazio, o backup do master deve ser
                      restaurado no slave ANTES de a replicação Master - Slave
                      começar;
              # no master
              mysqldump -u username -p --databases db1 db2 db3 > dump.sql

              #no slave
              mysql -u username -p < dump.sql




Thursday, December 13, 12
Mais Materiais

                    •       http://www.percona.com/files/presentations/percona-live/dc-2012/
                            PLDC2012-introduction-to-mysql-replication.pdf

                    •       http://dev.mysql.com/doc/refman/5.0/en/replication.html

                    •       http://www.infobora.info/high-availability-with-a-masterslave-mysql-
                            configuration/

                    •       http://erlycoder.com/43/mysql-master-slave-and-master-master-replication-
                            step-by-step-configuration-instructions-




Thursday, December 13, 12
Obrigado


                                      André Herculano
                                  andresilveirah@gmail.com
Thursday, December 13, 12

Mysql Replication

  • 1.
    Mysql Replication André Herculano andresilveirah@gmail.com Thursday, December 13, 12
  • 2.
    Contexto • O objetivo: • Migrar aplicações de um servidor para o outro com o mínimo de downtime; • O Problema: • Interações com a base de dados durante o processo de migração poderiam levar a base a um estado inconsistente; Thursday, December 13, 12
  • 3.
    Soluções XtraBackup Ferramenta open source para backup de servidores MySql com engine InnoDB; Prós: Realiza backup da base de dados sem a necessidade de lock nas tabelas. Thursday, December 13, 12
  • 4.
    Soluções MySQL Replication + Mysqldump Feito através do já implementado processo de Master - Slave e dump via Mysqldump Prós: Simples de implementar; Nativo do banco; Bem documentado; Contra: Dump via myslqdump exige o read lock das tabelas; Thursday, December 13, 12
  • 5.
    MySql Master- Slave • Toda operação que acontece no servidor master é replicado para os slaves. O contrário não é verdadeiro. • Comunicação se dá via TCP; • Dowtime só é necessário, caso o servidor master não tenha sido preparado préviamente para ser master; Thursday, December 13, 12
  • 6.
    #Comofas 1. Preparar o servidor Master para ser master (my.cnf): [mysqld] log-bin=mysql-bin server-id=1 bind-address = 0.0.0.0 #ou ip do slave binlog-do-db = <database1> # bancos a serem replicados binlog-do-db = <database2> # bancos a serem replicados binlog-ignore-db = mysql 2. Dar permissões para o usuário que fará a replicação mysql> GRANT REPLICATION SLAVE ON *.* TO 'user'@'<ip do slave>' IDENTIFIED BY 'password'; Thursday, December 13, 12
  • 7.
    #Comofas 3. Obter um snapshot do master mysql> FLUSH TABLES WITH READ LOCK; # em outra sessão do mysql mysql > SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 106 | db1 | mysql | +------------------+----------+--------------+------------------+ # caso o slave esteja vazio, realizar o dump do banco ainda com as # tabelas em lock (vide ultimo slide) mysql > UNLOCK TABLES; Essas informações serão necessárias para a configuração do slave. Thursday, December 13, 12
  • 8.
    #Comofas 4. Configurar o Slave (my.cnf): [mysqld] server-id=2 replicate-do-db= <database1> replicate-do-db= <database2> # caso queira preparar o slave para ser um futuro master também log-bin=mysql-bin bind-address = 0.0.0.0 # ou ip do slave binlog-do-db = <database1> # bancos a serem replicados binlog-do-db = <database2> # bancos a serem replicados binlog-ignore-db = mysql ps: para que as configurações do mysql sejam aplicadas o serviço deve ser reiniciado. $ sudo service mysql (ou mysqld) restart Thursday, December 13, 12
  • 9.
    #Comofas 5. Apontar o slave para o Master: mysql> CHANGE MASTER TO -> MASTER_HOST='master_host', #ip ou nome do host -> MASTER_USER='replication_user_name', -> MASTER_PASSWORD='replication_password', -> MASTER_LOG_FILE='recorded_log_file_name', -> MASTER_LOG_POS=recorded_log_position; Aqui usamos as informações obtidas no snapshot do passo 4 6. Apontar o slave para o Master: mysql> START SLAVE; Thursday, December 13, 12
  • 10.
    #Comofas 7. Sabendo se está tudo certo: mysql> show slave statusG; ... Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Observar o ‘Last_IO_Error’. Um erro comum é o Access Denied • Verificar via telnet se a porta 3306 está aberta; • Verificar os previlégios do usuário escolhido para a replicação; • Tentar conectar no mysql do master via terminal pelo slave; Thursday, December 13, 12
  • 11.
    #Comofas Importante: Caso o Slave esteja vazio, o backup do master deve ser restaurado no slave ANTES de a replicação Master - Slave começar; # no master mysqldump -u username -p --databases db1 db2 db3 > dump.sql #no slave mysql -u username -p < dump.sql Thursday, December 13, 12
  • 12.
    Mais Materiais • http://www.percona.com/files/presentations/percona-live/dc-2012/ PLDC2012-introduction-to-mysql-replication.pdf • http://dev.mysql.com/doc/refman/5.0/en/replication.html • http://www.infobora.info/high-availability-with-a-masterslave-mysql- configuration/ • http://erlycoder.com/43/mysql-master-slave-and-master-master-replication- step-by-step-configuration-instructions- Thursday, December 13, 12
  • 13.
    Obrigado André Herculano andresilveirah@gmail.com Thursday, December 13, 12