ProxySQL ist eine bewährte Lösung, die Datenbankadministratoren dabei unterstützt, die Anforderungen an eine hohe Verfügbarkeit ihrer Datenbanken zu erfüllen. Da es SQL-fähig ist, kann es auch zur Gestaltung des Datenverkehrs in Richtung Datenbanken verwendet werden – Sie können Abfragen an die jeweiligen Knoten weiterleiten, Sie können Abfragen umschreiben, falls dies erforderlich sein sollte, Sie können auch den Datenverkehr drosseln, eine SQL-Firewall implementieren und erstellen ein Spiegel Ihres Datenverkehrs und senden Sie ihn an eine separate Hostgruppe.
ProxySQL 2.0.5 unterstützt nativ Galera-Cluster, MySQL-Replikation und MySQL-Gruppenreplikation. Leider wird AWS Aurora standardmäßig nicht unterstützt; aber es gibt immer noch eine Problemumgehung, die Sie verwenden können.
Sie fragen sich vielleicht, warum sollte ich mich mit ProxySQL beschäftigen, wenn AWS mir einen Endpunkt bereitstellt, der die Lese-Schreib-Aufteilung für mich übernimmt? Das ist tatsächlich der Fall, aber es ist nur die R/W-Aufteilung. ProxySQL hingegen bietet Ihnen die Möglichkeit, nicht nur Lese- und Schreibvorgänge zu trennen, sondern auch die Kontrolle über Ihren Datenbankverkehr zu übernehmen. ProxySQL kann Ihre Datenbanken oft vor Überlastung bewahren, indem es nur eine einzige Abfrage umschreibt.
ProxySQL 2.0.5 und AWS Aurora
Sollten Sie sich entscheiden, ProxySQL auszuprobieren, müssen Sie einige Schritte unternehmen. Zunächst benötigen Sie eine EC2-Instanz, auf der Sie ProxySQL installieren können. Sobald Sie die Instanz eingerichtet und ausgeführt haben, können Sie das neueste ProxySQL installieren. Wir würden empfehlen, dafür das Repository zu verwenden. Sie können es einrichten, indem Sie die Schritte auf der Dokumentationsseite befolgen:https://github.com/sysown/proxysql/wiki. Für Ubuntu 16.04 LTS, das wir verwendet haben, müssen Sie Folgendes ausführen:
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
Dann ist es an der Zeit, ProxySQL zu installieren:
apt-get update
apt-get install proxysql
Dann müssen wir überprüfen, ob wir die Konnektivität von unserer ProxySQL-Instanz zu den AWS Aurora-Knoten haben. Wir werden direkte Endpunkte für die Konnektivität verwenden.
Wir können die Verbindung einfach mit Telnet zum richtigen Endpunkt auf Port 3306 testen :
[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.
Das erste sieht gut aus. Wir fahren mit dem zweiten Aurora-Knoten fort:
[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.
Funktioniert auch super. Wenn Sie keine Verbindung zu Aurora-Knoten herstellen können, müssen Sie sicherstellen, dass alle Sicherheitsbits richtig ausgerichtet sind:Überprüfen Sie die VPC-Konfiguration, prüfen Sie, ob der ProxySQL-Knoten auf die VPC von Aurora zugreifen kann, prüfen Sie, ob Sicherheitsgruppen den Datenverkehr zulassen. AWS-Netzwerksicherheitsebene kann schwierig zu konfigurieren sein, wenn Sie nicht über die erforderliche Erfahrung verfügen, aber schließlich sollten Sie in der Lage sein, es zum Laufen zu bringen.
Nachdem die Konnektivität geklärt ist, müssen wir einen Nutzer auf Aurora erstellen. Wir werden diesen Benutzer zum Überwachen von Aurora-Knoten in ProxySQL verwenden. Zuerst müssen wir möglicherweise den MySQL-Client auf dem ProxySQL-Knoten installieren:
[email protected]:~# apt install mysql-client-core-5.7
Dann verwenden wir den Endpunkt des Clusters, um eine Verbindung zum Writer herzustellen und darauf einen Benutzer zu erstellen:
[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)
Danach können wir uns bei der ProxySQL-Verwaltungsschnittstelle (standardmäßig auf Port 6032) anmelden, um den Monitor-Benutzer und sein Passwort zu definieren.
[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)
Jetzt ist es an der Zeit, Aurora-Knoten in ProxySQL zu definieren:
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)
Wie Sie sehen können, verwenden wir ihre direkten Endpunkte als Hostnamen. Sobald dies erledigt ist, werden wir die Tabelle mysql_replication_hostgroup verwenden, um Reader- und Writer-Hostgruppen zu definieren. Wir müssen auch den richtigen Prüftyp bestehen – standardmäßig sucht ProxySQL nach der Variable „read_only“, während Aurora „innodb_read_only“ verwendet, um zwischen Writer und Reader zu unterscheiden.
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)
Das ist es, wir können jetzt sehen, wie ProxySQL die Knoten in der Laufzeitkonfiguration konfiguriert hat:
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)
Wie Sie sehen können, ist dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com der Autor. Versuchen wir jetzt das Failover:
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)
Wie Sie sehen können, ist Writer (Hostgruppe 10) auf den zweiten Knoten gewechselt.
Schlussfolgerung
Das ist es im Grunde – wie Sie sehen können, ist das Einrichten von AWS Aurora-Knoten in ProxySQL ein ziemlich einfacher Vorgang.