Replicación de Mysql en maestro-maestro

Publicado en Junio 26th, 2009 | por bambuka | 620 views

mysql_master_masterEn este post vamos a explicar como hacer una instalación de MySQL 5.0 con replicación maestro-maestro. El principal beneficio sobre una configuración maestro-esclavo es que no tenemos que modificar las aplicaciones para que los accesos de escritura solo apunten al maestro y es una forma sencilla de proveer HA porque si el maestro cae tenemos activo el otro maestro.


Contexto:

Nodo1: 192.168.0.161
Nodo2: 192.168.0.162
Ambos con Debian Lenny.

Let’s go!:

En los dos nodos he instalado mysql server y cliente con:
apt-get install mysql-server-5.0 mysql-client-5.0

Editamos /etc/mysql/my.conf y en ambos nodos comentamos la línea bind 127.0.0.1 para permitir conexiones desde el exterior.

En el nodo1

Entramos en mysql:
mysql -p

Creamos una cuenta con permisos para replicar al usuario2 con la clave ‘password’.
GRANT REPLICATION SLAVE ON *.* TO 'usuario2'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
QUIT;

En el nodo2

Entramos en mysql:
mysql -p

Creamos una cuenta con permisos para replicar al usuario1 con la clave ‘password’.
GRANT REPLICATION SLAVE ON *.* TO 'usuario1'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
QUIT;

En el nodo1 tenemos un base de datos replicar en el nodo2. En el nodo2 vamos a crearla vacía.
CREATE DATABASE wordpress;
QUIT;

En el nodo1:

Editamos el fichero: /etc/mysql/my.conf

vi /etc/mysql/my.conf

