sql >> Base de Datos >  >> RDS >> Mysql

Cómo configurar la replicación de réplica de origen en MySQL

El MySQL es un sistema de gestión de base de datos relacional que es uno de los proyectos de código abierto más populares. Aunque es conocido por su estabilidad, MySQL es aún más confiable si se configura la replicación fuente-réplica. En la replicación, un servidor MySQL normalmente se designa como origen . Una fuente envía cualquier cambio de base de datos y actualizaciones de datos a una o más réplica servidores de bases de datos. El procedimiento de replicación de datos de MySQL es flexible y los servidores de réplica no necesitan estar permanentemente conectados a la fuente. Esta guía explica cómo configurar la replicación de datos fuente-réplica en MySQL.

Cómo funciona la replicación de datos de MySQL

El proceso de replicación primero almacena los datos en la base de datos de origen y luego los copia en cualquier réplica. Después de procesar la instrucción, el servidor de la base de datos de origen realiza un seguimiento del cambio en un registro binario. El registro sirve como registro secuencial de todos los cambios en la estructura y el contenido de la base de datos. SELECT las declaraciones no se registran porque no cambian el contenido de la base de datos.

Las actualizaciones se realizan de forma asincrónica, por lo que las réplicas no tienen que estar conectadas continuamente. Esto contrasta con las arquitecturas síncronas de los sistemas de alta confiabilidad. Si se requiere sincronización en tiempo real, MySQL recomienda usar el Cluster NDB .

Cada réplica extrae datos de la fuente solicitando el contenido del registro binario de la fuente. Luego, la réplica aplica las declaraciones en orden, reproduciendo efectivamente los eventos que ocurrieron en la fuente. Cada réplica es independiente y realiza un seguimiento de su posición actual con el registro binario de origen. Además, cada réplica puede sincronizarse con la fuente de acuerdo con su propio cronograma. Los datos se pueden leer desde cualquiera de los servidores, incluidas las réplicas.

MySQL permite un alto grado de granularidad. Es posible replicar sobre ciertas bases de datos o incluso tablas específicas dentro de una base de datos. El formato de replicación predeterminado es Replicación basada en declaraciones (SBR), en el que se replica toda la instrucción SQL. Sin embargo, Replicación basada en filas (RBR) también está disponible. Este formato replica las filas que se han cambiado. También es posible configurar configuraciones de muchos a muchos más complicadas. Consulte la documentación de MySQL para obtener más información sobre las diferentes opciones de replicación.

Nota MySQL se refirió anteriormente a la replicación fuente-réplica como "replicación maestro-esclavo". La Organización MySQL cambió recientemente la terminología, explicando su razonamiento en una actualización de terminología. El término anterior "maestro" se ha cambiado a "fuente", mientras que un "esclavo" ahora se denomina "réplica". Los términos antiguos aún pueden aparecer en ciertos comandos y pantallas de salida mientras MySQL actualiza su base de código. Esta guía utiliza los términos preferidos de MySQL a lo largo de las instrucciones.

Ventajas de la replicación de datos MySQL

Habilitar la replicación de réplica de origen ofrece muchas ventajas significativas sobre un sistema no redundante. La siguiente lista proporciona una descripción general de algunos beneficios:

  • Es fácil crear una copia de seguridad en vivo en cualquier momento. Debido a que el proceso de replicación es asincrónico, la replicación puede ocurrir de acuerdo con cualquier programación. Las réplicas no tienen que estar sincronizadas con la fuente para que funcionen de manera confiable.

  • Agregar una réplica puede aumentar el tiempo de actividad y la confiabilidad de todo el sistema. El control principal puede cambiar a la réplica si se requiere mantenimiento o la base de datos de origen no está disponible.

  • Cada réplica proporciona otra instancia legible de la base de datos. Esto permite que los programas de análisis o minería de datos consulten la réplica sin colocar una carga adicional en la base de datos de origen original.

  • Esta arquitectura aumenta la escalabilidad y el rendimiento. Lecturas de base de datos y SELECT las declaraciones se pueden equilibrar entre los servidores, lo que reduce la latencia.

  • Los terceros pueden obtener acceso de solo lectura a una base de datos a través de una réplica y ya no requieren acceso a la fuente. Se puede crear una base de datos réplica a pedido cuando se requiere y se puede destruir cuando ya no se necesita. Esta técnica mejora la seguridad y garantiza que es imposible alterar los datos originales.

