MySQL-Cluster mit HAProxy zu Compute Engine migrieren

Diese Anleitung führt Sie durch die Migration einer MySQL-Datenbank zu Google Cloud durch native MySQL-Replikation, HAProxy-Instanzen und Compute Engine. MySQL ist ein beliebtes relationales Datenbankverwaltungssystem (RDBMS) mit Multifunktionen.

Diese Anleitung ist hilfreich, wenn Sie Systemadministrator, Entwickler, Ingenieur, Datenbankadministrator oder DevOps-Ingenieur sind und Daten aus einem vorhandenen MySQL-Cluster auf MySQL in Compute Engine migrieren möchten. Möglicherweise möchten Sie Ihre eigene MySQL-Instanz verwalten, anstatt den verwalteten Dienst zu verwenden, da Sie es mit Instanzen aus verschiedenen Regionen zu tun haben, erweiterte Parameter verwenden und bestimmte Leistungsanforderungen benötigen. Diese Anleitung bezieht sich nicht auf die Migration von MySQL auf Cloud SQL.

Für diese Anleitung wird vorausgesetzt, dass Sie mit den folgenden Themen vertraut sind:

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

Architektur

Sie verwenden eine Cloud Deployment Manager-Vorlage aus dem GitHub-Repository dieser Anleitung, um eine Umgebung zu erstellen, in der sich ein MySQL-Cluster in der Region us-east1 befindet, der aus einer Primärinstanz (master) und einem Replikat (slave) sowie einem MySQL-Client besteht. Die Datenbank enthält die in diesem Dokument beschriebenen Skripts, d. h. ein source_db-Schema und eine source_table-Tabelle mit 5.000 Zeilen an Beispieldaten.

Dieses Architekturdiagramm zeigt, wie Ihre Umgebung zu Beginn aussieht. Sie besteht aus einem MySQL-Cluster und einer Client-Instanz.

Architektur der Anfangsumgebung mit einem MySQL-Cluster und einer Client-Instanz

Zuerst replizieren Sie die Quellreplikatinstanz in die primäre Zielinstanz, die auf Compute Engine ausgeführt wird, und erstellen eine HAProxy-Instanz, um den Traffic weiterzuleiten. In diesem Diagramm verweist der HAProxy-Load-Balancer auf die primäre Quellinstanz. Die Replikation wird zwischen dem Quellreplikat und der primären Zielinstanz konfiguriert:

Den Load-Balancer auf die lokale Primärinstanz verweisen

Wenn die Replikation konfiguriert wurde und die Bereitstellungen synchronisiert sind, verweisen Sie den HAProxy-Load-Balancer auf die primäre Zielinstanz auf Compute Engine wie in diesem Diagramm:

Den Load-Balancer auf die Instanzen von Compute Engine verweisen

Ziele

  • Mit Deployment Manager einen MySQL-Quellcluster und eine MySQL-Clientinstanz auf Compute Engine erstellen.
  • Eine MySQL-Bereitstellung mit einem Knoten auf Compute Engine einrichten.
  • Daten aus dem MySQL-Quellcluster in die MySQL-Zielinstanz replizieren.
  • Eine HAProxy-Instanz erstellen und sie so konfigurieren, dass sie auf den MySQL-Quellcluster verweist.
  • Den MySQL-Client auf die HAProxy-Instanz verweisen.
  • Die HAProxy-Instanz auf den MySQL-Zielknoten verweisen.
  • Die Datenreplikation von der Quellbereitstellung auf die Zielbereitstellung beenden.

Kosten

In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

  • Compute Engine
  • Cloud Storage

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweis

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  4. Compute Engine and Cloud Deployment Manager APIs aktivieren.

    Aktivieren Sie die APIs

Nach Abschluss dieser Anleitung können Sie weitere Kosten durch Löschen von erstellten Ressourcen vermeiden. Weitere Informationen finden Sie im Abschnitt Bereinigen.

