Migra un clúster de MySQL a Compute Engine mediante HAProxy

En este instructivo, se explica el proceso de migración de una base de datos de MySQL a Google Cloud mediante una replicación nativa de MySQL, instancias de HAProxy y Compute Engine. MySQL es un sistema de administración de bases de datos relacionales (RDBMS) popular y multifuncional.

Este instructivo es útil si eres un administrador del sistema, desarrollador, ingeniero, administrador de bases de datos o ingeniero DevOps que quieres migrar los datos que están en tu clúster de MySQL existente a MySQL en Compute Engine. Es posible que quieras administrar tu propia instancia de MySQL, en lugar de usar el servicio administrado, debido a las instancias entre regiones, el uso avanzado de parámetros y las necesidades de rendimiento específicas. Esta solución no aborda la migración de MySQL a Cloud SQL.

En este instructivo, suponemos que estás familiarizado con los siguientes sistemas:

  • Linux
  • Ubuntu-server 16.04
  • MySQL 5.7
  • HAProxy
  • Compute Engine

Arquitectura

Usa una plantilla de Cloud Deployment Manager del repositorio de GitHub de este instructivo para crear un entorno en el que un clúster de MySQL se encuentre en la región us-east1, que consta de una instancia principal (master) y una réplica (slave), además de un cliente de MySQL. Las secuencias de comandos detalladas en este documento propagan la base de datos con un esquema source_db y una tabla source_table con 5,000 filas de datos de muestra.

En el siguiente diagrama de arquitectura, se ilustra el entorno cuando comienzas. Está compuesto por un clúster de MySQL y una instancia de cliente.

Arquitectura del entorno inicial con un clúster de MySQL y una instancia de cliente

Primero, replica la instancia de réplica de origen en la instancia principal de destino que se ejecuta en Compute Engine y crea una instancia de HAProxy para reenviar el tráfico. En el siguiente diagrama, el balanceador de cargas de HAProxy apunta a la instancia principal de origen, y la replicación se configura entre la réplica de origen y la instancia principal de destino:

Apunta el balanceador de cargas a la instancia principal local

Después de que se configure la replicación y de que las implementaciones estén sincronizadas, apunta el balanceador de cargas de HAProxy a la instancia principal de destino de Compute Engine, como se ilustra en el siguiente diagrama:

Apunta el balanceador de cargas a las instancias de Compute Engine

Objetivos

  • Crear un clúster de MySQL de origen y una instancia de cliente MySQL en Compute Engine mediante Deployment Manager
  • Configurar una implementación de destino de un nodo de MySQL en Compute Engine
  • Replicar los datos del clúster de MySQL de origen en la instancia de MySQL de destino
  • Crear una instancia de HAProxy y configurarla para que apunte al clúster de MySQL de origen
  • Apuntar el cliente de MySQL a la instancia de HAProxy
  • Apuntar la instancia de HAProxy al nodo de MySQL de destino
  • Detener la replicación de datos de la implementación de origen a la implementación de destino

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

  • Compute Engine
  • Cloud Storage

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud sean aptos para obtener una prueba gratuita.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

  4. Habilita las API de Compute Engine and Cloud Deployment Manager.

    Habilita las API

Cuando finalices este instructivo, puedes borrar los recursos creados para evitar que se te siga facturando. Consulta la sección Limpieza para obtener más detalles.

Cómo configurar tu entorno

En este instructivo usarás Cloud Shell para ingresar comandos. Cloud Shell te brinda acceso a la línea de comandos en Google Cloud Console e incluye el SDK de Cloud y otras herramientas que necesitas para el desarrollo en Google Cloud. Cloud Shell se abre en una ventana en la parte inferior de Cloud Console. Es posible que la inicialización tome unos minutos, pero la ventana aparecerá de inmediato.

Como primer paso, usa Cloud Shell para crear un bucket de Cloud Storage.

  1. Abre Cloud Shell.

    Abrir Cloud Shell

  2. Configura una variable del entorno para el nombre del bucket de Cloud Storage.

    GCS_BUCKET_NAME=${USER}-mysql-$(date +%s)
    echo $GCS_BUCKET_NAME
    
  3. Crea el bucket de Cloud Storage.

    gsutil mb gs://${GCS_BUCKET_NAME}/
    
  4. Descarga las secuencias de comandos para configurar el entorno desde el repositorio de GitHub.

    git clone https://github.com/GoogleCloudPlatform/solutions-compute-mysql-migration-haproxy.git mysql-migration
    
  5. Ejecuta la secuencia de comandos de inicialización para crear un clúster de MySQL de las instancias principal y réplica. Esta secuencia de comandos también crea una instancia de cliente MySQL.

    cd mysql-migration
    ./run.sh ${DEVSHELL_PROJECT_ID} ${GCS_BUCKET_NAME}
    

