В предишния ни блог видяхме колко лесно е да започнете с RDS за MySQL. Това е удобен начин за внедряване и използване на MySQL, без да се притеснявате за оперативни разходи. Компромисът обаче е намален контрол, тъй като потребителите разчитат изцяло на персонала на Amazon в случай на лоша производителност или оперативни аномалии. Липсата на достъп до директорията с данни или физическите архиви затруднява преместването на данни извън RDS. Това може да бъде сериозен проблем, ако вашата база данни надрасне RDS и решите да мигрирате към друга платформа. Този блог от две части ви показва как да направите онлайн миграция от RDS към вашия собствен MySQL сървър.
Ще използваме EC2, за да стартираме собствен MySQL сървър. Това може да бъде първа стъпка за по-сложни миграции към вашите собствени частни центрове за данни. EC2 ви дава достъп до вашите данни, за да може да се използва xtrabackup. EC2 също ви позволява да настроите SSH тунели и премахва изискването за настройка на хардуерни VPN връзки между вашата локална инфраструктура и VPC.
Предположения
Преди да започнем, трябва да направим няколко предположения - особено по отношение на сигурността. На първо място, ние приемаме, че RDS екземпляр не е достъпен извън AWS. Предполагаме също, че имате приложение в EC2. Това означава, че RDS екземплярът и останалата част от вашата инфраструктура споделят VPC или има конфигуриран достъп между тях, по един или друг начин. Накратко, предполагаме, че можете да създадете нов EC2 екземпляр и той ще има достъп (или може да бъде конфигуриран да има достъп) до вашия MySQL RDS екземпляр.
Конфигурирахме ClusterControl на хоста на приложението. Ще го използваме за управление на нашия EC2 MySQL екземпляр.
Първоначална настройка
В нашия случай RDS екземплярът споделя същия VPC с нашето „приложение“ (EC2 екземпляр с IP 172.30.4.228) и хост, който ще бъде цел за процеса на миграция (EC2 екземпляр с IP 172.30.4.238). Като приложение ще използваме tpcc-MySQL бенчмарк, изпълнен по следния начин:
./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
Начален план
Ще извършим миграция, като използваме следните стъпки:
- Настройте нашата целева среда с помощта на ClusterControl – инсталирайте MySQL на 172.30.4.238
- След това инсталирайте ProxySQL, който ще използваме за управление на нашия трафик по време на отказ
- Изхвърлете данните от екземпляра на RDS
- Заредете данните в нашия целеви хост
- Настройте репликация между RDS екземпляр и целеви хост
- Превключване на трафика от RDS към целеви хост
Подгответе среда с помощта на ClusterControl
Ако приемем, че имаме инсталиран ClusterControl (ако не го направите, можете да го вземете от:https://severalnines.com/download-clustercontrol-database-management-system), трябва да настроим нашия целеви хост. Ще използваме съветника за внедряване от ClusterControl за това:
Разгръщане на клъстер от база данни в ClusterControl Разгръщане на клъстер от база данни в ClusterControl Разгръщане на клъстер от база данни в ClusterControlСлед като това е направено, ще видите нов клъстер (в този случай само един единствен сървър) в списъка с клъстери:
Клъстер от база данни в ClusterControlСледващата стъпка ще бъде да инсталирате ProxySQL - започвайки от ClusterControl 1.4, можете да го направите лесно от потребителския интерфейс. Ние разгледахме този процес подробно в тази публикация в блога. Когато го инсталирахме, избрахме нашия хост на приложението (172.30.4.228) като хост, на който да инсталираме ProxySQL. Когато инсталирате, вие също трябва да изберете хост, към който да насочите трафика си. Тъй като имаме само нашия „целеви“ хост в клъстера, можете да го включите, но тогава са необходими няколко промени, за да пренасочите трафика към RDS екземпляра.
Ако сте избрали да включите дестинационен хост (в нашия случай това беше 172.30.4.238) в настройката на ProxySQL, ще видите следните записи в таблицата 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 конфигурира ProxySQL да използва хостгрупи 10 и 20 за насочване на запис и четене към задните сървъри. Ще трябва да премахнем текущо конфигурирания хост от тези хост групи и да добавим RDS екземпляр там. Първо обаче трябва да се уверим, че потребителят на монитора на ProxySQL има достъп до 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)
Трябва да предоставим на този потребител достъп до RDS. Ако имаме нужда от него, за да проследяваме забавянето на репликацията, потребителят ще трябва да има привилегия „КЛИЕНТ НА РЕПЛИКАЦИЯ“. В нашия случай не е необходимо, тъй като нямаме подчинен RDS екземпляр - „USAGE“ ще бъде достатъчно.
[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)
Сега е време да преконфигурирате ProxySQL. Ще добавим RDS екземпляр към групите за записване (10) и читател (20). Също така ще премахнем 172.30.4.238 от тези хостгрупи – просто ще ги редактираме и ще добавим 100 към всяка хост група.
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)
Последната стъпка, която се изисква, преди да можем да използваме ProxySQL за пренасочване на нашия трафик, е да добавим потребител на нашето приложение към 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)
Бърза забележка - изпълнихме „ЗАПАЗВАНЕ НА ПОТРЕБИТЕЛИТЕ НА MYSQL В ПАМЕТ;“ само за да има хеширана парола не само в RUNTIME, но и в буфера на работната памет. Можете да намерите повече подробности за механизма за хеширане на пароли на ProxySQL в тяхната документация.
Вече можем да пренасочим нашия трафик към ProxySQL. Как да го направите зависи от вашата настройка, току-що рестартирахме tpcc и го насочихме към ProxySQL.
Пренасочване на трафик с ProxySQLВ този момент сме изградили целева среда, към която ще мигрираме. Ние също така подготвихме ProxySQL и го конфигурирахме за използване от нашето приложение. Вече имаме добра основа за следващата стъпка, която е действителната миграция на данни. В следващата публикация ще ви покажем как да копирате данните от RDS в нашия собствен MySQL екземпляр (работи на EC2). Също така ще ви покажем как да превключите трафика към вашия собствен екземпляр, докато приложенията продължават да обслужват потребителите, без прекъсвания.