Umgebung einrichten

In dieser Anleitung verwenden Sie Cloud Shell zum Eingeben von Befehlen. Mit Cloud Shell erhalten Sie Zugriff auf die Befehlszeile der Google Cloud Console. Außerdem enthält Cloud Shell das Cloud SDK und weitere Tools, die Sie für die Entwicklung in Google Cloud benötigen. Cloud Shell wird als Fenster unten in der Cloud Console angezeigt. Die Initialisierung kann einige Minuten dauern, aber das Fenster ist sofort sichtbar.

Verwenden Sie Cloud Shell in einem ersten Schritt, um einen Cloud Storage-Bucket zu erstellen.

  1. Öffnen Sie Cloud Shell.

    Zu Cloud Shell

  2. Legen Sie eine Umgebungsvariable für den Namen des Cloud Storage-Buckets fest.

    GCS_BUCKET_NAME=${USER}-mysql-$(date +%s)
    echo $GCS_BUCKET_NAME
    
  3. Erstellen Sie den Cloud Storage-Bucket.

    gsutil mb gs://${GCS_BUCKET_NAME}/
    
  4. Rufen Sie die Skripts zum Einrichten der Umgebung aus dem GitHub-Repository ab.

    git clone https://github.com/GoogleCloudPlatform/solutions-compute-mysql-migration-haproxy.git mysql-migration
    
  5. Führen Sie das Initialisierungsskript aus, um einen MySQL-Cluster mit Primär- und Replikatinstanzen zu erstellen. Dieses Skript erstellt auch eine MySQL-Clientinstanz.

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

Die MySQL-Quellinstanz für die Replikation vorbereiten

Richten Sie die source-mysql-replica-Instanz ein, um die Daten in andere Instanzen zu replizieren und so die Daten auf eine andere MySQL-Instanz zu replizieren.

  1. Gehen Sie in der Cloud Console zur Seite VM-Instanzen.

    Zur Seite "VM-Instanzen"

  2. Klicken Sie in der Instanzzeile source-mysql-replica auf ssh.

  3. Geben Sie zu Replikationszwecken einen Nutzer an. In dieser Anleitung lautet das Passwort für diesen Nutzer solution-admin.

    mysql -u root -psolution-admin -e "GRANT REPLICATION SLAVE ON *.* TO
    'sourcereplicator'@'%' IDENTIFIED BY 'solution-admin';"
    
  4. Aktivieren Sie das Replikat-Logging.

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

    sudo service mysql restart
    

    Wenn Sie MySQL neu starten, werden alle mit der Replikatinstanz verbundenen Clients getrennt. Je nach Anzahl der Schreibvorgänge in der Primärinstanz kann es einige Zeit dauern, bis das Replikat mit der Primärinstanz synchronisiert wird, während das Replikat neu gestartet wird.

Das Dienstkonto für MySQL-Zielinstanzen einrichten

Einem Dienstkonto werden Rollen und Berechtigungen zugeordnet. Sie erstellen ein Dienstkonto für Ihre MySQL-Instanz, das die erforderlichen Mindestberechtigungen für diese Anleitungen erfüllt.

  1. Öffnen Sie Cloud Shell.

    Zu Cloud Shell

  2. Erstellen Sie das Dienstkonto.

    gcloud iam service-accounts create mysql-instance \
        --display-name "mysql-instance"
    
  3. Fügen Sie dem Dienstkonto mysql-instance die Rolle storage.objectAdmin hinzu. Diese Rolle ist erforderlich, um Dateien aus dem Cloud Storage-Bucket aufzurufen und herunterzuladen.

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

MySQL-Zielinstanz auf Compute Engine einrichten