Prepara la instancia de origen de MySQL para la replicación

A fin de migrar los datos a otra instancia de MySQL, configura la instancia source-mysql-replica para replicar los datos en otras instancias.

  1. En Cloud Console, ve a la página Instancias de VM.

    PÁGINA INSTANCIAS DE VM

  2. En la fila de la instancia source-mysql-replica, haz clic en ssh.

  3. Especifica un usuario para la replicación. A los efectos de este instructivo, la contraseña de este usuario es solution-admin.

    mysql -u root -psolution-admin -e "GRANT REPLICATION SLAVE ON *.* TO
    'sourcereplicator'@'%' IDENTIFIED BY 'solution-admin';"
    
  4. Habilita el registro de réplicas.

    sudo bash -c 'echo log_slave_updates = 1 >>/etc/mysql/mysql.conf.d/mysqld.cnf'
    
  5. Reinicia MySQL.

    sudo service mysql restart
    

    Cuando reinicies MySQL, los clientes conectados a la instancia de réplica se desconectarán. La sincronización de la réplica con la instancia principal puede tardar unos minutos, según el volumen de operaciones de escritura en la instancia principal mientras se reinicia la réplica.

Cómo configurar la cuenta de servicio para las instancias de MySQL de destino

Una cuenta de servicio se asocia con un conjunto de funciones y permisos. Crearás una cuenta de servicio para tu instancia de MySQL que tendrá los privilegios mínimos que se necesitan en este instructivo.

  1. Abre Cloud Shell.

    Abrir Cloud Shell

  2. Crea la cuenta de servicio.

    gcloud iam service-accounts create mysql-instance \
        --display-name "mysql-instance"
    
  3. Agrega la función storage.objectAdmin a la cuenta de servicio mysql-instance. Esta función es obligatoria para poder ver y descargar los archivos desde el bucket de Cloud Storage.

    gcloud projects add-iam-policy-binding ${DEVSHELL_PROJECT_ID} \
        --member=serviceAccount:mysql-instance@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com \
        --role=roles/storage.objectAdmin
    

Cómo configurar la instancia de MySQL de destino en Compute Engine

En esta sección, crearás una instancia de Compute Engine y, luego, instalarás MySQL en ella.

  1. En Cloud Shell, crea la instancia de destino de MySQL.

    gcloud compute instances create target-mysql-primary \
            --image-family=ubuntu-1604-lts  --image-project=ubuntu-os-cloud \
            --tags=mysql57 --zone=us-central1-c \
        --service-account=mysql-instance@${DEVSHELL_PROJECT_ID}.iam.gserviceaccount.com \
        --scopes=https://www.googleapis.com/auth/devstorage.read_write
    
  2. En Cloud Console, ve a la página Instancias de VM.

    PÁGINA INSTANCIAS DE VM

  3. Haz clic en Actualizar.

  4. En Cloud Console, usa ssh para conectarte a la instancia target-mysql-primary.

  5. En la ventana de la terminal de la instancia, instala MySQL.

    sudo apt-get update
    sudo apt-get -y install mysql-server-5.7
    
  6. Cuando se te solicite, ingresa solution-admin como contraseña del usuario raíz.

  7. En Cloud Shell, crea reglas de firewall para permitir la comunicación entre las instancias de MySQL de origen y la instancia de destino.

    gcloud compute firewall-rules create mysql  --allow=tcp:3306 \
        --source-tags source-mysql --target-tags target-mysql
    

Configura un acceso de usuario raíz seguro entre la instancia de réplica de origen y la instancia principal de destino

