jueves, 19 de agosto de 2010

Replicación Maestro->Esclavo1->Esclavo2 en mySQL

A continuación les dejo una chuleta (cheat sheet) para configurar bases de datos mySQL de forma Maestro->Esclavo1->Esclavo2.

Configuración inicial

Maestro: host localhost, port 17050
Esclavo1: host localhost, port 17051
Esclavo2: host localhost, port 17052

Configurando Maestro-Esclavo1

Primero: Configuración del Maestro
  1. Debe tener log-bin (bajo [mysqld] en my.cnf)
  2. Debe tener un usuario para replicación
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'localhost' IDENTIFIED BY '123456';
  3. Debe extraer los parámetros de configuración para Esclavo1
    SHOW MASTER STATUS;

Segundo: Configuración del Esclavo1
  1. Debe tener log-bin (bajo [mysqld] en my.cnf)
  2. Debe tener log-slave-updates (bajo [mysqld] en my.cnf)
  3. Debe tener un usuario para replicación
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'localhost' IDENTIFIED BY '123456';
  4. Debe configurar Esclavo1 como esclavo de Maestro, para lo cual deberá introducir los parámetros obtenidos arriba en el paso 3.
    CHANGE MASTER TO MASTER_HOST='localhost', MASTER_PORT=17050, MASTER_USER='repl', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=202
  5. Debe comenzar la replicación
    START SLAVE;

Incorporando al Esclavo2

Una vez que el esquema Maestro-Esclavo1 se encuentre funcionando correctamente, se procederá a configurar el Esclavo2.

Primero: Extracción del dump (a partir de Esclavo1)
  1. Debe detener la replica como esclavo y liberar sus logs (en Esclavo1):
    STOP SLAVE;
    FLUSH LOGS;
  2. Debe extraer un dump (de Esclavo1)
    mysqldump -u root --password=msandbox --port=17051 --host=127.0.0.1 --master-data=2 test > dump1.sql
  3. Reiniciar la replica como esclavo (en Esclavo1 - volviendo a la normalidad):
    START SLAVE;

Segundo: Configuración del Esclavo2
  1. Restaurar el dump (en Esclavo2)
    mysql -u root --password=msandbox --port=17051 --host=127.0.0.1 test < dump1.sql
  2. Extraer parámetros de configuración del maestro. Para ello deberá buscar en el dump (dump1.sql) una línea como la siguiente:
    -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=106
  3. Configurar Esclavo2 como esclavo de Esclavo1. Deberá copiar los parámetros extraidos en el paso 2 e introducirlos en este comando:
    CHANGE MASTER TO MASTER_HOST='localhost', MASTER_PORT=17051, MASTER_USER='repl', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=106
  4. Iniciar el esclavo (en Esclavo2)
    START SLAVE;

NOTA: La configuración inicial Maestro-Esclavo se asume desde el inicio, antes de que la base de datos tuviese registro alguno.

Para este ejercicio utilicé MySQL Sandbox

Y para realizar inserciones -sin parar- en las tablas del maestro utilicé el siguiente script:

#!/bin/bash

x=0;     # initialize x to 0
#while [ "$x" -le 10 ]; do
while true; do
    mysql -u root --password=msandbox --port=17050 --host=127.0.0.1 -e "INSERT INTO test.a VALUES($x)"   
    # increment the value of x:
    x=$(expr $x + 1)
    sleep 2
done

OJO: La tabla que uso es muy sencilla: CREATE TABLE a (a int); dentro del esquema test que instala por defecto MySQL Sandbox.


1 comentario:

  1. Hi Sergiy Dzysyak,

    I followed the same and master master replication is working on the database level.
    Where as when i use the same with application level ( Joomla )
    I am not able to login with users specified in database.
    I am using two different instances or vm.
    I am running joomla website on both the vm's.
    Database is integrated as master - master replication. Master master replication is working fine.
    I am only able to login with users created on VM like if i am creating a user on VM1. the user is able to login only on VM1.
    Where as same user is shown in VM2 but not able to login.

    when i check the logs on VM2 it tells me that user does not exist on database.
    Where as user is available in both the databases.

    Need help on the same.

    Regards,
    Vijay

    ResponderEliminar