In diesem Abschnitt erstellen Sie eine Compute Engine-Instanz und installieren darauf MySQL.

  1. Erstellen Sie die MySQL-Zielinstanz in Cloud Shell.

    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. Gehen Sie in der Cloud Console zur Seite VM-Instanzen.

    Zur Seite "VM-Instanzen"

  3. Klicken Sie auf Aktualisieren.

  4. Stellen Sie in der Cloud Console mit ssh eine Verbindung zur Instanz target-mysql-primary her.

  5. Installieren Sie MySQL im Terminalfenster der Instanz.

    sudo apt-get update
    sudo apt-get -y install mysql-server-5.7
    
  6. Geben Sie bei Aufforderung solution-admin als Passwort für den Root-Nutzer ein.

  7. Erstellen Sie in Cloud Shell Firewallregeln für die Kommunikation zwischen den MySQL-Quellinstanzen und der Zielinstanz.

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

Gesicherten Root-Zugriff zwischen dem Quellreplikat und den primären Zielinstanzen einrichten

Sie richten die Authentifizierung ein, indem Sie private und öffentliche Schlüssel in der Instanz target-mysql-primary erstellen und den öffentlichen Schlüssel in die Instanz source-mysql-replica kopieren. Durch diese Authentifizierung können Sie später mit dem Befehl rsync Dateien schnell von der Instanz source-mysql-replica in die Instanz target-mysql-primary kopieren.

  1. Stellen Sie in der Cloud Console mit ssh eine Verbindung zur Instanz target-mysql-primary her.

  2. Erstellen Sie einen privaten Schlüssel.

    sudo ssh-keygen
    
  3. Drücken Sie bei Aufforderung Enter, um alle Standardeinstellungen zu akzeptieren.

  4. Kopieren Sie den öffentlichen Schlüssel in den Cloud Storage-Bucket.

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

    Wobei:

    • [GCS_BUCKET_NAME] für den Bucket steht, den Sie zu Beginn dieser Anleitung erstellt haben.
  5. Stellen Sie in der Cloud Console mit ssh eine Verbindung zur Instanz source-mysql-replica her.

  6. Kopieren Sie den öffentlichen Schlüssel aus dem Cloud Storage-Bucket, der sich im Terminalfenster der Instanz befindet.

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

    Wobei:

    • [GCS_BUCKET_NAME] für den Bucket steht, den Sie zu Beginn dieser Anleitung erstellt haben.
  7. Fügen Sie den öffentlichen Schlüssel zur Datei authorized_keys hinzu.

    sudo bash -c "cat /root/.ssh/target-mysql-primary.pub >>  \
        /root/.ssh/authorized_keys"
    
  8. Stellen Sie in der Cloud Console mit ssh eine Verbindung zur Instanz target-mysql-primary her.

  9. Testen Sie in der Instanz target-mysql-primary die Verbindung.

    sudo ssh source-mysql-replica
    
  10. Geben Sie bei Aufforderung yes ein, um den öffentlichen Schlüssel des Remote-Servers zu akzeptieren.

MySQL-Deployments synchronisieren

Kopieren Sie mit dem Befehl rsync die MySQL-Datendateien von der Instanz source-mysql-replica in die Instanz target-mysql-primary. Führen Sie diesen Befehl zweimal aus, um die Ausfallzeit zu minimieren: ein Mal, während das Quellreplikat online ist (um die Mehrheit der Daten zu kopieren) und ein zweites Mal, während das Quellreplikat offline ist. Durch den zweiten Kopiervorgang wird sichergestellt, dass alle Daten in den offenen Dateien korrekt kopiert werden.

MySQL-Datendateien kopieren

