Se basa en este repositorio en GitHub que creé hace unos años. Contiene configuraciones e instrucciones con el ejemplo de replicación de MySQL basado en Docker. Esto es bueno para comenzar a comprender la replicación y probar declaraciones no seguras de replicación y no está diseñado para uso en producción. Después de obtener docenas de inicios, he considerado agregar algunas explicaciones más sobre cómo funciona.
En este artículo quiero darle explicaciones más detalladas sobre el proceso general. Puede ser útil para DevOps e ingenieros de software que desean crear un entorno de trabajo más cercano al entorno de producción y para aquellos que desean comprender mejor cómo es realmente la replicación de MySQL.Por defecto, el tipo de sincronización para la replicación de MySQL es asíncrono (unidireccional), lo que significa que la "réplica" no notifica a su "fuente" sobre los resultados de los eventos de afrontamiento y procesamiento. Los tipos adicionales de sincronización (semisincrónica, síncrona) pueden estar disponibles a través de complementos o en configuraciones especiales (como NDB Cluster).
Con la replicación de MySQL se pueden realizar algunos tipos de configuración específicos: replicación encadenada , circular (también conocida como master-master o ring) y combinaciones de estas. La limitación es que la réplica solo puede tener un servidor de origen.
La replicación encadenada significa que hay una cadena de servidores de bases de datos.
Ejemplo: Origen 1 — > Réplica 1 — > Réplica 2. La Réplica 1 es fuente para la Réplica 2 y réplica para la Fuente 1. Es útil para un caso en el que la Réplica 1 contiene una base de datos "combinada", que consta de las tablas "fuente" y sus propias tablas "añadidas".La replicación circular supone tener bases de datos maestras en el círculo, que sirven también como réplicas al mismo tiempo. Ejemplo: Maestro← → Maestro. El problema aquí es la sincronización automática de columnas incrementadas. La solución podría ser configurar ' auto_increment_increment' y variables de servidor ' auto_increment_offset' para hacer incrementos con diferentes pasos o en diferentes rangos de acuerdo con la configuración de cada servidor maestro. Si está utilizando InnoDB, tenga en cuenta el hecho de que con la replicación en anillo, la fila no siempre se agregará al final del índice de la réplica, en tal caso, puede generar una latencia de inserción adicional en la réplica debido al orden del índice agrupado.
mkdir mysql-master-slave cd mysql-master-slave git clone //github.com/vbabak/docker-mysql-master-slave ./
./build.sh
El proceso de compilación requiere que los puertos 4406 y 5506 no estén en uso en su sistema. De lo contrario, puede actualizarlo a cualquier puerto no utilizado en el archivo ' docker-compose.yml' y volver a ejecutar el script de compilación.
Si todo va bien, recibirá estos mensajes:Esperando conexión a la base de datos mysql_master...
y finalmente un informe de estado de réplica (esclavo). La última línea dice que está esperando nuevas actualizaciones del maestro. Para probar que la replicación funciona, ejecute esta consulta en Master: docker exec -it mysql_master bash mysql -u root -p '111' mydb mysql> create table if not exists code(code int); # Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> insert into code values (100), (200); # Query OK, 2 rows affected (0.01 sec)
docker exec -it mysql_slave bash mysql -u root -p '111' mydb mysql> select * from code;
Configuración del servidor maestro ubicada en “ master/conf/mysql.conf.cnf”. Aquí hay algo de explicación. Las primeras 2 opciones se usan para aumentar el rendimiento del servidor y no están relacionadas con la configuración de replicación en sí.
skip-host-cache
Deshabilite el uso de la memoria caché interna del host para una resolución más rápida de nombre a IP. skip-name-resolve
Deshabilitar las búsquedas de nombres de host DNS server-id = 1
Para los servidores que se utilizan en una replicación, debe especificar un ID de servidor único. Debe ser diferente de todos los demás ID en uso por cualquier otra fuente o réplica. log_bin = /var/log/mysql/mysql-bin.log
Habilita el registro bin y establece el nombre base y la ruta para los archivos de registro binarios (como log_bin_basename ).
binlog_format = FILA
Los valores posibles son ROW (la réplica reproduce solo los cambios reales en la fila), STATEMENT (la réplica reproduce todas las consultas que cambian los datos), MIXED (se usa la replicación basada en declaraciones a menos que el servidor decida que solo la replicación basada en filas puede dar el resultado adecuado, como replicando el resultado de GUUID() ). binlog_do_db = mydb
Especifique una base de datos, cuyas declaraciones se escribirán en el archivo de registro binario.Los parámetros del entorno relacionados con el lanzamiento de MySQL en un contenedor acoplable se colocan en el archivo " master/mysql_master.env ". Se describen en el sitio web de docker hub para la imagen .
Si es un usuario de Windows, el script build.sh probablemente no funcionará, por lo que deberá configurar la base de datos maestra con la creación del usuario `mydb_slave_user`: ejecute 2 comandos sql en Master y luego configure la base de datos esclava: ejecute 2 comandos sql en Réplica, ver detalles a continuación.Finalmente, agregue un usuario de replicación en el servidor maestro. Cree un nuevo usuario para la replicación con el permiso REPLICATION SLAVE:
# SETUP MASTER SQL COMMANDS GRANT REPLICATION SLAVE ON *.* TO "mydb_slave_user" @ "%" IDENTIFIED BY "mydb_slave_pwd" ; FLUSH PRIVILEGES ;
relay-log = /var/log/mysql/mysql-relay-bin.log
Contiene eventos de la base de datos, leídos desde el registro binario de origen.Inicie una réplica.
Primero, debe encontrar una dirección IP de host maestro. Puede verificar el archivo "hosts" en el host maestro docker exec -it mysql_master cat '/etc/hosts'
docker exec mysql_master sh -c 'export MYSQL_PWD=111; mysql -u root -e "SHOW MASTER STATUS \G"'
# SETUP REPLICA SQL COMMANDS CHANGE MASTER TO MASTER_HOST= '${IP}' , MASTER_USER= 'mydb_slave_user' , MASTER_PASSWORD= 'mydb_slave_pwd' , MASTER_LOG_FILE= '${LOG}' , MASTER_LOG_POS=$POS; START SLAVE ;
Publicado anteriormente en