Para configurar la autenticación, debes crear claves privadas y públicas en la instancia target-mysql-primary y copiar la clave pública en la instancia source-mysql-replica. Esta autenticación te permite copiar archivos con rapidez de la instancia source-mysql-replica a la instancia target-mysql-primary mediante el comando rsync.

  1. En Cloud Console, usa ssh para conectarte a la instancia target-mysql-primary.

  2. Crea una clave privada.

    sudo ssh-keygen
    
  3. Cuando se te solicite, presiona Enter para aceptar toda la configuración predeterminada.

  4. Copia la clave pública en el bucket de Cloud Storage.

    sudo bash -c "gsutil cp /root/.ssh/id_rsa.pub gs://[GCS_BUCKET_NAME]/"
    

    En el ejemplo anterior, se ilustra lo siguiente:

    • [GCS_BUCKET_NAME] representa el depósito que creaste al comienzo de este instructivo.
  5. En Cloud Console, usa ssh para conectarte a la instancia source-mysql-replica.

  6. En la ventana de la terminal de la instancia, copia la clave pública desde el bucket de Cloud Storage.

    sudo bash -c "gsutil cp \
        gs://[GCS_BUCKET_NAME]/id_rsa.pub /root/.ssh/target-mysql-primary.pub"
    

    En el ejemplo anterior, se ilustra lo siguiente:

    • [GCS_BUCKET_NAME] representa el depósito que creaste al comienzo de este instructivo.
  7. Agrega la clave pública al archivo authorized_keys.

    sudo bash -c "cat /root/.ssh/target-mysql-primary.pub >>  \
        /root/.ssh/authorized_keys"
    
  8. En Cloud Console, usa ssh para conectarte a la instancia target-mysql-primary.

  9. En la instancia target-mysql-primary, prueba tu conexión.

    sudo ssh source-mysql-replica
    
  10. Cuando se te solicite, ingresa yes para aceptar la clave pública del servidor remoto.

Sincroniza las implementaciones de MySQL

Usa el comando rsync para copiar los archivos de datos de MySQL de la instancia source-mysql-replica a la instancia target-mysql-primary. Para minimizar el tiempo de inactividad, ejecutarás este comando dos veces: la primera vez mientras la réplica de origen está en línea para copiar la mayoría de los datos y la segunda vez mientras la réplica de origen está sin conexión. Copiar los archivos mientras la réplica de origen está sin conexión garantiza que todos los datos de los archivos abiertos se copien correctamente.

Copia los archivos de datos de MySQL

En esta sección, debes copiar los archivos de datos de MySQL de la instancia source-mysql-replica a la instancia target-mysql-primary.

  1. En Cloud Console, usa ssh para conectarte a la instancia target-mysql-primary.

  2. En la ventana de la terminal de la instancia, detén MySQL.

    sudo service mysql stop
    
  3. Borra el contenido de /var/lib/mysql.

    sudo bash -c "rm -rf /var/lib/mysql/*"
    
  4. Copia los archivos de la base de datos desde la fuente.

    sudo bash -c "rsync -av source-mysql-replica:/var/lib/mysql/ /var/lib/mysql"
    

    En este instructivo, este proceso tarda entre 5 y 10 segundos. Sin embargo, en una carga de trabajo real, el tiempo necesario para completar este proceso depende del tamaño de la base de datos que estés migrando y del rendimiento de la red.

  5. En Cloud Console, usa ssh para conectarte a la instancia source-mysql-replica.

  6. Pausa la replicación desde la instancia source-mysql-primary.

    mysql -uroot -psolution-admin -e 'show master status; stop slave;'
    

    El resultado aparecerá en el siguiente formato.:

    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000002 |      154 | source_db    |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    

    Toma nota del archivo log_bin y de la posición. Más adelante en el instructivo, el nombre del archivo mysql-bin.000002 se representa como PRIMARY_LOG_FILE, y la posición del archivo 154 se representa como PRIMARY_LOG_POS, ya que los valores pueden ser diferentes.

  7. En la instancia target-mysql-primary, ejecuta el siguiente comando para asegurarte de que la instancia target-mysql-primary sea coherente con la instancia source-mysql-replica, ya que no detuviste las operaciones de escritura durante la primera operación de copia.

    sudo bash -c "rsync -av source-mysql-replica:/var/lib/mysql/ /var/lib/mysql"
    
  8. En la instancia source-mysql-replica, reanuda la replicación.

    sudo mysql -uroot -psolution-admin -e 'start slave;'
    

