Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL nel cloud - Migrazione online da Amazon RDS all'istanza EC2:prima parte

Nel nostro blog precedente, abbiamo visto quanto sia facile iniziare con RDS per MySQL. È un modo conveniente per implementare e utilizzare MySQL, senza preoccuparsi del sovraccarico operativo. Tuttavia, il compromesso è una riduzione del controllo, poiché gli utenti dipendono interamente dal personale Amazon in caso di scarse prestazioni o anomalie operative. Nessun accesso alla directory dei dati o ai backup fisici rende difficile lo spostamento dei dati fuori da RDS. Questo può essere un grosso problema se il tuo database supera RDS e decidi di migrare su un'altra piattaforma. Questo blog in due parti mostra come eseguire una migrazione online da RDS al tuo server MySQL.

Useremo EC2 per eseguire il nostro server MySQL. Può essere un primo passo per migrazioni più complesse ai tuoi data center privati. EC2 ti dà accesso ai tuoi dati in modo da poter utilizzare xtrabackup. EC2 ti consente anche di configurare tunnel SSH ed elimina la necessità di configurare connessioni VPN hardware tra l'infrastruttura locale e il VPC.

Ipotesi

Prima di iniziare, dobbiamo fare un paio di ipotesi, specialmente sulla sicurezza. Innanzitutto, assumiamo che l'istanza RDS non sia accessibile dall'esterno di AWS. Assumiamo anche che tu abbia un'applicazione in EC2. Ciò implica che l'istanza RDS e il resto dell'infrastruttura condividano un VPC o che sia configurato un accesso tra di loro, in un modo o nell'altro. In breve, supponiamo che tu possa creare una nuova istanza EC2 e che avrà accesso (o può essere configurata per avere l'accesso) alla tua istanza RDS MySQL.

Abbiamo configurato ClusterControl sull'host dell'applicazione. Lo useremo per gestire la nostra istanza MySQL EC2.

Configurazione iniziale

Nel nostro caso, l'istanza RDS condivide lo stesso VPC con la nostra "applicazione" (istanza EC2 con IP 172.30.4.228) e host che sarà una destinazione per il processo di migrazione (istanza EC2 con IP 172.30.4.238). Come applicazione utilizzeremo il benchmark tpcc-MySQL eseguito nel modo seguente:

./tpcc_start -h rds2.cvsw8xpajw2b.us-east-1.rds.amazonaws.com -d tpcc1000 -u tpcc -p tpccpass -w 20 -r 60 -l 600 -i 10 -c 4

Piano iniziale

Eseguiremo una migrazione utilizzando i seguenti passaggi:

  1. Imposta il nostro ambiente di destinazione utilizzando ClusterControl:installa MySQL su 172.30.4.238
  2. Quindi, installa ProxySQL, che useremo per gestire il nostro traffico al momento del failover
  3. Scarica i dati dall'istanza RDS
  4. Carica i dati nel nostro host di destinazione
  5. Configura la replica tra l'istanza RDS e l'host di destinazione
  6. Sposta il traffico da RDS all'host di destinazione

Prepara l'ambiente utilizzando ClusterControl

Supponendo che ClusterControl sia installato (in caso contrario puoi prenderlo da:https://diversealnines.com/download-clustercontrol-database-management-system), dobbiamo configurare il nostro host di destinazione. Utilizzeremo la procedura guidata di distribuzione di ClusterControl per questo:

Distribuzione di un cluster di database in ClusterControl Distribuzione di un cluster di database in ClusterControl Distribuzione di un cluster di database in ClusterControl

Una volta fatto, vedrai un nuovo cluster (in questo caso, solo il tuo singolo server) nell'elenco dei cluster:

Cluster di database in ClusterControl

Il prossimo passo sarà installare ProxySQL:a partire da ClusterControl 1.4 puoi farlo facilmente dall'interfaccia utente. Abbiamo trattato questo processo in dettaglio in questo post del blog. Durante l'installazione, abbiamo scelto il nostro host dell'applicazione (172.30.4.228) come host su cui installare ProxySQL. Durante l'installazione, devi anche scegliere un host a cui indirizzare il tuo traffico. Poiché abbiamo solo il nostro host di "destinazione" nel cluster, puoi includerlo, ma sono necessarie un paio di modifiche per reindirizzare il traffico all'istanza RDS.

Se hai scelto di includere l'host di destinazione (nel nostro caso era 172.30.4.238) nella configurazione di ProxySQL, vedrai le seguenti voci nella tabella mysql_servers:

mysql> select * from mysql_servers\G
*************************** 1. row ***************************
       hostgroup_id: 20
           hostname: 172.30.4.238
               port: 3306
             status: ONLINE
             weight: 1
        compression: 0
    max_connections: 100
max_replication_lag: 10
            use_ssl: 0
     max_latency_ms: 0
            comment: read server
*************************** 2. row ***************************
       hostgroup_id: 10
           hostname: 172.30.4.238
               port: 3306
             status: ONLINE
             weight: 1
        compression: 0
    max_connections: 100
max_replication_lag: 10
            use_ssl: 0
     max_latency_ms: 0
            comment: read and write server
2 rows in set (0.00 sec)

ClusterControl ha configurato ProxySQL per utilizzare i gruppi host 10 e 20 per instradare scritture e letture ai server back-end. Dovremo rimuovere l'host attualmente configurato da quei gruppi host e aggiungere l'istanza RDS lì. Innanzitutto, però, dobbiamo assicurarci che l'utente monitor di ProxySQL possa accedere all'istanza RDS.

mysql> SHOW VARIABLES LIKE 'mysql-monitor_username';
+------------------------+------------------+
| Variable_name          | Value            |
+------------------------+------------------+
| mysql-monitor_username | proxysql-monitor |
+------------------------+------------------+
1 row in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'mysql-monitor_password';
+------------------------+---------+
| Variable_name          | Value   |
+------------------------+---------+
| mysql-monitor_password | monpass |
+------------------------+---------+
1 row in set (0.00 sec)

Dobbiamo concedere a questo utente l'accesso a RDS. Se ne abbiamo bisogno per tenere traccia del ritardo di replica, l'utente dovrebbe disporre del privilegio "CLIENTE DI REPLICAZIONE". Nel nostro caso non è necessario in quanto non abbiamo un'istanza RDS slave - "USAGE" sarà sufficiente.

[email protected]:~# mysql -ppassword -h rds2.cvsw8xpajw2b.us-east-1.rds.amazonaws.com
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 210
Server version: 5.7.16-log MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> CREATE USER 'proxysql-monitor'@172.30.4.228 IDENTIFIED BY 'monpass';
Query OK, 0 rows affected (0.06 sec)

Ora è il momento di riconfigurare ProxySQL. Aggiungeremo l'istanza RDS a entrambi i gruppi host di scrittore (10) e lettore (20). Rimuoveremo anche 172.30.4.238 da quei gruppi host:li modificheremo e ne aggiungeremo 100 a ciascun gruppo host.

mysql> INSERT INTO mysql_servers (hostgroup_id, hostname, max_connections, max_replication_lag) VALUES (10, 'rds2.cvsw8xpajw2b.us-east-1.rds.amazonaws.com', 100, 10);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO mysql_servers (hostgroup_id, hostname, max_connections, max_replication_lag) VALUES (20, 'rds2.cvsw8xpajw2b.us-east-1.rds.amazonaws.com', 100, 10);
Query OK, 1 row affected (0.00 sec)
mysql> UPDATE mysql_servers SET hostgroup_id=110 WHERE hostname='172.30.4.238' AND hostgroup_id=10;
Query OK, 1 row affected (0.00 sec)
mysql> UPDATE mysql_servers SET hostgroup_id=120 WHERE hostname='172.30.4.238' AND hostgroup_id=20;
Query OK, 1 row affected (0.00 sec)
mysql> LOAD MYSQL SERVERS TO RUNTIME;
Query OK, 0 rows affected (0.01 sec)
mysql> SAVE MYSQL SERVERS TO DISK;
Query OK, 0 rows affected (0.07 sec)

L'ultimo passaggio necessario prima di poter utilizzare ProxySQL per reindirizzare il nostro traffico è aggiungere l'utente dell'applicazione a ProxySQL.

mysql> INSERT INTO mysql_users (username, password, active, default_hostgroup) VALUES ('tpcc', 'tpccpass', 1, 10);
Query OK, 1 row affected (0.00 sec)
mysql> LOAD MYSQL USERS TO RUNTIME; SAVE MYSQL USERS TO DISK; SAVE MYSQL USERS TO MEMORY;
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.05 sec)

Query OK, 0 rows affected (0.00 sec)
mysql> SELECT username, password FROM mysql_users WHERE username='tpcc';
+----------+-------------------------------------------+
| username | password                                  |
+----------+-------------------------------------------+
| tpcc     | *8C446904FFE784865DF49B29DABEF3B2A6D232FC |
+----------+-------------------------------------------+
1 row in set (0.00 sec)

Nota rapida:abbiamo eseguito "SALVA UTENTI MYSQL IN MEMORIA;" solo per avere la password hash non solo in RUNTIME ma anche nel buffer di memoria di lavoro. Puoi trovare maggiori dettagli sul meccanismo di hashing delle password di ProxySQL nella loro documentazione.

Ora possiamo reindirizzare il nostro traffico a ProxySQL. Come farlo dipende dalla tua configurazione, abbiamo appena riavviato tpcc e lo abbiamo indirizzato a ProxySQL.

Reindirizzamento del traffico con ProxySQL

A questo punto, abbiamo costruito un ambiente di destinazione in cui migrare. Abbiamo anche preparato ProxySQL e lo abbiamo configurato per l'uso con la nostra applicazione. Ora abbiamo una buona base per il passaggio successivo, che è l'effettiva migrazione dei dati. Nel prossimo post, ti mostreremo come copiare i dati da RDS nella nostra istanza MySQL (in esecuzione su EC2). Ti mostreremo anche come trasferire il traffico alla tua istanza mentre le applicazioni continuano a servire gli utenti, senza tempi di inattività.