In diesem Abschnitt kopieren Sie die MySQL-Datendateien von der Instanz source-mysql-replica in die Instanz target-mysql-primary.

  1. Stellen Sie in der Cloud Console mit ssh eine Verbindung zur Instanz target-mysql-primary her.

  2. Beenden Sie MySQL im Terminalfenster der Instanz.

    sudo service mysql stop
    
  3. Löschen Sie den Inhalt von /var/lib/mysql.

    sudo bash -c "rm -rf /var/lib/mysql/*"
    
  4. Kopieren Sie die Datenbankdateien aus der Quellinstanz.

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

    In dieser Anleitung dauert dieser Vorgang 5–10 Sekunden. Bei einer echten Arbeitslast hängt die Zeit für den Abschluss dieses Vorgangs jedoch von der Größe der zu migrierenden Datenbank und der Leistung Ihres Netzwerks ab.

  5. Stellen Sie in der Cloud Console mit ssh eine Verbindung zur Instanz source-mysql-replica her.

  6. Halten Sie die Replikation von der Instanz source-mysql-primary an.

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

    Die Ausgabe wird in diesem Format ausgegeben:

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

    Notieren Sie sich die Datei log_bin und die Position. Später in dieser Anleitung wird der Dateiname mysql-bin.000002 als PRIMARY_LOG_FILE und die Position der Datei 154 als PRIMARY_LOG_POS angegeben, da Ihre Werte möglicherweise abweichen.

  7. Führen Sie in der Instanz target-mysql-primary diesen Befehl aus, damit die Instanzen target-mysql-primary und source-mysql-replica konsistent sind, da Sie die Schreibvorgänge während des ersten Kopiervorgangs nicht angehalten haben.

    sudo bash -c "rsync -av source-mysql-replica:/var/lib/mysql/ /var/lib/mysql"
    
  8. Setzen Sie die Replikation der Instanz source-mysql-replica fort.

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

Instanz "target-mysql-primary" für die Replikation konfigurieren

  1. Stellen Sie in der Cloud Console mit ssh eine Verbindung zur Instanz target-mysql-primary her.

  2. Entfernen Sie die Datei mit der Standard-MySQL-Instanz-ID.

    sudo rm /var/lib/mysql/auto.cnf
    
  3. Aktualisieren Sie die MySQL-Konfiguration, um die Datenbank source_db aus der Instanz source-mysql-replica zu replizieren.

    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. Aktivieren Sie MySQL, um Verbindungen von anderen Hosts im Netzwerk zu akzeptieren.

    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. Starten Sie MySQL.

    sudo service mysql start
    
  6. Melden Sie sich bei der MySQL-Konsole an.

    mysql -u root -psolution-admin
    
  7. Setzen Sie die primäre Instanz zurück.

    reset slave;
    
  8. Konfigurieren Sie den Replikationsprozess.

    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]];
    

    Wobei:

    • [PRIMARY_LOG_FILE] steht für mysql-bin.000002 aus einem früheren Schritt.
    • [PRIMARY_LOG_FILE] steht für 154 aus einem früheren Schritt.
  9. Starten Sie die Replikation.

    start slave;
    
  10. Bestätigen Sie, dass die source_db-Tabelle auf dem Server vorhanden ist und die Daten aus der Quellbereitstellung enthält.

    SELECT * FROM source_db.source_table;
    

    Die Tabelle wird in diesem Format ausgegeben:

    +----+---------------------+------------+
    | 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. Überprüfen Sie den Status der Replikatinstanz.

    show slave status \G
    

    Die entsprechende Ausgabe sieht etwa so aus:

    *************************** 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)
    

Die HAProxy-Instanz erstellen

Mit der Instanz HAProxy erstellen Sie einen Zugangspunkt, den Sie auf die Quellbereitstellung verweisen können. Später können Sie diesen Zugriffspunkt auf die Zielbereitstellung verweisen, ohne die Clients während der Migration neu zu konfigurieren.

  1. Erstellen Sie in Cloud Shell die Instanz HAProxy und weisen Sie der Instanz eine feste IP-Adresse zu.

    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. Gehen Sie in der Cloud Console zur Seite VM-Instanzen.

    Zur Seite "VM-Instanzen"

  3. Klicken Sie auf Aktualisieren.

  4. Klicken Sie in der Zeile für die Instanz HAProxy auf ssh, um eine Verbindung zur Instanz herzustellen.

  5. Installieren Sie HAProxy 1.6.3 auf der Instanz HAProxy.

    sudo apt-get update
    sudo apt-get install -y haproxy=1.6.3-1
    
  6. Installieren Sie den MySQL-Client, um später die Verbindung zu den MySQL-Instanzen testen zu können.

    sudo apt-get install -y mysql-client
    