Antes de comenzar

  1. Si aún no lo ha hecho, cree una cuenta de Linode y una instancia de cómputo. Consulte nuestras guías Introducción a Linode y Creación de una instancia informática.

  2. Siga nuestra guía de configuración y protección de una instancia informática para actualizar su sistema. También puede establecer la zona horaria, configurar su nombre de host, crear una cuenta de usuario limitada y fortalecer el acceso SSH.

  3. Debe tener al menos dos Linodes separados para configurar la replicación de réplica de origen de MySQL. Un Linode aloja la base de datos de origen, mientras que otro nodo es necesario para el servidor de réplica.

Nota Los pasos de esta guía están escritos para un usuario no root. Los comandos que requieren privilegios elevados tienen el prefijo sudo . Si no está familiarizado con sudo comando, consulte la guía Usuarios y grupos de Linux.

Configure Source-Replica Replication en MySQL

Para configurar la replicación de réplica de origen, MySQL debe instalarse en dos servidores separados que puedan comunicarse entre sí. Estas instrucciones están orientadas a la distribución de Ubuntu, pero generalmente se aplican a todas las distribuciones de Linux. El proceso consta de los siguientes pasos:

  1. Instalar MySQL.
  2. Configure la base de datos de origen de MySQL.
  3. Configure un nuevo usuario de MySQL para la réplica.
  4. Preparar los datos de MySQL para la replicación.
  5. Configure la base de datos réplica de MySQL.
  6. Importe los datos MySQL replicados y active la replicación.

Instalar MySQL

Si MySQL aún no está disponible en ambos Linodes, instálelo siguiendo los siguientes pasos:

  1. Actualiza los Linodes.

     sudo apt-get update && sudo apt-get upgrade
    
  2. Instale el servidor MySQL y las aplicaciones cliente tanto en el servidor de origen como en el de réplica.

     sudo apt-get install mysql-server mysql-client -y
    
  3. Configure las opciones de seguridad, incluida la contraseña raíz, utilizando mysql_secure_installation comando.

     sudo mysql_secure_installation
    
  4. Si está utilizando un cortafuegos como ufw , asegúrese de que permita el paso del tráfico de MySQL. Agregue la siguiente regla para abrir el puerto 3306 en el cortafuegos.

     ufw allow mysql
    

Configure la base de datos de origen MySQL

Para habilitar la replicación de MySQL, edite algunas variables en el archivo de configuración principal de MySQL. Realice los siguientes cambios en la configuración de la base de datos de origen.

  1. Localice el archivo de configuración principal de MySQL en el servidor de la base de datos de origen. Este archivo generalmente se encuentra en /etc/mysql/mysql.conf.d/mysqld.cnf . Sin embargo, en instalaciones anteriores, podría estar ubicado en /etc/my.cnf o /etc/mysql/my.cnf . También podría ser referenciado desde uno de los archivos a través de un includedir directiva.

  2. Abra el archivo de configuración de MySQL y cambie la bind-address a la dirección IP del servidor de origen.

    Archivo:/ etc/mysql/mysql.conf.d/mysqld.cnf
    1
    2
    
    bind-address  = <source_ip_address>
        
  3. Descomente o agregue las líneas para server-id y log-bin . Establecer el server-id a 1 y log-bin a /var/log/mysql/mysql-bin.log .

    Nota Asegúrese de que skip_networking La variable no está declarada en ninguna parte. Coméntalo si aparece dentro de este archivo. Para replicar una sola base de datos, agregue la línea binlog_do_db = <database_name> al archivo.
    Archivo:/ etc/mysql/mysql.conf.d/mysqld.cnf
    1
    2
    3
    
    server-id  = 1
    log_bin  = /var/log/mysql/mysql-bin.log
        
  4. Reinicie el servicio MySQL.

     sudo systemctl restart mysql
    
  5. Verifique el estado de MySQL y asegúrese de que esté active .

     sudo systemctl status mysql
    
    mysql.service - MySQL Community Server
    Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
    Active: active (running) since Sun 2021-05-30 13:06:47 UTC; 1 day 1h ago

Configure un nuevo usuario de MySQL para la réplica