Configura la instancia target-mysql-primary para la replicación

  1. En Cloud Console, usa ssh para conectarte a la instancia target-mysql-primary.

  2. Quita el archivo que contiene el ID de instancia de MySQL predeterminado.

    sudo rm /var/lib/mysql/auto.cnf
    
  3. Actualiza la configuración de MySQL para replicar la base de datos source_db desde la instancia source-mysql-replica.

    sudo sed -i "s|#server-id.*|server-id = 4|" \
        /etc/mysql/mysql.conf.d/mysqld.cnf
    sudo sed -i "s|#log_bin|log_bin|" /etc/mysql/mysql.conf.d/mysqld.cnf
    sudo sed -i "s|#binlog_do_db.*|binlog_do_db = source_db|" \
        /etc/mysql/mysql.conf.d/mysqld.cnf
    
  4. Habilita MySQL para aceptar conexiones de otros hosts en su red.

    LOCAL_IP=$(curl  http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip \
        -H "Metadata-Flavor: Google")
    sudo sed -i "s|bind-address.*|bind-address = $LOCAL_IP|" \
        /etc/mysql/mysql.conf.d/mysqld.cnf
    
  5. Inicia MySQL.

    sudo service mysql start
    
  6. Accede a la consola de MySQL.

    mysql -u root -psolution-admin
    
  7. Restablece la instancia principal.

    reset slave;
    
  8. Configura el proceso de replicación.

    CHANGE MASTER TO MASTER_HOST='source-mysql-replica', \
        MASTER_USER='sourcereplicator', MASTER_PASSWORD='solution-admin', \
        MASTER_LOG_FILE='[[PRIMARY_LOG_FILE]]', MASTER_LOG_POS=[[PRIMARY_LOG_POS]];
    

    En el ejemplo anterior, se ilustra lo siguiente:

    • [PRIMARY_LOG_FILE] representa mysql-bin.000002 de un paso anterior.
    • [PRIMARY_LOG_FILE] representa 154 de un paso anterior.
  9. Inicia la replicación.

    start slave;
    
  10. Verifica que la tabla source_db exista en el servidor y contenga los datos de la implementación de origen.

    SELECT * FROM source_db.source_table;
    

    La tabla aparecerá en el siguiente formato:

    +----+---------------------+------------+
    | id | timestamp           | event_data |
    +----+---------------------+------------+
    |  1 | 2018-09-06 13:57:17 |    8511.85 |
    |  2 | 2018-09-06 13:57:17 |    2658.33 |
    |  3 | 2018-09-06 13:57:17 |    2756.08 |
    |  4 | 2018-09-06 13:57:17 |    5805.42 |
    |  5 | 2018-09-06 13:57:17 |    5758.86 |
    
  11. Verifica el estado de la instancia de réplica.

    show slave status \G
    

    El resultado es similar al siguiente.

    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: source-mysql-replica
    ...
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    ...
    1 row in set (0.00 sec)
    

Crea la instancia de HAProxy

Mediante la instancia de HAProxy, crea un punto de acceso que puedas apuntar a la implementación de origen. Luego, puedes apuntar ese punto de acceso a la implementación de destino, sin necesidad de volver a configurar los clientes durante la migración.

  1. En Cloud Shell, crea la instancia de HAProxy y asígnale una dirección IP fija.

    gcloud compute instances create haproxy --image-family=ubuntu-1604-lts  \
        --image-project=ubuntu-os-cloud --tags=haproxy,http-server \
        --zone=us-central1-c --private-network-ip=10.128.0.100
    
  2. En Cloud Console, ve a la página Instancias de VM.

    PÁGINA INSTANCIAS DE VM

  3. Haz clic en Actualizar.

  4. En la fila de la instancia de HAProxy, haz clic en ssh para conectarte a la instancia.

  5. En la instancia de HAProxy, instala HAProxy 1.6.3.

    sudo apt-get update
    sudo apt-get install -y haproxy=1.6.3-1
    
  6. Para poder probar la conectividad con las instancias de MySQL después, instala el cliente de MySQL.

    sudo apt-get install -y mysql-client
    

Cómo habilitar la instancia de HAProxy para comunicarte con los nodos principales de ambas implementaciones de MySQL

Cuando termines de configurar la replicación de MySQL, estarás listo para iniciar la migración.

