I vår tidigare blogg såg vi hur enkelt det är att komma igång med RDS för MySQL. Det är ett bekvämt sätt att distribuera och använda MySQL, utan att behöva oroa sig för driftskostnader. Avvägningen är dock minskad kontroll, eftersom användare är helt beroende av Amazons personal i händelse av dålig prestanda eller driftsavvikelser. Ingen tillgång till datakatalogen eller fysiska säkerhetskopior gör det svårt att flytta data från RDS. Detta kan vara ett stort problem om din databas växer ur RDS och du bestämmer dig för att migrera till en annan plattform. Den här tvådelade bloggen visar hur du gör en onlinemigrering från RDS till din egen MySQL-server.
Vi kommer att använda EC2 för att köra vår egen MySQL-server. Det kan vara ett första steg för mer komplexa migreringar till dina egna privata datacenter. EC2 ger dig tillgång till dina data så att xtrabackup kan användas. EC2 låter dig också ställa in SSH-tunnlar och det tar bort kravet på att konfigurera hårdvaru-VPN-anslutningar mellan din lokala infrastruktur och VPC.
Antaganden
Innan vi börjar måste vi göra ett par antaganden - speciellt kring säkerhet. Först och främst antar vi att RDS-instansen inte är tillgänglig utanför AWS. Vi förutsätter även att du har en ansökan i EC2. Detta innebär att antingen RDS-instansen och resten av din infrastruktur delar en VPC eller så finns åtkomst konfigurerad mellan dem, på ett eller annat sätt. Kortfattat antar vi att du kan skapa en ny EC2-instans och den kommer att ha åtkomst (eller den kan konfigureras för att ha åtkomst) till din MySQL RDS-instans.
Vi har konfigurerat ClusterControl på applikationsvärden. Vi kommer att använda den för att hantera vår EC2 MySQL-instans.
Initial installation
I vårt fall delar RDS-instansen samma VPC med vår "applikation" (EC2-instans med IP 172.30.4.228) och värd som kommer att vara ett mål för migreringsprocessen (EC2-instans med IP 172.30.4.238). Som applikation kommer vi att använda tpcc-MySQL benchmark som körs på följande sätt:
./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
Initial plan
Vi kommer att utföra en migrering med följande steg:
- Konfigurera vår målmiljö med ClusterControl - installera MySQL på 172.30.4.238
- Installera sedan ProxySQL, som vi kommer att använda för att hantera vår trafik vid tidpunkten för failover
- Dumpa data från RDS-instansen
- Ladda in data till vår målvärd
- Konfigurera replikering mellan RDS-instans och målvärd
- Byt trafik från RDS till målvärd
Förbered miljön med ClusterControl
Förutsatt att vi har ClusterControl installerat (om du inte gör det kan du hämta det från:https://severalnines.com/download-clustercontrol-database-management-system), måste vi ställa in vår målvärd. Vi kommer att använda distributionsguiden från ClusterControl för det:
Distribuera ett databaskluster i ClusterControl Distribuera ett databaskluster i ClusterControl Distribuera ett databaskluster i ClusterControlNär detta är gjort kommer du att se ett nytt kluster (i det här fallet, bara din enda server) i klusterlistan:
Databaskluster i ClusterControlNästa steg blir att installera ProxySQL - från ClusterControl 1.4 kan du enkelt göra det från användargränssnittet. Vi täckte denna process i detalj i det här blogginlägget. När vi installerade det valde vi vår applikationsvärd (172.30.4.228) som värd att installera ProxySQL på. När du installerar måste du också välja en värd att dirigera din trafik till. Eftersom vi bara har vår "destination"-värd i klustret kan du inkludera den, men sedan krävs ett par ändringar för att omdirigera trafik till RDS-instansen.
Om du har valt att inkludera destinationsvärd (i vårt fall var det 172.30.4.238) i ProxySQL-installationen, kommer du att se följande poster i tabellen 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 konfigurerade ProxySQL att använda värdgrupperna 10 och 20 för att dirigera skrivningar och läsningar till backend-servrarna. Vi måste ta bort den för närvarande konfigurerade värden från dessa värdgrupper och lägga till RDS-instansen där. Först måste vi dock se till att ProxySQL:s monitoranvändare kan komma åt RDS-instansen.
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)
Vi måste ge den här användaren åtkomst till RDS. Om vi behöver det för att spåra replikeringsfördröjning, måste användaren ha "REPLICATION CLIENT"-privilegiet. I vårt fall behövs det inte eftersom vi inte har slav-RDS-instans - 'USAGE' kommer att räcka.
[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)
Nu är det dags att konfigurera om ProxySQL. Vi kommer att lägga till RDS-instansen till både författare (10) och läsare (20) värdgrupper. Vi kommer också att ta bort 172.30.4.238 från dessa värdgrupper - vi kommer bara att redigera dem och lägga till 100 till varje värdgrupp.
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)
Det sista steget som krävs innan vi kan använda ProxySQL för att omdirigera vår trafik är att lägga till vår applikationsanvändare till 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)
Snabb notering - vi körde "SAVE MYSQL ANVÄNDARE TILL MINNET;" bara för att ha lösenordet hasha inte bara i RUNTIME utan också i arbetsminnesbufferten. Du kan hitta mer information om ProxySQL:s lösenordshashningsmekanism i deras dokumentation.
Vi kan nu omdirigera vår trafik till ProxySQL. Hur man gör det beror på din inställning, vi startade bara om tpcc och pekade på ProxySQL.
Omdirigera trafik med ProxySQLVid det här laget har vi byggt en målmiljö som vi kommer att migrera till. Vi förberedde också ProxySQL och konfigurerade den för vår applikation att använda. Vi har nu en bra grund för nästa steg, som är själva datamigreringen. I nästa inlägg kommer vi att visa dig hur du kopierar data från RDS till vår egen MySQL-instans (kör på EC2). Vi kommer också att visa dig hur du byter trafik till din egen instans medan applikationer fortsätter att betjäna användare, utan driftstopp.