Supongamos que se tienen dos servidores con Ubuntu Server instalado, y en ambos instalaremos el servidor y el cliente MySQL, si no están instalados hay que instalarlos con el siguiente comando:
sudo apt-get install mysql-server mysql-client
Ahora bien, supongamos que el servidor principal MySQL Master tiene una dirección IP de 192.168.1.8, el segundo tiene la direccion IP 192.168.1.9, el cual lo configuraremos como esclavo.
En el servidor maestro, abrimos el archivo de configuración de MySQL en un editor de texto:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Indicamos en qué IP se está ejecutando el servidor, le asignamos un ID, indicamos la ruta a los bin logs, y desde qué base se registrarán:
bind-address = 192.168.1.8
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = TESTDATABASE
max_binlog_size = 500M
Tambien se pueden especificar varias bases:
binlog_do_db = TESTDATABASE
binlog_do_db = TESTDATABASE2
binlog_do_db = TESTDATABASE3
En los bin logs se guardan las solicitudes que se ejecutan en la base de datos especificada en el servidor Master y en el futuro se ejecutarán en los servidores Slave, llevando así la base de datos al estado actual, si se desea, se pueden ver, por ejemplo, a través de la utilidad mysqlbinlog.
Reinicie el servidor MySQL para aplicar los cambios:
sudo service mysql restart
Ahora vamos a crear un usuario que se conectará desde el servidor esclavo y recibirá datos:
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO “replication”@”192.168.1.9” IDENTIFIED BY “password”;
FLUSH PRIVILEGES;
exit
Si hay muchos servidores esclavos, agregue usuarios de la misma manera especificando la IP requerida en lugar de 192.168.1.9, o especifique el símbolo * para permitir el acceso del usuario desde cualquier IP.
Para hacer un volcado, bloqueemos todas las tablas en la base de datos:
mysql -u root -p
USE TESTDATABASE;
FLUSH TABLES WITH READ LOCK;
Observamos el estado del servidor maestro:
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000040 | 154 | TESTDATABASE | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0,00 sec)
exit
Dado que hemos bloqueado las tablas en la base de datos y los datos no cambian, mysql-bin.000040 y 154 nos serán útiles en el futuro para indicar desde cuándo iniciar la transferencia de datos.
Ahora volquemos la base de datos:
mysqldump -u root -p –opt TESTDATABASE > TESTDATABASE.sql
Ahora puedes desbloquear tablas:
mysql -u root -p
UNLOCK TABLES;
Después de desbloquear las tablas, si se realizan cambios en la base de datos en el servidor maestro, el valor de Posición aumentará.
Comencemos a configurar el servidor esclavo, creemos una base de datos:
mysql -u root -p
CREATE DATABASE TESTDATABASE;
exit
Importamos en él, el volcado realizado previamente:
mysql -u root -p TESTDATABASE < TESTDATABASE.sql
Abramos el archivo de configuración del servidor MySQL:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Especifiquemos los parámetros:
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
relay-log = /var/log/mysql/mysql-relay-bin.log
binlog_do_db = TESTDATABASE
max_binlog_size = 500M
Reinicie el servidor MySQL para aplicar los cambios:
sudo service mysql restart
Ejecutemos una consulta que nos indicará los parámetros para la replicación, incluidos Archivo y Posición, que vimos en el servidor maestro antes de volcar la base de datos con tablas bloqueadas, indicando así desde qué posición iniciar la replicación:
CHANGE MASTER TO MASTER_HOST=’192.168.1.8′, MASTER_USER=’replication’, MASTER_PASSWORD=’password’, MASTER_LOG_FILE = ‘mysql-bin.000040’, MASTER_LOG_POS = 154;
Ejecutar:
START SLAVE;
Observamos el estado:
SHOW SLAVE STATUS;
Los siguientes servidores Slave se pueden configurar de forma similar, pero el volcado ya se puede hacer desde el servidor Slave, lo pararemos con el comando:
STOP SLAVE;
Luego volcamos la base de datos y miramos los valores de Archivo y Posición para indicarlos en el siguiente servidor esclavo:
SHOW SLAVE STATUS;
START SLAVE;
La replicación es perfecta para enviar parte de las consultas SELECT en lugar del servidor principal al esclavo, así como para crear copias de seguridad de una gran base de datos en el servidor esclavo para no detener el servidor principal y no cargarlo. La replicación no es una copia de seguridad.
La lista de procesos, clientes conectados y esclavo se puede ver con los comandos:
SHOW PROCESSLIST;
SHOW SLAVE HOSTS;
Suerte 😎