HAProxy-Instanz für die Kommunikation mit den Primärknoten beider MySQL-Bereitstellungen aktivieren

Wenn Sie die MySQL-Replikation eingerichtet haben, können Sie mit der Migration beginnen.

Firewallregeln aktivieren

  1. Erstellen Sie in Cloud Shell Firewallregeln für die Kommunikation zwischen der Instanz HAProxy und den beiden MySQL-Bereitstellungen.

    gcloud compute firewall-rules create haproxy-mysql --allow=tcp:3306 \
        --source-tags haproxy --target-tags target-mysql,source-mysql
    
  2. Erstellen Sie Firewallregeln, um den Administratorzugriff der Instanz HAProxy zuzulassen.

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

HAProxy-Authentifizierung für die Zielinstanz einrichten

In diesem Abschnitt richten Sie die Authentifizierung HAProxy für die Instanz target-mysql-primary ein.

  1. Stellen Sie in der Cloud Console mit ssh eine Verbindung zur Instanz target-mysql-primary her.

  2. Erstellen Sie einen Nutzer mit dem Namen haproxy_check. Berechtigen Sie den Nutzer, sich über die Instanz HAProxy anzumelden. Die Instanz HAProxy prüft mit diesem Nutzer den Status eines Servers.

    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. Erstellen Sie einen Nutzer mit dem Namen haproxy_root. Berechtigen Sie den Nutzer, sich über die Instanz HAProxy anzumelden.

    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;"
    

HAProxy-Authentifizierung für die primäre Quellinstanz einrichten

In diesem Abschnitt richten Sie die Authentifizierung HAProxy für die Instanz source-mysql-primary ein.

  1. Stellen Sie in der Cloud Console mit ssh eine Verbindung zur Instanz source-mysql-primary her.

  2. Erstellen Sie einen Nutzer mit dem Namen haproxy_check und berechtigen Sie den Nutzer, sich über die Instanz HAProxy anzumelden.

    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. Erstellen Sie einen Nutzer mit dem Namen HAProxy_root und berechtigen Sie den Nutzer, sich über die Instanz HAProxy anzumelden.

    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;"
    

    Der Nutzer haproxy_root wird benötigt, um über die Instanz HAProxy auf MySQL zugreifen zu können.

Verbindung zwischen der HAProxy-Instanz und der primären MySQL-Instanz testen

  1. Melden Sie sich in der Cloud Console über ssh bei der HAProxy-Maschine an.

  2. Testen Sie die Verbindung mit der Instanz source-mysql-primary.

    mysql -h source-mysql-primary -u haproxy_root -psolution-admin -e \
        "SHOW DATABASES"
    
  3. Testen Sie die Verbindung mit der Instanz target-mysql-primary.

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

HAProxy konfigurieren

Jetzt erstellen Sie die Konfigurationsdatei HAProxy und verweisen sie auf die Instanz source-mysql-primary.

  1. Melden Sie sich in der Cloud Console mit ssh bei der Instanz HAProxy an.

  2. Sichern Sie die vorhandene Konfigurationsdatei HAProxy in der Instanz HAProxy.

    sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bkp
    
  3. Konfigurieren Sie die Instanz HAProxy und erstellen Sie ein Passwort, das später in der Anleitung verwendet werden soll.

    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. Aktualisieren Sie den Dienst HAProxy.

    sudo service haproxy reload
    

