MySQL replicación · 4 min read · Oct 08, 2025

El clúster web perfecto con balanceo de carga y alta disponibilidad con 2 servidores ejecutando Xen en Ubuntu 8.04 Hardy Heron - Página 4

10. Replicación de MySQL (web1, web2)

10.1 Instalando MySQL 5.0

apt-get install mysql-server-5.0 mysql-client-5.0

Para asegurarnos de que la replicación funcione, debemos hacer que MySQL escuche en todas las interfaces, por lo tanto, comentamos la línea bind-address = 127.0.0.1 en /etc/mysql/my.cnf:

vi /etc/mysql/my.cnf

[...]
# En lugar de skip-networking, el valor predeterminado ahora es escuchar solo en
# localhost, lo cual es más compatible y no es menos seguro.
#bind-address           = 127.0.0.1
[...]

Reinicie MySQL después:

/etc/init.d/mysql restart

En web1

Ahora configuramos un usuario de replicación slave2_user que puede ser utilizado por web2.example.com para acceder a la base de datos MySQL:

mysql -u root -p

En la consola de MySQL, ejecute los siguientes comandos:

GRANT REPLICATION SLAVE ON . TO ‘slave2_user’@’%’ IDENTIFIED BY ‘slave2_password’;
FLUSH PRIVILEGES;
quit;

En web2

Ahora hacemos los últimos dos pasos nuevamente en web2.example.com:

mysql -u root -p

GRANT REPLICATION SLAVE ON . TO ‘slave1_user’@’%’ IDENTIFIED BY ‘slave1_password’;
FLUSH PRIVILEGES;
quit;

En web1 Y web2

Ahora crearemos una base de datos que se utilizará más tarde para el servidor de correo:

mysqladmin -u root -p create mail

A continuación, vamos a la consola de MySQL:

mysql -u root -p

En la consola de MySQL, creamos el usuario mail_admin con la contraseña mail_admin_password (reemplácelo con su propia contraseña) que tiene privilegios de SELECT, INSERT, UPDATE, DELETE en la base de datos de correo. Este usuario será utilizado por Postfix y Courier para conectarse a la base de datos de correo:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail. TO ‘mail_admin’@’localhost’ IDENTIFIED BY ‘mail_admin_password’;
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.
TO ‘mail_admin’@’localhost.localdomain’ IDENTIFIED BY ‘mail_admin_password’;
FLUSH PRIVILEGES;
quit;

10.2 Configurando la replicación

Ahora configuramos la replicación maestro-maestro en /etc/mysql/my.cnf. Las opciones de configuración cruciales para la replicación maestro-maestro son auto_increment_increment y auto_increment_offset:

  • auto_increment_increment controla el incremento entre los valores sucesivos de AUTO_INCREMENT.
  • auto_increment_offset determina el punto de partida para los valores de la columna AUTO_INCREMENT.

Supongamos que tenemos N nodos MySQL (N=2 en este ejemplo), entonces auto_increment_increment tiene el valor N en todos los nodos, y cada nodo debe tener un valor diferente para auto_increment_offset (1, 2, …, N).

Ahora configuremos nuestros dos nodos MySQL:

En web1

vi /etc/mysql/my.cnf

agregue las siguientes líneas justo debajo de “[mysqld]”:

server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1
#use 192.168.1.105 si no instaló un cable cruzado en eth1
master-host = 192.168.0.105
master-user = slave1_user
master-password = slave1_password
master-connect-retry = 60
replicate-do-db = mail
log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db = mail
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

y modifique la línea “max_binlog_size”:

[...]
max_binlog_size         = 500M
[...]

/etc/init.d/mysql restart

En web2

vi /etc/mysql/my.cnf

server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2
#use 192.168.1.104 si no instaló un cable cruzado en eth1
master-host = 192.168.0.104
master-user = slave2_user
master-password = slave2_password
master-connect-retry = 60
replicate-do-db = mail
log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db = mail
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

y modifique la línea “max_binlog_size”:

[...]
max_binlog_size         = 500M
[...]

/etc/init.d/mysql restart

En web1 Y web2

Ahora comenzaremos la replicación:

mysql -u root -p

En la consola de MySQL, ejecute los siguientes comandos:

reset master;
stop slave;
reset slave;

Ahora ejecute lo siguiente:

En web1

CHANGE MASTER TO MASTER_HOST=’192.168.0.105’, MASTER_USER=’slave1_user’, MASTER_PASSWORD=’slave1_password’, MASTER_LOG_FILE=’mysql-bin.000001’, MASTER_LOG_POS=98;

start slave;
quit;

En web2

CHANGE MASTER TO MASTER_HOST=’192.168.0.104’, MASTER_USER=’slave2_user’, MASTER_PASSWORD=’slave2_password’, MASTER_LOG_FILE=’mysql-bin.000001’, MASTER_LOG_POS=98;

start slave;
quit;

Ahora la replicación debería funcionar.

10.3 Probando la replicación

En web1 Y web2

mysql -u root -p

En la consola de MySQL, ejecute los siguientes comandos:

show slave status \G;

Hay 3 líneas importantes en la salida que deberían verse así:

[...]
Slave_IO_State: Waiting for master to send event
[...]
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: mail
[...]

Ahora puede salir de mysql:

quit;

En web1

Insertaremos algunos datos en web1.example.com para probar y que servirán en el próximo capítulo para el correo:

mysql -u root -p

En la consola de MySQL, ejecute los siguientes comandos:

use mail;

Crearemos las siguientes tablas:

CREATE TABLE domains (
domain varchar(50) NOT NULL,
transport varchar(128) NOT NULL default ‘smtp:[192.168.1.104]’,
PRIMARY KEY (domain) )
TYPE=MyISAM;

CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;

CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT ‘10485760’,
PRIMARY KEY (email)
) TYPE=MyISAM;

CREATE TABLE transport (
domain varchar(128) NOT NULL default ‘’,
transport varchar(128) NOT NULL default ‘’,
UNIQUE KEY domain (domain)
) TYPE=MyISAM;

quit;

Estas tablas recién creadas deberían aparecer también en la base de datos de correo de web2, gracias a la replicación.

En web2

Ahora verificaremos que:

mysql -u root -p

En la consola de MySQL, ejecute los siguientes comandos:

use mail;
show tables;

La salida debería ser:

+----------------+
| Tables_in_mail |
+----------------+
| domains         |
| forwardings    |
| transport        |
| users              |
+----------------+
4 rows in set (0.00 sec)

quit;

Si ve que la replicación está funcionando.

10.4 Creando usuario para ldirectord

Ahora crearemos el usuario que se conectará a la base de datos en el archivo ldirectord.php.

En web1 Y web2

mysql -u root -p

En la consola de MySQL, ejecute los siguientes comandos:

GRANT USAGE ON . TO ‘ldirectord’@’localhost’ IDENTIFIED BY ‘LDIRECTORD_PASSWORD’;
quit;

Ahora, cuando vaya con su navegador a las direcciones:

http://192.168.1.104/ldirectord.php

y

http://192.168.1.105/ldirectord.php

Debería ver:

Conectado a MySQL

mostrado en la pantalla.

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.