ProxySQL is een beproefde oplossing die databasebeheerders helpt bij het omgaan met de vereisten voor hoge beschikbaarheid van hun databases. Omdat het SQL-bewust is, kan het ook worden gebruikt om het verkeer richting databases vorm te geven - u kunt query's naar de specifieke knooppunten routeren, u kunt query's herschrijven als dat nodig is, u kunt ook het verkeer afremmen, SQL-firewall implementeren, een spiegel van uw verkeer en stuur het naar een aparte hostgroep.
ProxySQL 2.0.5 ondersteunt standaard Galera Cluster, MySQL-replicatie en MySQL Group-replicatie. Helaas ondersteunt het standaard AWS Aurora niet; maar er is nog steeds een oplossing die u kunt gebruiken.
Je vraagt je misschien af, waarom zou ik me bezighouden met ProxySQL als AWS me een eindpunt geeft dat de lees-schrijfsplitsing voor me doet? Dat is inderdaad het geval, maar het is slechts de r/w-splitsing. ProxySQL biedt u daarentegen de mogelijkheid om niet alleen lees- en schrijfbewerkingen te scheiden, maar ook om controle te krijgen over uw databaseverkeer. ProxySQL kan vaak voorkomen dat uw databases overbelast raken door slechts een enkele query te herschrijven.
ProxySQL 2.0.5 en AWS Aurora
Als je besluit om ProxySQL eens te proberen, dan zijn er een aantal stappen die je moet nemen. Ten eerste heb je een EC2-instantie nodig om de ProxySQL op te installeren. Zodra u de instantie in gebruik heeft, kunt u de nieuwste ProxySQL installeren. We raden aan om daarvoor de repository te gebruiken. U kunt het instellen door de stappen op de documentatiepagina te volgen:https://github.com/sysown/proxysql/wiki. Voor Ubuntu 16.04 LTS, die we gebruikten, moet je uitvoeren:
apt-get install -y lsb-release
wget -O - 'https://repo.proxysql.com/ProxySQL/repo_pub_key' | apt-key add -
echo deb https://repo.proxysql.com/ProxySQL/proxysql-2.0.x/$(lsb_release -sc)/ ./ \
| tee /etc/apt/sources.list.d/proxysql.list
Dan is het tijd om ProxySQL te installeren:
apt-get update
apt-get install proxysql
Vervolgens moeten we verifiëren dat we de verbinding hebben van onze ProxySQL-instantie naar AWS Aurora-knooppunten. We zullen directe eindpunten gebruiken voor de connectiviteit.
We kunnen de connectiviteit eenvoudig testen met telnet naar het juiste eindpunt op poort 3306 :
[email protected]:~# telnet dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com 3306
Trying 10.0.0.53...
Connected to dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com.
Escape character is '^]'.
J
5.7.12_2>ZWP-&[Ov8NzJ:H#Mmysql_native_password^CConnection closed by foreign host.
Eerste ziet er goed uit. We gaan verder met het tweede Aurora-knooppunt:
[email protected]:~# telnet dbtest-instance-1-eu-central-1a.cqb1vho43rod.eu-central-1.rds.amazonaws.com 3306
Trying 10.0.1.90...
Connected to dbtest-instance-1-eu-central-1a.cqb1vho43rod.eu-central-1.rds.amazonaws.com.
Escape character is '^]'.
J
tr3'3rynMmysql_native_password^CConnection closed by foreign host.
Werkt ook prima. Als u geen verbinding kunt maken met Aurora-knooppunten, moet u ervoor zorgen dat alle beveiligingsbits correct zijn uitgelijnd:controleer de VPC-configuratie, kijk of ProxySQL-knooppunt toegang heeft tot VPC van Aurora, controleer of beveiligingsgroepen het verkeer doorlaten. AWS-netwerkbeveiligingslaag kan lastig te configureren zijn als u niet over de ervaring beschikt, maar uiteindelijk zou u het moeten kunnen laten werken.
Als de connectiviteit is geregeld, moeten we een gebruiker maken op Aurora. We zullen die gebruiker gebruiken voor het bewaken van Aurora-knooppunten in ProxySQL. Eerst moeten we mogelijk de MySQL-client op het ProxySQL-knooppunt installeren:
[email protected]:~# apt install mysql-client-core-5.7
Vervolgens zullen we het eindpunt van het cluster gebruiken om verbinding te maken met de schrijver en er een gebruiker op te maken:
[email protected]:~# mysql -h dbtest.cluster-cqb1vho43rod.eu-central-1.rds.amazonaws.com -u root -ppassword
mysql> CREATE USER 'monuser'@'10.0.0.191' IDENTIFIED BY 'mon1t0r';
Query OK, 0 rows affected (0.02 sec)
mysql> GRANT REPLICATION CLIENT ON *.* TO 'monuser'@'10.0.0.191';
Query OK, 0 rows affected (0.00 sec)
Als dit gedaan is, kunnen we inloggen op de ProxySQL-beheerdersinterface (standaard op poort 6032) om de monitorgebruiker en zijn wachtwoord te definiëren.
[email protected]:~# mysql -P6032 -u admin -padmin -h127.0.0.1
mysql> SET mysql-monitor_username='monuser';
Query OK, 1 row affected (0.00 sec)
mysql> SET mysql-monitor_password='mon1t0r';
Query OK, 1 row affected (0.00 sec)
mysql> LOAD MYSQL VARIABLES TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)
mysql> SAVE MYSQL VARIABLES TO DISK;
Query OK, 116 rows affected (0.00 sec)
Nu is het tijd om Aurora-knooppunten in ProxySQL te definiëren:
mysql> INSERT INTO mysql_servers (hostgroup_id, hostname) VALUES (10, 'dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com'), (20, 'dbtest-instance-1-eu-central-1a.cqb1vho43rod.eu-central-1.rds.amazonaws.com');
Query OK, 2 rows affected (0.01 sec)
Zoals je kunt zien, gebruiken we hun directe eindpunten als hostnaam. Zodra dit is gebeurd, zullen we de tabel mysql_replication_hostgroup gebruiken om hostgroepen voor lezers en schrijvers te definiëren. We zullen ook het juiste controletype moeten doorstaan - standaard zoekt ProxySQL naar de variabele 'read_only', terwijl Aurora 'innodb_read_only' gebruikt om onderscheid te maken tussen de schrijver en de lezers.
mysql> SHOW CREATE TABLE mysql_replication_hostgroups\G
*************************** 1. row ***************************
table: mysql_replication_hostgroups
Create Table: CREATE TABLE mysql_replication_hostgroups (
writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY,
reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>=0),
check_type VARCHAR CHECK (LOWER(check_type) IN ('read_only','innodb_read_only','super_read_only')) NOT NULL DEFAULT 'read_only',
comment VARCHAR NOT NULL DEFAULT '', UNIQUE (reader_hostgroup))
1 row in set (0.00 sec)
mysql> INSERT INTO mysql_replication_hostgroups VALUES (10, 20, 'innodb_read_only', 'Aurora');
Query OK, 1 row affected (0.00 sec)
mysql> LOAD MYSQL SERVERS TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)
Dit is het, we kunnen nu zien hoe ProxySQL de nodes heeft geconfigureerd in runtime-configuratie:
mysql> SELECT hostgroup_id, hostname, port FROM runtime_mysql_servers;
+--------------+-----------------------------------------------------------------------------+------+
| hostgroup_id | hostname | port |
+--------------+-----------------------------------------------------------------------------+------+
| 10 | | 3306 |
| 20 | dbtest-instance-1-eu-central-1a.cqb1vho43rod.eu-central-1.rds.amazonaws.com | 3306 |
| 20 | dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com | 3306 |
+--------------+-----------------------------------------------------------------------------+------+
3 rows in set (0.00 sec)
Zoals je kunt zien, is dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com de schrijver. Laten we nu de failover proberen:
mysql> SELECT hostgroup_id, hostname, port FROM runtime_mysql_servers;
+--------------+-----------------------------------------------------------------------------+------+
| hostgroup_id | hostname | port |
+--------------+-----------------------------------------------------------------------------+------+
| 10 | dbtest-instance-1-eu-central-1a.cqb1vho43rod.eu-central-1.rds.amazonaws.com | 3306 |
| 20 | dbtest-instance-1-eu-central-1a.cqb1vho43rod.eu-central-1.rds.amazonaws.com | 3306 |
| 20 | dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com | 3306 |
+--------------+-----------------------------------------------------------------------------+------+
3 rows in set (0.00 sec)
Zoals je kunt zien, is de schrijver (hostgroep 10) veranderd naar het tweede knooppunt.
Conclusie
Dit is het eigenlijk - zoals je kunt zien is het opzetten van AWS Aurora-knooppunten in ProxySQL een vrij eenvoudig proces.