Configurando la replicación de master a master.
La replicación es un proceso de pasar la información de una base de datos de un servidor y se copia a otra base de datos a un segundo servidor.
Normalmente configuramos la replicación en espejo (master-slave), para tener un plan de contingencia ante una eventualidad donde podamos poner un servidor esclavo(slave) como master(maestro).
¿Para qué?
- Permitir la escalibilidad de las aplicaciones.
- Distribuir las cargas en dos servidores.
- Redundancia e incrementar la eficiencia.
PASO 1: Instalar y configurar MySQL en el servidor 1
sudo apt-get install mysql-server mysql-client
Editar el archivo /etc/mysql/my.cnf y modificar los valores de las siguientes variables:
#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
#binlog_do_db = include_database_name
bind-address = 127.0.0.1
server-id es un identificador único por servidor.
log_bin nombre de archivo donde se guardaran los logs.
bin_log_do_db nombre de la o las base de datos a replicar.
bind-address las ips donde se podrán o no conectar al servidor MySQL.
Debería quedar así:
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = basedatos_prueba
# bind-address = 127.0.0.1
Ahora reiniciamos el servicio mysql.
sudo service mysql restart
Entramos a la consola con usuario root, nos pedirá la contraseña:
mysql -u root -p
Ejecutaremos unas consultas, crearemos usuario para que se ejecute la replicación entre los servidores.
create user 'replicator'@'%' identified by 'password';
Otorgamos los derechos al usuario a las base de datos.
grant replication slave on *.* to 'replicator'@'%';
Finalmente obtener información del servidor configurado para despues ser utilizada (GUARDAR LOS DATOS EXTRAIDOS)
show master status;
La salida similar a esta:
+------------------+----------+----------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+----------------+------------------+
| mysql-bin.000001 | 59 | basedatos_prueba| |
+------------------+----------+----------------+------------------+
1 row in set (0.00 sec)
PASO 2: Instalar y configurar MySQL en el servidor 2
sudo apt-get install mysql-server mysql-client
Editar el archivo /etc/mysql/my.cnf y AHORA cambiaremos el id, por otro numero único:
#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
#binlog_do_db = include_database_name
bind-address = 127.0.0.1
Debería quedar así:
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = basedatos_prueba
# bind-address = 127.0.0.1
Después de cambiar el archivo reiniciamos el servicio mysql.
sudo service mysql restart
Entramos a la consola con usuario root, nos pedirá la contraseña:
mysql -u root -p
Crearemos usuario para que se ejecute la replicación entre los servidores.
create user 'replicator'@'%' identified by 'password';
Creamos la base de datos que queremos replicar, si ya existe se omite el paso.
create database basedatos_prueba;
Otorgamos los derechos al usuario a las base de datos.
grant replication slave on *.* to 'replicator'@'%';
El siguiente paso permitirá comenzar con la replica de los datos, detenemos el espejo, configuramos con la información que extrajimos con anterioridad con el comando "show master status"
slave stop;
CHANGE MASTER TO MASTER_HOST = '3.3.3.3', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 54;
slave start;
Necesitamos remplazar la contraseña por la que elegimos anteriormente cuando se creo el usuario y se dio derechos.
Lo ultimo que tenemos que realizar es obtener los datos del master (segundo servidor) para realizar la sincronización en el sentido contrario.
SHOW MASTER STATUS;
La salida será similar a esta:
+------------------+----------+-----------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+-----------------+------------------+
| mysql-bin.000004 | 125 | basedatos_prueba| |
+------------------+----------+-----------------+------------------+
1 row in set (0.00 sec)
Guardamos los datos nuevamente, para aplicarlos en el primer servidor y que la replicación sea en ambos sentidos.
PASO 3: Configuración del regreso de la replicación
En el primer servidor, ejecutar lo siguiente en la linea de comandos.
slave stop;
CHANGE MASTER TO MASTER_HOST = '4.4.4.4', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000004', MASTER_LOG_POS = 125;
slave start;
PASO 4: Probar la replicación
Si no existiera la base de datos configurada:
create database basedatos_prueba;
Se crea la tabla en el primer servidor.
CREATE TABLE basedatos_prueba.ejemplo (`id` integer(10));
Revisamos en el segundo servidor que exista la tabla (comprobar que se replico):
SHOW TABLES IN basedatos_prueba;
En ese mismo segundo servidor eliminamos la tabla:
DROP TABLE basedatos_prueba.ejemplo;
Y comprobamos que no exista en el primer servidor.
Nota: Tener cuidado al realizar este tipo de replicación cuando se tengan estructuras de tabla donde existan campos que sean auto_increment.