Bereitstellung testen

  1. Stellen Sie in der Instanz HAProxy mit der Adresse "localhost" als Host eine Verbindung zur Instanz source-mysql-primary her.

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

    Die Ausgabe enthält die Namen der Datenbanken.

    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | source_db          |
    | sys                |
    +--------------------+
    
  2. Stellen Sie in der Cloud Console mit ssh eine Verbindung zur Instanz mysql-client her.

  3. Testen Sie mit der Instanz HAProxy die Verbindung zu Instanz source-mysql-primary.

    mysql -h haproxy  -u haproxy_root -psolution-admin -e "SHOW DATABASES"
    
  4. Suchen Sie in Cloud Shell nach der öffentlichen IP-Adresse der Instanz HAProxy.

    gcloud compute instances describe haproxy \
        --format='value(networkInterfaces[0].accessConfigs[0].natIP)' \
        --zone=us-central1-c
    
  5. Kopieren Sie die externe IP-Adresse der Instanz HAProxy.

  6. Zum Prüfen des Verbindungsstatus zwischen der Instanz HAProxy und der Instanz source-mysql-master rufen Sie die folgende URL auf und prüfen Sie, ob die Zeile der primären Zielinstanz grün ist.

    http://[PUBLIC_IP_OF_HAPROXY]/haproxy
    

    Wobei:

    • [PUBLIC_IP_OF_HAPROXY] für die öffentliche IP-Adresse Ihrer Instanz HAProxy steht.
  7. Geben Sie im Feld Nutzername mysqlproxy ein.

  8. Geben Sie im Feld Passwort MySQLProxy12! ein.

Den MySQL-Server umschalten

In diesem Abschnitt führen Sie die eigentliche Migration durch. Sie sorgen dafür, dass alle Instanzen synchron sind, verweisen den HAProxy-Dienst auf die Zielbereitstellung und testen die Umgebung.

Den HAProxy-Dienst beenden

  1. Stellen Sie eine Verbindung zur Instanz HAProxy her.

  2. Beenden Sie alle Verbindungen zur Instanz source-mysql-primary, damit das Ziel sicher mit der Quelle übereinstimmt.

    sudo service haproxy stop
    

Tabellen in der primären Instanz sperren

  1. Stellen Sie eine Verbindung zur Instanz source-mysql-primary her.

  2. Sperren Sie die Tabellen für Schreibvorgänge.

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

Synchronisierung der Quellinstanzen sicherstellen

In diesem Abschnitt prüfen Sie, ob die Instanzen source-mysql-primary und source-mysql-replica synchron sind.

  1. Melden Sie sich in der Cloud Console mit ssh bei der Instanz source-mysql-replica an.

  2. Prüfen Sie den Status des Replikats.

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

    Die Instanzen sind synchron, wenn der Wert für Seconds_Behing_Master bei 0 liegt.

Synchronisierung der Quell- und Zielinstanzen sicherstellen

In diesem Abschnitt prüfen Sie, ob die Instanzen source-mysql-replica und target-mysql-primary synchron sind.

  1. Melden Sie sich in der Cloud Console mit ssh bei der Instanz target-mysql-primary an.

  2. Prüfen Sie den Status des Replikats.

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

    Die Instanzen sind synchron, wenn der Wert für Seconds_Behind_Master bei 0 liegt.

  3. Beenden Sie die Replikation der Instanz source-mysql-replica.

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