Debe crear un nuevo usuario en el servidor de origen para representar la réplica. Los nuevos usuarios se crean dentro del shell de MySQL.

  1. Ingrese el shell de MySQL.

     sudo mysql -u root -p
    
  2. Agregue un usuario para la cuenta de réplica usando MySQL CREATE USER sintaxis. El nombre de usuario debe consistir en el nombre de la cuenta de réplica, un @ símbolo y la dirección IP del servidor de réplica. Elija una contraseña más segura para la cuenta en lugar de REPLICA_PASSWORD .

     CREATE USER 'replica_account_name'@'replica_ip_address‘ IDENTIFIED WITH sha256_password BY 'REPLICA_PASSWORD';
    
    Nota Para permitir que la réplica pueda conectarse desde cualquier dirección, especifique el usuario como 'replica_account_name'@'%' . El % símbolo representa cualquier dirección o dominio. Esto proporciona flexibilidad adicional a expensas de cierta seguridad.
  3. Otorgue derechos de replicación al usuario de la réplica remota.

     GRANT REPLICATION SLAVE ON *.* TO 'replica_account_name'@'replica_ip_address';
    

Prepare los datos de MySQL para la replicación

En este punto, es necesario vaciar y bloquear la base de datos de origen para preparar los datos para la replicación.

  1. Permanezca dentro del shell de MySQL y elimine los privilegios para volver a cargar las tablas de concesión sin reiniciar la base de datos.

     FLUSH PRIVILEGES;
    
  2. Bloquee la base de datos para congelar la base de datos en un punto estable desde el cual exportar los datos. Mantenga el cliente MySQL ejecutándose hasta que exporte la base de datos. Ingresar cualquier comando de escritura o salir del shell de MySQL libera el bloqueo.

     FLUSH TABLES WITH READ LOCK;
    
    Precaución Este comando bloquea todas las confirmaciones en la base de datos de origen. Exporte los datos antes de permitir que la fuente procese más confirmaciones. De lo contrario, la base de datos de réplica podría corromperse o ser inconsistente con la base de datos de origen. Complete los dos pasos restantes en esta sección lo antes posible.
  3. Verifique el estado de la base de datos usando el siguiente comando. Este comando muestra el archivo de registro actual junto con la posición del último registro en este archivo. Registre esta información porque es necesaria para iniciar la replicación en la réplica más tarde.

     SHOW MASTER STATUS;
    
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000002 |     1301 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
  4. Usando el shell de Linux desde una consola diferente, exporte la base de datos usando mysqldump herramienta. Seleccione un nombre fácil de recordar para el archivo de destino. Incluya los –master-data opción para agregar información sobre el archivo de registro y la posición del registro actual al registro.

     sudo mysqldump -u root -p -–all-databases -–master-data > databasecopy.sql
    
    Nota Para exportar una sola base de datos, incluya el --opt <database_name> opción en lugar de -–all-databases .
  5. De vuelta en el shell MySQL original, desbloquee la base de datos de origen.

     UNLOCK TABLES;
    
  6. Salga del shell de MySQL.

     QUIT;
    
  7. Copie el archivo de la base de datos exportada al servidor de la base de datos réplica, usando ftp , scp , u otro método para transferir el archivo.

     scp databasecopy.sql [email protected]<replica_ip_address>
    

Configure la base de datos réplica de MySQL

La siguiente configuración debe aplicarse a la configuración de la base de datos de réplica. Para instalar MySQL en el servidor réplica, consulte la sección Instalar MySQL.

  1. Abra el archivo MySQL principal, generalmente ubicado en /etc/mysql/mysql.conf.d/mysqld.cnf y cambia la bind-address para que coincida con la dirección IP del servidor de réplica.

    Archivo:/ etc/mysql/mysql.conf.d/mysqld.cnf
    1
    2
    
    bind-address  = xx.xx.xx.xx
        
  2. Descomente o agregue las líneas para server-id y log-bin . El server-id debe establecerse en 2 en la réplica, mientras que el log-bin la variable debe establecerse en /var/log/mysql/mysql-bin.log . Agregue una variable para relay-log y configúrelo en /var/log/mysql/mysql-relay-bin.log .

    Nota Asegúrese de que skip_networking La variable no está configurada en ningún lugar dentro de este archivo. Para replicar una sola base de datos, agregue la siguiente directiva al archivo binlog_do_db = database_name . Para configurar más de una réplica, numere el server-id valores de manera secuencialmente creciente. Por ejemplo, una segunda réplica tendría un server-id de 3 .
    Archivo:/ etc/mysql/mysql.conf.d/mysqld.cnf
    1
    2
    3
    4
    
    server-id        = 2
    log_bin    = /var/log/mysql/mysql-bin.log
    relay-log        = /var/log/mysql/mysql-relay-bin.log
        
  3. Reinicie el servicio MySQL para incorporar los cambios.

     sudo systemctl restart mysql
    
  4. Verifique el estado de MySQL y asegúrese de que esté active .

     sudo systemctl status mysql
    
    mysql.service - MySQL Community Server
         Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:>
         Active: active (running) since Mon 2021-05-31 16:29:48 UTC; 6s ago
  5. (Opcional ) MySQL recomienda usar SSL para conectarse a la fuente para mayor seguridad. Puede encontrar más información sobre la configuración de SSL en la Documentación SSL de MySQL. La herramienta de configuración de RSA se puede utilizar para acelerar este proceso.

