¿Qué es la replicación maestro-maestro de MySQL?
La replicación MySQL Master-Master agrega velocidad y redundancia para sitios web activos. Con la replicación, dos servidores MySQL separados actúan como un clúster. La agrupación de bases de datos es particularmente útil para configuraciones de sitios web de alta disponibilidad. Use dos Linodes separados para configurar la replicación de la base de datos, cada uno con direcciones IPv4 privadas.
NotaEsta guía está escrita para un usuario no root. Los comandos que requieren privilegios elevados tienen el prefijo
sudo
. Si no está familiarizado consudo
comando, puede consultar nuestra guía de Usuarios y Grupos.Esta guía está escrita para Debian 9, Ubuntu 18.04 y Ubuntu 20.04.
Si no está seguro de qué versión de MySQL se ha instalado en su sistema al seguir los pasos a continuación, ingrese el siguiente comando:
mysql --version
Instalar MySQL
-
Use los siguientes comandos para instalar MySQL en cada uno de los Linodes:
sudo apt-get update sudo apt-get upgrade -y sudo apt-get install mysql-server mysql-client
-
Ejecute el comando de instalación segura de MySQL. Se le pedirá que cree una contraseña de root. Se recomienda que seleccione sí a todas las preguntas:
mysql_secure_installation
Editar la configuración de MySQL
-
Edite el
/etc/mysql/my.cnf
archivo en cada uno de los Linodes. Agregue o modifique los siguientes valores:Servidor 1:
- Archivo:/ etc/mysql/my.cnf
1 2 3 4 5 6 7 8 9 10 11
[mysqld] server_id = 1 log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index expire_logs_days = 10 max_binlog_size = 100M log_replica_updates = 1 auto-increment-increment = 2 auto-increment-offset = 1
Nota Si usa MySQL 8.0.25 o anterior, reemplace
log_replica_updates
conlog_slave_updates
(dentro de los Servidores 1 y 2). Vea la documentación de MySQL para más detalles.Servidor 2:
- Archivo:/ etc/mysql/my.cnf
1 2 3 4 5 6 7 8 9 10 11
[mysqld] server_id = 2 log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index expire_logs_days = 10 max_binlog_size = 100M log_replica_updates = 1 auto-increment-increment = 2 auto-increment-offset = 2
Nota Si usa MySQL 8.0.25 o anterior, reemplace
log_replica_updates
conlog_slave_updates
(dentro de los Servidores 1 y 2). Vea la documentación de MySQL para más detalles. -
Edite la
bind-address
configuración para poder utilizar las direcciones IP privadas, para cada uno de los Linodes.- Archivo:/ etc/mysql/my.cnf
1
bind-address = x.x.x.x
-
Una vez completado, reinicie la aplicación MySQL:
sudo systemctl restart mysql
Crear usuarios de replicación
-
Inicie sesión en MySQL en cada uno de los Linodes:
mysql -u root -p
-
Configure los usuarios de replicación en cada Linode. Reemplazar
x.x.x.x
con la dirección IP privada del Linode opuesto ypassword
con una contraseña segura:MySQL8 y superior
CREATE USER 'replication'@'x.x.x.x' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replication'@'x.x.x.x';
Por debajo de MySQL8
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'x.x.x.x' IDENTIFIED BY 'password';
-
Ejecute el siguiente comando para probar la configuración. Use la dirección IP privada del Linode opuesto:
mysql -u replication -p -h x.x.x.x -P 3306
Este comando debería conectarlo a la instancia de MySQL del servidor remoto.
Configurar la replicación de la base de datos
-
Mientras esté conectado a MySQL en el Servidor 1, consulte el estado del maestro:
SHOW MASTER STATUS;
Tenga en cuenta los valores de archivo y posición que se muestran:
mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 277 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
-
En el servidor 2 en el indicador de MySQL, configure la funcionalidad de réplica para esa base de datos. Reemplazar
x.x.x.x
con la IP privada del primer servidor. También reemplace el valor desource_log_file
con el valor del archivo del paso anterior y el valor desource_log_pos
con el valor de la posición.MySQL 8.0.22 o superior:
STOP REPLICA; CHANGE REPLICATION SOURCE TO source_host='x.x.x.x', source_port=3306, source_user='replication', source_password='password', source_log_file='mysql-bin.000001', source_log_pos=106; START REPLICA;
MySQL 8.0.22 o anterior:
STOP SLAVE; CHANGE MASTER TO master_host='x.x.x.x', master_port=3306, master_user='replication', master_password='password', master_log_file='mysql-bin.000001', master_log_pos=106; START SLAVE;
-
En el Servidor 2, consulte el estado del maestro. Nuevamente tenga en cuenta los valores de archivo y posición.
SHOW MASTER STATUS;
-
Establezca el estado de la base de datos de réplica en el Servidor 1, utilizando comandos similares a los del paso 2. Al ingresar los comandos, use la dirección IP del Servidor 2 y los valores de archivo y posición que acaba de recopilar en el paso anterior.
-
Pruebe creando una base de datos e insertando una fila:
Servidor 1:
create database test; create table test.flowers (`id` varchar(10));
Servidor 2:
show tables in test;
Cuando se le pregunte, debería ver las tablas del Servidor 1 replicadas en el Servidor 2. ¡Felicitaciones, ahora tiene un clúster MySQL Master-Master!
Más información
Es posible que desee consultar los siguientes recursos para obtener información adicional sobre este tema. Si bien estos se proporcionan con la esperanza de que sean útiles, tenga en cuenta que no podemos garantizar la precisión o la puntualidad de los materiales alojados externamente.
- Manuales de referencia de MySQL