Habilita las reglas de firewall

  1. En Cloud Shell, crea reglas de firewall para habilitar la comunicación entre la instancia de HAProxy y ambas implementaciones de MySQL.

    gcloud compute firewall-rules create haproxy-mysql --allow=tcp:3306 \
        --source-tags haproxy --target-tags target-mysql,source-mysql
    
  2. Crea reglas de firewall que permitan el acceso de administrador de la instancia de HAProxy.

    gcloud compute firewall-rules create haproxy-admin --allow=tcp:80 \
        --source-ranges=0.0.0.0/0 --target-tags haproxy
    

Configura la autenticación de HAProxy para la instancia de destino

En esta sección, configurarás la autenticación de HAProxy para la instancia de target-mysql-primary.

  1. En Cloud Console, usa ssh para conectarte a la instancia target-mysql-primary.

  2. Crea un usuario llamado haproxy_check. Autoriza al usuario a acceder desde la instancia de HAProxy. La instancia de HAProxy usa este usuario para verificar el estado de un servidor.

    mysql -uroot -psolution-admin -e "INSERT INTO mysql.user \
        (Host,User,ssl_cipher,x509_issuer,x509_subject) values \
        ('10.128.0.100','haproxy_check','','',''); FLUSH PRIVILEGES";
    
  3. Crea un usuario llamado haproxy_root. Autoriza al usuario a acceder desde la instancia de HAProxy.

    PROJECT_ID=`curl  \
        http://metadata.google.internal/computeMetadata/v1/project/project-id -H "Metadata-Flavor: Google"`
    HA_PROXY_FQDN=haproxy.c.$PROJECT_ID.internal
    mysql -uroot -psolution-admin -e "GRANT ALL PRIVILEGES ON *.* TO \
        'haproxy_root'@'"$HA_PROXY_FQDN"' IDENTIFIED BY 'solution-admin' WITH \
        GRANT OPTION; FLUSH PRIVILEGES;"
    

Configura la autenticación de HAProxy para la instancia principal de origen

En esta sección, configurarás la autenticación de HAProxy para la instancia source-mysql-primary.

  1. En Cloud Console, usa ssh para conectarte a la instancia source-mysql-primary.

  2. Crea un usuario llamado haproxy_check y otórgale permiso para acceder desde la instancia de HAProxy.

    mysql -uroot -psolution-admin -e "INSERT INTO mysql.user \
        (Host,User,ssl_cipher,x509_issuer,x509_subject) values \
        ('10.128.0.100','haproxy_check','','',''); FLUSH PRIVILEGES;"
    
  3. Crea un usuario llamado HAProxy_root y otórgale permiso para acceder desde la instancia de HAProxy.

    PROJECT_ID=`curl  \
        http://metadata.google.internal/computeMetadata/v1/project/project-id -H \
        "Metadata-Flavor: Google"`
    HA_PROXY_FQDN=haproxy.c.$PROJECT_ID.internal
    mysql -uroot -psolution-admin -e "GRANT ALL PRIVILEGES ON *.* TO \
        'haproxy_root'@'"$HA_PROXY_FQDN"' IDENTIFIED BY 'solution-admin' WITH GRANT OPTION; FLUSH PRIVILEGES;"
    

    Este usuario haproxy_root es necesario para acceder a MySQL desde la instancia de HAProxy.

Prueba la conectividad entre las instancias principales de HAProxy y MySQL

  1. En Cloud Console, usa ssh para acceder a la máquina de HAProxy.

  2. Prueba la conectividad con la instancia source-mysql-primary.

    mysql -h source-mysql-primary -u haproxy_root -psolution-admin -e \
        "SHOW DATABASES"
    
  3. Prueba la conectividad con la instancia target-mysql-primary.

    mysql -h target-mysql-primary -u haproxy_root -psolution-admin -e \
        "SHOW DATABASES"
    

Configura HAProxy

