segunda-feira, 6 de maio de 2013

Replicação circular através MySQL, Percona eo MariaDB

Original post: http://anothermysqldba.blogspot.com/2013/05/circular-replication-through-mysql.html










Eu recentemente publicado sobre a construção de MySQL e garfos relacionados da fonte só para testar o processo e uma espécie geeky de diversão.


Isso tudo é atualmente apenas para fins de demonstração e avaliação. Se você está ansioso para uma solução pronta de produção com replicação circular confira o link abaixo pela primeira vez sobre o tungstênio-replicador.


Agora vou configurar a replicação circular através destes ambientes de servidores diferentes.Por quê?
  • Confirme o quão fácil pode ser feito se isso pode ser feito.
    • Maior problema é auto-incremento e eu quero três servidores e não apenas dois.
  • É claro que o verdadeiro teste é mais com 5.6 e futuras versões.
  • Espero que os erros por causa de características diferentes.
    • Estou curioso como muitas vezes eu corro através deste.

Primeiro eu editei o arquivo de configuração relacionada para este servidor. Minha fonte pósreferências mais se precisar de mais informações.
Eu editei o seguinte:

  • server-id = 1
  • # Descomente a seguinte, se você quiser registrar atualizações
  • log-bin = / var / lib / oracle_mysql / oracle_mysql-bin
  • Formato de registo # binário - mixed recomendado
  • binlog_format = misturado

>
+ ------------ +
| VERSION () |
+ ------------ +
| 5.5.31-log |
+ ------------ +


>show master status\G
*************************** 1. row ***************************
File: oracle_mysql-bin.000001
Position: 107
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)

SET GLOBAL auto_increment_offset=1;
SET GLOBAL auto_increment_increment=2;

> show global variables like '%auto_increment%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 2 |
| auto_increment_offset | 1 |
+--------------------------+-------+



  • server-id = 2
  • log-bin = percona_mysql-bin
  • binlog_format = misturado

>

+------------+
| VERSION() |
+------------+
| 5.5.30-log |
+------------+


> show master status\G
*************************** 1. row ***************************
File: percona_mysql-bin.000001
Position: 107
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.01 sec)

> show global variables like '%auto_increment%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 2 |
| auto_increment_offset | 2 |
+--------------------------+-------+

CHANGE
MASTER TO MASTER_HOST='localhost',
MASTER_USER='root',
MASTER_PASSWORD='',
MASTER_PORT=3309,
MASTER_LOG_FILE='oracle_mysql-bin.000001',
MASTER_LOG_POS=107,
MASTER_CONNECT_RETRY=10;
mysql_yoda> start slave;

> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: localhost
Master_User: root
Master_Port: 3309
Connect_Retry: 10
Master_Log_File: oracle_mysql-bin.000001
Read_Master_Log_Pos: 107
Relay_Log_File: percona-relay-bin.000002
Relay_Log_Pos: 260
Relay_Master_Log_File: oracle_mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes



  • server-id = 3
  • log-bin = maria_mysql-bin
  • binlog_format = misturado
    >

    +--------------------+
    | VERSION() |
    +--------------------+
    | 5.5.30-MariaDB-log |
    +--------------------+


    > show master status\G
    *************************** 1. row ***************************
    File: maria_mysql-bin.000001
    Position: 245
    Binlog_Do_DB:
    Binlog_Ignore_DB:
    1 row in set (0.00 sec)

    CHANGE
    MASTER TO MASTER_HOST='localhost',
    MASTER_USER='root',
    MASTER_PASSWORD='',
    MASTER_PORT=3307,
    MASTER_LOG_FILE='percona_mysql-bin.000001',
    MASTER_LOG_POS=107,
    MASTER_CONNECT_RETRY=10;

    > show slave status\G
    *************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
    Master_Host: localhost
    Master_User: root
    Master_Port: 3307
    Connect_Retry: 10
    Master_Log_File: percona_mysql-bin.000001
    Read_Master_Log_Pos: 107
    Relay_Log_File: mariadb-relay.000002
    Relay_Log_Pos: 399
    Relay_Master_Log_File: percona_mysql-bin.000001
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

    show global variables like '%auto_increment%';
    +--------------------------+-------+
    | Variable_name | Value |
    +--------------------------+-------+
    | auto_increment_increment | 1 |
    | auto_increment_offset | 1 |
    +--------------------------+-------+ 


    Portanto, esta é uma cadeia de replicação retransmitida no momento e eu estava procurando fazer uma replicação circular.
    Agora, se caso você ainda não percebeu como ainda, a compensação dos valores AUTO_INCREMENT por 3 servidores não faz muito sentido.



    Para completar o círculo vou primeiro apenas criar um círculo entre MySQL e Percona. O banco de dados Percona também irá replicar para MariaDB.

    CHANGE
    MASTER TO MASTER_HOST='localhost',
    MASTER_USER='root',
    MASTER_PASSWORD='',
    MASTER_PORT=3307,
    MASTER_LOG_FILE='percona_mysql-bin.000001',
    MASTER_LOG_POS=107,
    MASTER_CONNECT_RETRY=10;

    > show slave status\G

    *************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
    Master_Host: localhost
    Master_User: root
    Master_Port: 3307
    Connect_Retry: 10
    Master_Log_File: percona_mysql-bin.000001
    Read_Master_Log_Pos: 107
    Relay_Log_File: oracle_mysql-relay.000002
    Relay_Log_Pos: 261
    Relay_Master_Log_File: percona_mysql-bin.000001
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes


    A replicação é fácil de configurar com os servidores que não têm tráfego. Então, para começar, eu queria confirmar que tudo realmente funcionou, apesar de o estado apresentou resultados positivos.








    oracle_mysql>create database teamwork ;
    oracle_mysql>show databases;
    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    | mysql |
    | performance_schema |
    teamwork |
    | test |
    +--------------------+ 





    percona>show databases;
    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    | mysql |
    | performance_schema |
    teamwork |
    | test |
    +--------------------+ 



    MariaDB>show databases; 
    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    | mysql |
    | performance_schema |
    | test |
    +--------------------+

    Problemas já. Podemos ver que o Oráculo MySQL replicado para a instância Percona bem.
    Então vamos testar isso de novo.


    percona>create database community ;








    MariaDB>show databases; 

    +--------------------+
    | Database |
    + -------------------- +
    | Information_schema |
    Comunidade |
    | Mysql |
    | Performance_schema |
    | Teste |
    + -------------------- +




    oracle_mysql>show databases;
    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    community |
    | mysql |
    | performance_schema |
    | teamwork |
    | test |
    +--------------------+ 

    Assim, ironicamente, MariaDB funcionou bem com Percona e aceito na comunidade quando não aceitar trabalho em equipe que se originou através Oracle_mysql. Deve-se notar que Oracle_mysql que também aceitam o trabalho da comunidade de Percona.

    Assim, podemos corrigi-lo e qual é o problema?

    Bem, eu poderia apenas esperar e testar o MariaDB 10.0 versão e permitir que ele use multi-mestre .
    Isso pode ser uma solução, porque eu poderia ter replicação circular com Oracle_mysql & Percona e depois usar MariDB para mantê-los tanto em xeque por ter dados replicados para ele e, em seguida, usá-lo para relatar. No entanto, isto pode causar problemas bem.

    Então, o que pode ser feito para tornar tudo feliz entre todos eles?


     Então, primeiro como um teste, eu moverei o mestre de Maria de Percona para MySQL.


    CHANGE
    MASTER TO MASTER_HOST='localhost',
    MASTER_USER='root',
    MASTER_PASSWORD='',
    MASTER_PORT=3309,
    MASTER_LOG_FILE='oracle_mysql-bin.000001',
    MASTER_LOG_POS=708,
    MASTER_CONNECT_RETRY=10;



    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes 





    oracle_mysql>use community;
    oracle_mysql>CREATE TABLE `tab1` (
    -> `col1` int(11)
    -> ) ;

    .... After the percona insert below...


    oracle_mysql>select * from tab1;
    +------+
    | col1 |
    +------+
    | 2 |
    | 3 |
    | NULL |
    | 2 |
    | 3 |
    | 1 |
    +------+
    6 rows 




    percona>use community;

    percona>INSERT INTO tab1 VALUE (2),(3),(NULL),(2),(3),(1);
    Query OK, 6 rows affected (0.06 sec)


     


    MariaDB>use community;
    MariaDB>select * from tab1;
    Empty set (0.00 sec) 



    Assim, a replicação circular funciona, desde que eu uso MySQL para todas as gravações. Uma vez que eu escrevo para Percona ele não consegue replicar para MariaDB via Oracle_mysql.

    Assim, o tempo para cavar os logs ....


    # ./mysqlbinlog /var/lib/percona/percona-relay-bin.000008

    SET @@session.collation_database=DEFAULT/*!*/;
    CREATE TABLE `tab1` (
    `col1` int(11)
    )
    /*!*/;
    DELIMITER ;
    # End of log file

    # ./mysqlbinlog /var/lib/percona/percona_mysql-bin.000001

    use `community`/*!*/;
    SET TIMESTAMP=1367775597/*!*/;
    INSERT INTO tab1 VALUE (2),(3),(NULL),(2),(3),(1)
    /*!*/;
    # at 619
    #130505 17:39:57 server id 2 end_log_pos 646 Xid = 111
    COMMIT/*!*/;
    DELIMITER ;
    # End of log file

    # ./mysqlbinlog /var/lib/oracle_mysql/oracle_mysql-relay.000002

    use `community`/*!*/;
    SET TIMESTAMP=1367775597/*!*/;
    INSERT INTO tab1 VALUE (2),(3),(NULL),(2),(3),(1)
    /*!*/;
    # at 461
    #130505 17:39:57 server id 2 end_log_pos 646 Xid = 111
    COMMIT/*!*/;
    DELIMITER ;
    # End of log file
    # ./mysqlbinlog /var/lib/oracle_mysql/oracle_mysql-bin.000003

    SET @@session.collation_database=DEFAULT/*!*/;
    CREATE TABLE `tab1` (
    `col1` int(11)
    )
    /*!*/;
    DELIMITER ;
    # End of log file 

    # ./mysqlbinlog /var/lib/mariadb/mariadb-relay.000002

    SET @@session.collation_database=DEFAULT/*!*/;
    CREATE TABLE `tab1` (
    `col1` int(11)
    )
    /*!*/;
    DELIMITER ;
    # End of log file




    Como você pode ver a partir dos dados de log, com esta configuração atual você terá replicação circular e um escravo, mas você vai ter um escravo válido se só escrever para um senhor. Você pode mover-se facilmente que o escravo se o mestre caiu embora. As pessoas costumam olhar para a replicação circular como a resposta, isso mostra que ele pode ajudar, mas não resolve tudo. Novamente, se você está ansioso para uma solução pronta de produção com replicação circular confira o link abaixo pela primeira vez sobre o tungstênio-replicador.








    Para cada ação há uma conseqüência, o que vai, volta.
    Karma vai nos ensinar a todos uma coisa, quer gostemos ou não.