Die HAProxy-Konfiguration auf die Instanz "target-mysql-primary" verweisen

  1. Melden Sie sich in der Cloud Console mit ssh bei der Instanz HAProxy an.

  2. Ändern Sie die Konfiguration HAProxy, sodass sie auf die Instanz target-mysql-primary verweist.

    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. Aktualisieren Sie den Dienst.

    sudo service haproxy restart
    
  4. Zum Prüfen des Verbindungsstatus zwischen der HAProxy-Instanz und der target-mysql-primary-Instanz rufen Sie die folgende URL auf und prüfen, ob die Zeile der primären Zielinstanz grün ist.

    http://[PUBLIC_IP_OF_HAPROXY]/haproxy
    

    Wobei:

    • [PUBLIC_IP_OF_HAPROXY] für die öffentliche IP-Adresse Ihrer Instanz HAProxy steht.
  5. Geben Sie im Feld Nutzername mysqlproxy ein.

  6. Geben Sie im Feld Passwort MySQLProxy12! ein.

  7. Melden Sie sich in der Cloud Console mit ssh bei der Instanz mysql-client an.

  8. Testen Sie die neue Konfiguration.

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

    Die Ausgabe enthält die Namen der Datenbanken.

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

Hinweise zur Migration eines Produktionsclusters

In dieser Anleitung haben Sie einen MySQL-Cluster in eine andere MySQL-Instanz migriert. Obwohl der Quellcluster in Google Cloud bereitgestellt wird, soll er einen lokalen Cluster oder eine andere Cloud Plattform simulieren. Bei der Migration einer Arbeitslast sollten Sie dies beachten:

  • Verbindung einrichten: Unabhängig davon, ob Sie von einer lokalen Bereitstellung oder einer öffentlichen Cloud migrieren, müssen Sie Verbindungskanäle zwischen Ihrer Umgebung und Google Cloud einrichten. Dazu können Sie ein VPN oder Cloud Interconnect verwenden.
  • Netzwerkleistung: Wie groß ist die Latenz zwischen der Quellumgebung und der Zielumgebung? Welche Bandbreite steht zur Verfügung? Diese Faktoren haben erhebliche Auswirkungen auf die Synchronisierungsgeschwindigkeit und können die Verbindung zwischen den Clients und dem HAProxy-Cluster beeinträchtigen.
  • Feinabstimmung der Datenbankparameter: In dieser Anleitung werden nur einige Replikationsparameter behandelt. Ihre Datenbankadministratoren haben den MySQL-Quellcluster möglicherweise mit verschiedenen benutzerdefinierten Parametern konfiguriert, um die Leistung und Konfiguration entsprechend den Anforderungen Ihrer Umgebung und App anzupassen. Sie müssen möglicherweise die Konfigurationen des Zielclusters anpassen.
  • Die Abfragen, die Sie für Ihren MySQL-Cluster ausführen: Führen Sie lange Abfragen aus? Werden pro Sekunde viele oder wenige Abfragen durchgeführt? Ihre Antworten können sich auf die Konfiguration der Instanz HAProxy auswirken. Es könnte beispielsweise sein, dass Sie die Zeitlimits anpassen müssen.
  • Zielbereitstellung: In dieser Anleitung haben Sie keine Replikatinstanz für die Zielbereitstellung eingerichtet. In einer Produktionsumgebung richten Sie einen Cluster für die Zielbereitstellung ein.
  • Instanzen Haproxy und Deployments: Sie haben für diese Anleitung eine Instanz HAProxy verwendet. Für die Migration einer Produktionsarbeitslast können Sie ein redundantes HAProxy-Deployment verwenden.
  • Zonenauswahl: In dieser Anleitung wird die Zone us-central1-c verwendet. Sie können jedoch jede Zone für Ihre Produktionsarbeitslasten verwenden. Weitere Informationen zum Auswählen einer Region finden Sie unter Best Practices für die Auswahl der Region in Compute Engine.
  • Festplattengröße: Achten Sie darauf, dass die Größe der Festplatte der Größe der Festplatte der MySQL-Quellinstanzen entspricht.
  • Berechtigungen und Zugriff: Sie haben in dieser Anleitung den Root-Nutzer verwendet. Wenn Sie die Befehle sudo oder root nicht ausführen können, müssen Sie bei einer Produktionsmigration möglicherweise einen anderen Nutzer verwenden.

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Projekt löschen

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Nächste Schritte