Ahora debes crear el archivo de configuración de HAProxy y apuntarlo a la instancia source-mysql-primary.

  1. En Cloud Console, usa ssh para acceder a la instancia de HAProxy.

  2. Crea una copia de seguridad del archivo de configuración de HAProxy existente en la instancia de HAProxy.

    sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bkp
    
  3. Configura la instancia de HAProxy y crea una contraseña para usarla más adelante en el instructivo.

    sudo bash -c "cat <<EOF >  /etc/haproxy/haproxy.cfg
    ######### HAProxy Config file #########
    
    global
           log /dev/log    local0
           log /dev/log    local1 notice
           chroot /var/lib/haproxy
           stats socket /run/haproxy/admin.sock mode 660 level admin
           stats timeout 30s
           user haproxy
           group haproxy
           daemon
    
    defaults
           log     global
           timeout connect 3000
           timeout client  5000
           timeout server  5000
    
    listen mysql-cluster
    bind 127.0.0.1:3306,$(curl  \
        http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip \
        -H 'Metadata-Flavor: Google'):3306
           mode tcp
           option mysql-check user haproxy_check
           balance roundrobin
    
           # Server number 1
           server source-primary source-mysql-primary:3306 check
    
           # Server number 2
           # server target-primary target-mysql-primary:3306 check
    
    listen stats
           bind 0.0.0.0:80
           mode http
           stats enable
           stats uri /haproxy
           stats realm Strictly\ Private
           stats auth mysqlproxy:MySQLProxy12!
    EOF"
    
  4. Vuelve a cargar el servicio de HAProxy.

    sudo service haproxy reload
    

Prueba la implementación

  1. Desde la instancia de HAProxy, usa la dirección del host local como host para conectarte a la instancia source-mysql-primary.

    mysql -h 127.0.0.1 -u haproxy_root -psolution-admin -e "SHOW DATABASES"
    

    La salida contiene los nombres de las bases de datos.

    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | source_db          |
    | sys                |
    +--------------------+
    
  2. En Cloud Console, usa ssh para conectarte a la instancia mysql-client.

  3. Usa la instancia de HAProxy para probar la conectividad a la instancia source-mysql-primary.

    mysql -h haproxy  -u haproxy_root -psolution-admin -e "SHOW DATABASES"
    
  4. En Cloud Shell, busca la dirección IP pública de la instancia de HAProxy.

    gcloud compute instances describe haproxy \
        --format='value(networkInterfaces[0].accessConfigs[0].natIP)' \
        --zone=us-central1-c
    
  5. Copia la dirección IP externa de la instancia de HAProxy.

  6. Para verificar el estado de la conectividad entre la instancia de HAProxy y la instancia source-mysql-master, ve a la siguiente URL y verifica que la fila de la instancia de origen principal sea verde.

    http://[PUBLIC_IP_OF_HAPROXY]/haproxy
    

    En el ejemplo anterior, se ilustra lo siguiente:

    • [PUBLIC_IP_OF_HAPROXY] representa la dirección IP pública de la instancia de HAProxy.
  7. En el campo Nombre de usuario, ingresa mysqlproxy.

  8. En el campo Contraseña, ingresa MySQLProxy12!.

Cambia el servidor de MySQL

En esta etapa, realizarás la migración real. Te asegurarás de que todas las instancias estén sincronizadas, apuntarás el servicio de HAProxy a la implementación de destino y probarás tu entorno.

Detén el servicio de HAProxy

  1. Conéctate a la instancia de HAProxy.

  2. Para asegurarte de que el destino coincida con el origen, detén todas las conexiones a la instancia source-mysql-primary.

    sudo service haproxy stop
    

Bloquea las tablas en la instancia principal

  1. Conéctate a la instancia source-mysql-primary.

  2. Bloquea las tablas para las operaciones de escritura.

    mysql -uroot -psolution-admin -e "FLUSH TABLES WITH READ LOCK"
    

Verifica que las instancias de origen estén sincronizadas

En esta sección, debes verificar que las instancias source-mysql-primary y source-mysql-replica estén sincronizadas.

  1. En Cloud Console, usa ssh para acceder a la instancia source-mysql-replica.

  2. Comprueba el estado de la réplica.

    mysql -u root -psolution-admin -e "show slave status \G" | grep \
        Seconds_Behind_Master
    

    Las instancias se sincronizan si el valor de Seconds_Behing_Master es 0.

Verifica que las instancias de origen y de destino estén sincronizadas

En esta sección, debes verificar que las instancias source-mysql-replica y target-mysql-primary estén sincronizadas.

  1. En Cloud Console, usa ssh para acceder a la instancia target-mysql-primary.

  2. Comprueba el estado de la réplica.

    mysql -u root -psolution-admin -e "show slave status \G" | grep Seconds_Behind_Master
    

    Las instancias se sincronizan si el valor de Seconds_Behind_Master es 0.

  3. Detén la replicación desde la instancia source-mysql-replica.

    mysql -u root -psolution-admin -e "stop slave;reset master;"
    

