lunes, 6 de mayo de 2013

Circular a través de la replicación MySQL, Percona y MariaDB

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










Recientemente he publicado sobre la construcción de MySQL y horquillas relacionadas de la fuente sólo para probar el proceso y una especie de diversión geek.


Todo esto es actualmente sólo para fines de demostración y evaluación. Si usted está interesado en una solución lista para la producción de comprobar la replicación circular el enlace de abajo primero sobre el tungsteno-replicador.


Ahora voy a configurar la replicación circular a través de estos diferentes entornos de servidor. ¿Por qué?
  • Compruebe lo fácil que se puede hacer si es posible hacerlo.
    • El mayor problema es auto-incremento y quiero 3 servidores no sólo 2.
  • Por supuesto, la verdadera prueba son versiones más con el 5,6 y el futuro.
  • Espero que los errores debido a las diferentes características.
    • Tengo curiosidad por qué frecuencia me encuentro con esto.

En primer lugar he editado el fichero de configuración relacionados para este servidor. Mis fuentes posteriores referencias más si necesitan más información.
He editado el siguiente:

  • server-id = 1
  • # Descomente lo siguiente si desea registrar cambios
  • log-bin = / var / lib / oracle_mysql / oracle_mysql-bin
  • Formato de registro # binario - recomendado mixta
  • binlog_format = mezclada

>
+ ------------ +
| 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 = mezclada

>

+------------+
| 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 = mezclada
    >

    +--------------------+
    | 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 |
    +--------------------------+-------+ 


    Así que esto es una cadena de replicación retransmitido en este momento y yo estaba tratando de hacer una réplica circular.
    Ahora bien, si si no te has dado cuenta hasta el momento, la compensación de los valores AUTO_INCREMENT en 3 servidores no tiene mucho sentido.



    Para completar el círculo que voy a primero basta con crear un círculo entre MySQL y Percona. La base de datos Percona también se replicará a 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


    La replicación es fácil de configurar con servidores que no tienen tráfico. Así que para empezar, quería confirmar que todo lo que realmente trabajado, a pesar de que el estado mostró 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 |
    +--------------------+

    Dificultad para ya. Podemos ver que el Oracle MySQL replican en la instancia Percona bien.
    Así que vamos a probar otra vez.


    percona>create database community ;








    MariaDB>show databases; 

    +--------------------+
    | Database |
    + -------------------- +
    | Information_schema |
    Community |
    | Mysql |
    | Performance_schema |
    | Prueba |
    + -------------------- +




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

    Así que, irónicamente, MariaDB trabajó bien con Percona y aceptó la comunidad cuando no aceptó el trabajo en equipo que se originó a través de Oracle_mysql. Cabe señalar que Oracle_mysql también aceptó el trabajo de la comunidad de Percona.

    Entonces, ¿podemos arreglarlo y cuál es el problema?

    Bueno, yo sólo podía esperar y probar el MariaDB 10.0 versión y permitir la utilización de varios maestros .
    Eso podría ser una solución, ya que podría tener la replicación circular con Oracle_mysql y Percona y luego usar MariDB para mantener a ambos en jaque por tener datos replicados a ella y luego usarla para informar. Sin embargo, eso podría causar problemas también.

    Entonces, ¿qué se puede hacer para que todo sea feliz entre todos ellos?


     Así que por primera vez como una prueba, me moveré maestría Maria de Percona a 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) 



    Así que la replicación circular funciona siempre y cuando utilizo MySQL para todas las escrituras. Una vez que me dirijo a Percona que no se replica a través de MariaDB Oracle_mysql.

    Así que el tiempo para profundizar en los registros ....


    # ./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 se puede ver en los datos de registro, con la configuración actual obtendrá replicación circular y un esclavo, pero usted recibirá un esclavo válida si sólo escribes a un maestro.Puede mover ese esclavo fácilmente si el maestro se estrelló sin embargo. Las personas a menudo recurren a la replicación circular como la respuesta, esto demuestra que puede ayudar, pero no resuelve todo. De nuevo, si usted está interesado en una solución lista para la producción de comprobar la replicación circular el enlace de abajo primero sobre el tungsteno-replicador.








    Para cada acción hay una consecuencia, lo que va, vuelve.
    Karma nos enseñará toda cosa, nos guste o no.