[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
language = /usr/share/mysql/english
skip-external-locking
key_buffer = 16M
max_allowed_packet = 16M
thread_stack = 128K
thread_cache_size = 8
myisam-recover = BACKUP
query_cache_limit = 1M
query_cache_size = 16M
skip-bdb
server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1
master-host = 192.168.0.162
master-user = usuario1
master-password = password
master-connect-retry = 60
replicate-do-db = wordpress
log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db = wordpress
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 10
max_binlog_size = 500M
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[mysql]
[isamchk]
key_buffer = 16M
!includedir /etc/mysql/conf.d/

Reiniciamos el servicio:
/etc/init.d/mysql restart

En el nodo2:

Editamos el fichero: /etc/mysql/my.conf
vi /etc/mysql/my.conf


[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
language = /usr/share/mysql/english
skip-external-locking
key_buffer = 16M
max_allowed_packet = 16M
thread_stack = 128K
thread_cache_size = 8
myisam-recover = BACKUP
query_cache_limit = 1M
query_cache_size = 16M
skip-bdb
server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2
master-host = 192.168.0.161
master-user = usuario2
master-password = password
master-connect-retry = 60
replicate-do-db = wordpress
log-bin= /var/log/mysql/mysql-bin.log
binlog-do-db = wordpress
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 10
max_binlog_size = 500M
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[mysql]
[isamchk]
key_buffer = 16M
!includedir /etc/mysql/conf.d/

Reiniciamos el servicio:
/etc/init.d/mysql restart

En el nodo1:

Vamos a bloquear la base de datos a replicar y hacer un dump para importarla en el otro nodo:

mysql -p

USE wordpress;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Nos devolverá algo así:

+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 98 | wordpress | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Vamos a anotar los datos que nos muestra en las columnas File y Position, los necesitaremos posteriormente.

Sin dejar esta sesión ya que tenemos bloqueadas las tablas, abrimos otra para dumpear la base de datos:
mysqldump -u root -p --opt wordpress > wordpress.sql
scp wordpress.sql 192.168.0.162:/tmp

Desbloqueamos de nuevo:
unlock tables;
quit;

En el nodo2:

Importamos la base de datos:
mysql -p
use wordpress;
source /tmp/wordpress.sql
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Nos devolverá algo así:

+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 1175304 | wordpress | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Igualmente anotamos los datos que nos muestra en las columnas File y Position.

Desbloqueamos:
unlock tables;

Paramos el esclavo:
STOP SLAVE;

Ahora vamos a hacer al nodo1 esclavo del nodo2. Recordar cambiar los parametros: IP, usuario, clave… file y pos son los que anotamos anteriormente del nodo1.
change master to master_host='192.168.0.161', master_user='usuario2', master_password='password', master_log_file='mysql-bin.000001', master_log_pos=98;

Iniciamos el esclavo:
START SLAVE;

Comprobamos su estado:
SHOW SLAVE STATUS;
Verificar sobre todo que las columnas Slave_IO_Running y Slave_SQL_Running están a yes.

QUIT;

En el nodo1

mysql -p

Paramos:
STOP SLAVE;

Hacemos al nodo2 esclavo del nodo1. No olvidar cambiar parámetros.
change master to master_host='192.168.0.162', master_user='usuario1', master_password='rage', master_log_file='mysql-bin.000002', master_log_pos=1175304;

Iniciamos de nuevo:
START SLAVE;

Comprobamos:
SHOW SLAVE STATUS;

Nos fijamos de nuevo en las columnas Slave_IO_Running y Slave_SQL_Running.

QUIT;

Listo ;)

Compártelo!!!
  • Google Bookmarks
  • BarraPunto
  • Meneame
  • Bitacoras.com
  • Digg
  • email
  • Facebook
  • Live
  • StumbleUpon
  • Twitter
  • Wikio
  • Yahoo! Bookmarks

Artículos relacionados

  1. 13 Comentarios en “Replicación de Mysql en maestro-maestro”

  2. By Marvin E. Pineda on Jul 20, 2009 | Responder

    Hola!!!….

    me parece excelente la explicación de como crear una replicacion master-to-master en mysql, pero yo tengo instalado mysql en windows… mi pregunta seria, ¿sigo estos mismos pasos para hacerlo en Windows? considerando algunos comandos claro esta…. o para hacer esto en windows se siguien otros pasos?

    gracias por la aclaración y Saludos,

  3. By bambuka on Jul 21, 2009 | Responder

    Aunque no lo he probado en Windows no veo ninguna limitación para que no se pueda hacer de igual manera. Ando pillado de tiempo si no me gustaría probarlo. No obstante, desde AnotherHost nos gustaría saber tus resultados si finalmente te animas a montarlo. Un saludo Marvin.

  4. By Marvin E. Pineda on Jul 22, 2009 | Responder

    Hola!!!…

    gracias por tu respuesta… he seguido los pasos al pie de la letra y una de los ordenadores si se logro hacer esclavo del otro pero el otro ordenador no… el error que me muestra es el siguiente:

    ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log.

    pero no encuentro tal archivo ¿Donde lo puedo encontrar?…

    de ante mano gracias por tu ayuda.

  5. By bambuka on Jul 22, 2009 | Responder

    Tienes un fichero: my.ini donde hay una sección que dice:
    [mysqld]
    log=hostname.log

    Ahí es donde especificas donde almacenar los logs. Si lo modificas tienes que reiniciar el servicio. Creo que por defecto están en MySql\data.

    ¿En qué paso te da error? ¿No se te habrá olvidado bloquear la bbdd antes de sincronizar?

    Un saludo y suerte.

  6. By Marvin E. Pineda on Jul 22, 2009 | Responder

    el error me lo da aqui:
    ——————————————
    Hacemos al nodo2 esclavo del nodo1. No olvidar cambiar parámetros.
    —————————————–
    change master to master_host=’192.168.0.162′, master_user=’usuario1′, master_password=’rage’, master_log_file=’mysql-bin.000002′, master_log_pos=1175304;

  7. By bambuka on Jul 23, 2009 | Responder

    Deberías comprobar que desde ambos nodos se puede acceder al otro y tiene permisos sobre la bbdd a redundar. También asegúrate que has bloqueado la base de datos… Al hacer SHOW MASTER STATUS; te da la posición correcta en los dos nodos?

    Un saludo Marvin. Suerte.

  8. By Marvin E. Pineda on Jul 23, 2009 | Responder

    si, si tengo acceso a la bbdd remotamente y al aplicar el comando SHOW MASTER STATUS lo posicion de ambos es 106 coincidencia!!!….. bueno, lo que si pude encontrar en un archivo de error que se esta generando es que esta intentando accesar al archivo C:\Program Files\MySQL\MySQL Server 5.1\slave-log.000026, este archivo no existe. asi que lo que me queda por hacer es remover MySQL, limpiar cualquier registro, archivo y directorio de este para luego volver a intentarlo, ya que la primera ves que lo hice fue maestro esclavo, talves quedo algo por ai molestando.

    pero ya estoy seguro que los pasos funcionan solo que esta revelde uno de los ordenadores…

    Ahora!!!… otro problema que tengo es que intente instalar MySql en Ubuntu, Fedora, OpenSolaris y ya por ultimo en PCBSD todas versiones DESKTOP, me costo un gumaro instalar mysql pero al final lo instale ya que soy podriamos decir 100% Window’s, pero no logre hacer que al iniciar el ordenador iniciara automaticamente MySQL ya que la intencion era poner mysql en ordenadores con Linux o Unix

    Saludos y gracias por tu ayuda

  9. By Marvin E. Pineda on Jul 23, 2009 | Responder

    ah!!!.. y con respecto a la foto de la chica!!!!!… Wow!!!… al principio crei que me habia equivocado de pagina, realmente no me dio por leer el texto, ya que no podia ver nada mas que la foto ;-)

  10. By bambuka on Jul 23, 2009 | Responder

    Es muy extraño que te de la misma posición en ambos nodos. ¿La bbdd no está en ambos nodos desde el principio no? La importas desde el nodo1 al bloquear la bbdd ¿verdad?
    Lo de la chica es puro marqueting, así no hace falta escribir buenos artículos :P

  11. By Marvin E. Pineda on Jul 24, 2009 | Responder

    ah!!!… no, no puede importar con tu ejemplo, asi que la importe haciendo un backup y luego restaurandola pero antes de comenzar todo… jejeje!!!… intentare bloqueando la bbdd y luego hacer el backup y luego restaurarla…, te comento luego como me fue y gracias por tu ayuda….

  12. By Marvin E. Pineda on Jul 24, 2009 | Responder

    Listo… pero al mismo tiempo fracaso, ya que lo logre configurar pero al insertar en una tabla no se replica a la otra bbdd.

    Slave_IO_State: Waiting for master to send event
    Master_Host: MPINEDA-LAPTOP
    Read_Master_Log_Pos: 106
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

    asi que no me queda mas que dejarlo asi por el momento.

    agradesco mucho tu apoyo y te deceo lo mejor…

    hasta luego….

  13. By bambuka on Jul 24, 2009 | Responder

    Un saludo Marvin y no decaigas que así se aprende ;)

  1. 1 Trackback(s)

  2. Jul 1, 2009: Renombrar una base de datos en Mysql | anotherhost

Lo siento, comentarios para esta entrada están cerrados en este momento.