Hace un par de días escribí un tutorial sobre cómo replicar con MariaDB (o MySQL). Esta es una replicación unidireccional:de maestro a esclavo; esto significa que el servidor esclavo recibe las transacciones del maestro. Pero mi cliente necesita una replicación bidireccional, porque no sabemos qué servidor recibirá la transacción y los mismos datos deben estar en ambos. Aquí le mostraré cómo configurar la replicación maestro-maestro con MariaDB para lograr esto.
Mi configuración
En caso de que se haya perdido el artículo anterior, esas son las características de las máquinas virtuales en las que estoy ejecutando esta replicación.
- OS:Prueba de Debian 'Ratón de biblioteca'
- Versión de MariaDB:10.5.12
- Maestro1:192.168.122.13
- Maestro2:192.168.122.223
Configuración maestra
Ambos maestros obtienen la misma configuración, edite /etc/mysql/mariadb.conf.d/50-server.cnf
y reemplace los siguientes valores:
bind-address = <master.X.ip.address> server-id = <X> report_host = masterX log_bin = /var/log/mysql/mysql-bin.log relay_log = /var/lib/mysql/relay-bin relay_log_index = /var/lib/mysql/relay-bin.index log-slave-updates auto_increment_increment=2 auto_increment_offset=X
Donde X es 1 para el primer maestro y 2 para el segundo.
Los valores de autoincremento significan que en los campos de tipo id, uno de los maestros obtendrá siempre números pares y el otro obtendrá siempre números impares. Esto es para evitar que se asigne exactamente el mismo número de identificación en ambos maestros al mismo tiempo.
Ahora reinicie el servicio mariadb e inicie sesión en mysql para crear un usuario (esclavo significa esclavo en español) con privilegios de replicación:
CREATE USER 'esclavo1'@'ip.mysql.master.2' IDENTIFIED BY 'SlavePass' ; GRANT REPLICATION SLAVE ON *.* TO 'esclavo1'@'ip.mysql.master.2'; FLUSH PRIVILEGES;
Repita en ambos maestros cambiando la información en consecuencia (es decir, en master2 cree un usuario [email protected] ). Pero primero, obtenga un volcado de sql de su primer maestro y cárguelo en el segundo:
master1: mysqldump -u root --all-databases -p --master-data > data.sql master2: mysql -uroot < data.sql
Ahora obtenga información sobre este maestro que necesitamos para habilitar el modo esclavo en el otro host.
MariaDB [(none)]> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003| 358 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.000 sec) STOP SLAVE;
Configuración de esclavos
Ahora es el momento de configurar el modo esclavo en ambos hosts mariadb/mysql:
CHANGE MASTER TO MASTER_HOST='ip.mysql.master.X', MASTER_USER='esclavoX',MASTER_PASSWORD='SlavePass MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS = 358'; START SLAVE;
El valor master_host es la ip del otro maestro, el valor master_user es el usuario que ha creado en el otro maestro, y finalmente obtiene los valores master_log_file y master_log_post de show master sta
tu comando.
Comprobando todo
Para ver si pude habilitar la replicación maestro-maestro con MariaDB, realicé una prueba muy simple:
Creé una base de datos en un maestro, luego una tabla simple (solo 1 campo) e inserté un par de registros. Luego verifiqué con una selección que los datos aparecen en ambos hosts. Finalmente, agregué una columna incremental automática de identificación en un host e inserté algunos datos más para ver cómo aparece:
Solo para agregar más confusión a esas capturas de pantalla:agregué la configuración de incremento automático (incremento y compensación) a my.cnf durante esta prueba y no desde el principio, porque no lo supe hasta que comencé las pruebas.
De todos modos, así es como habilité la replicación maestro-maestro con MariaDB, que también es replicación esclavo-esclavo. O amo-esclavo y replicación esclavo-maestro, lo que sea.
Creo que el siguiente paso lógico es investigar y usar un poco de Galera Cluster.