Haz que la configuración de HAProxy apunte a la instancia target-mysql-primary

  1. En Cloud Console, usa ssh para acceder a la instancia de HAProxy.

  2. Cambia la configuración de HAProxy para que apunte a la instancia target-mysql-primary.

    sudo sed -i 's|server source-primary|# server source-primary|g' \
        /etc/haproxy/haproxy.cfg
    sudo sed -i 's|# server target-primary|server target-primary|g' \
        /etc/haproxy/haproxy.cfg
    
  3. Vuelve a cargar el servicio.

    sudo service haproxy restart
    
  4. Para verificar el estado de la conectividad entre la instancia de HAProxy y la instancia target-mysql-primary, ve a la siguiente URL y verifica que la fila de destino de la instancia principal sea verde.

    http://[PUBLIC_IP_OF_HAPROXY]/haproxy
    

    En el ejemplo anterior, se ilustra lo siguiente:

    • [PUBLIC_IP_OF_HAPROXY] representa la dirección IP pública de la instancia de HAProxy.
  5. En el campo Nombre de usuario, ingresa mysqlproxy.

  6. En el campo Contraseña, ingresa MySQLProxy12!

  7. En Cloud Console, usa ssh para acceder a la instancia mysql-client.

  8. Prueba la configuración nueva.

    mysql -h haproxy  -u haproxy_root -psolution-admin -e "SHOW DATABASES"
    

    El resultado contiene los nombres de las bases de datos.

    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | source_db          |
    | sys                |
    +--------------------+
    

Consideraciones para migrar un clúster de producción

En este instructivo, migraste un clúster de MySQL a una instancia diferente de MySQL. Aunque se implementa en Google Cloud, el clúster de origen simula un clúster local o de una plataforma de nube diferente. Aquí se mencionan algunos puntos que debes tener en cuenta cuando migras una carga de trabajo de producción:

  • Configura la conectividad: ya sea que estés migrando desde una implementación local o desde otra nube pública, debes configurar canales de conectividad entre tu entorno y Google Cloud. Se recomienda usar una VPN o Cloud Interconnect.
  • Rendimiento de la red: ¿cuál es la latencia entre el entorno de origen y el entorno de destino? ¿Cuál es tu ancho de banda disponible? Tus factores pueden tener efectos significativos en la velocidad de sincronización y pueden afectar la conexión entre tus clientes y el clúster de HAProxy.
  • Ajuste de los parámetros de la base de datos: en este instructivo, solo se abordan algunos parámetros de replicación. Es posible que los administradores de la base de datos hayan configurado el clúster de MySQL de origen con diferentes parámetros personalizados para modificar su rendimiento y configuración según las necesidades del entorno y la app. Por ejemplo, puede que debas ajustar la configuración del clúster de destino.
  • Los tipos de consultas que ejecutas en tu clúster de MySQL: ¿ejecutas consultas largas? ¿La cantidad de consultas por segundo es alta o baja? Las respuestas pueden afectar la forma en que configuras la instancia de HAProxy. Por ejemplo, podrías tener que ajustar los tiempos de espera.
  • Implementación de destino: en este instructivo, no configuraste una instancia de réplica para la implementación de destino. En un entorno de producción, configurarás un clúster para la implementación de destino.
  • Instancias e implementaciones de Haproxy: usaste una sola instancia de HAProxy para este instructivo. Para la migración de una carga de trabajo de producción, puedes usar una implementación de HAProxy redundante.
  • Selección de la zona: en este instructivo, se usa la zona us-central1-c, pero puedes usar cualquier zona para las cargas de trabajo de producción. Si quieres obtener más información sobre cómo seleccionar una región, consulta Prácticas recomendadas para la selección de regiones de Compute Engine.
  • Tamaño de disco: asegúrate de que el tamaño del disco coincida con las instancias de MySQL de origen.
  • Permisos y acceso: en este instructivo, usaste el usuario raíz. En una migración de producción, es posible que debas usar un usuario diferente si no puedes ejecutar los comandos de sudo o root.

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

¿Qué sigue?