Importar los datos de MySQL replicados y activar la replicación

El siguiente paso es importar la copia de los datos de la base de datos, establecer la fuente de replicación y reiniciar el servidor de la base de datos de réplica. La réplica debería estar sincronizada y lista para usar.

  1. Ingrese el siguiente comando desde el shell de Linux para importar la base de datos de origen. Especifique el nombre de la base de datos utilizada para exportar los datos anteriormente.

     sudo mysql -u root -p < databasecopy.sql
    
  2. Inicie sesión en el shell de MySQL.

     sudo mysql -u root -p
    
  3. Detener la réplica.

     STOP REPLICA;
    
  4. Introduzca el CHANGE REPLICATION SOURCE comando, junto con los siguientes detalles. Sustituya la dirección IP del servidor de la base de datos de origen en lugar de source_ip_address . Para SOURCE_USER y SOURCE_PASSWORD , ingrese el nombre de usuario y la contraseña de la réplica en la sección Configurar un nuevo usuario de MySQL para la réplica. Para el SOURCE_LOG_FILE y SOURCE_LOG_POS valores, ingrese la información que registró de SHOW MASTER STATUS; comando.

     CHANGE REPLICATION SOURCE TO SOURCE_HOST='source_ip_address',SOURCE_USER='replica_account_name', SOURCE_PASSWORD='REPLICA_PASSWORD', SOURCE_LOG_FILE='log_file_name', SOURCE_LOG_POS=log_position;
    
    Nota Para usar SSL para la conexión, que recomienda MySQL, agregue el atributo SOURCE_SSL=1 al mando. Puede encontrar más información sobre el uso de SSL en un contexto de replicación de fuente-réplica en la documentación de MySQL.
  5. Reinicie la réplica.

     START REPLICA;
    
  6. Verifique el estado de la réplica. La réplica debería estar esperando eventos y no debería haber ningún Last_IO_Error o Last_Error eventos. El Slave_SQL_Running_State la entrada debe indicar que la réplica ha leído el registro de retransmisión.

     SHOW REPLICA STATUS\G
    
    Slave_IO_State: Waiting for master to send event
                      Master_Host: 178.79.153.39
                      Master_User: replica
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000006
              Read_Master_Log_Pos: 156
                   Relay_Log_File: mysql-relay-bin.000006
                    Relay_Log_Pos: 371
            Relay_Master_Log_File: mysql-bin.000006
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    ..
                       Last_Errno: 0
                       Last_Error:
    ..
            Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error:
                   Last_SQL_Errno: 0
                   Last_SQL_Error:
      Replicate_Ignore_Server_Ids:
                 Master_Server_Id: 1
                      Master_UUID: 5bed9d10-c140-11eb-bc63-f23c92a2a6ac
                 Master_Info_File: mysql.slave_master_info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

Prueba de replicación de fuente-réplica de MySQL

Si la base de datos de origen ya se llenó antes de que se instanciara la réplica, se requieren pruebas adicionales. En este caso, verifique que las bases de datos y las tablas que existen en el origen estén presentes en la réplica después de importar los datos. En el SHOW REPLICA STATUS mostrar, el Slave_SQL_Running_State la entrada debe decir Slave has read all relay log .

Para verificar que la replicación se realice correctamente, cree una nueva base de datos o tabla en el origen. Después de unos segundos, la nueva entrada debería estar presente en la réplica. Valide la presencia de la base de datos usando SHOW DATABASES; dominio. Para confirmar la presencia de una tabla, cambie a la base de datos usando USE databasename; , e ingresa SHOW TABLES; . También es una buena idea ejecutar SHOW REPLICA STATUS comando y examinar la salida en busca de errores. El Last_Error y Last_IO_Error los campos deben estar vacíos y la réplica debe permanecer conectada.

Más información sobre la replicación de réplicas de origen de MySQL

La mejor fuente de información sobre la replicación fuente-réplica es la documentación oficial de MySQL. La sección sobre replicación contiene información más extensa sobre la arquitectura y el proceso de instalación. Los foros de MySQL también pueden ser útiles.

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.

  • Documentación MySQL