sql >> Database teknologi >  >> RDS >> MariaDB

Databasebelastningsbalancering med ProxySQL &AWS Aurora

ProxySQL er en gennemprøvet løsning, der hjælper databaseadministratorer med at håndtere kravene til høj tilgængelighed af deres databaser. Fordi det er SQL-bevidst, kan det også bruges til at forme trafikken på vej mod databaser - du kan dirigere forespørgsler til de bestemte noder, du kan omskrive forespørgsler, hvis det skulle være nødvendigt, du kan også drosle trafikken, implementere SQL firewall, oprette et spejl af din trafik og send den til en separat værtsgruppe.

ProxySQL 2.0.5 understøtter indbygget Galera Cluster, MySQL Replication og MySQL Group Replication. Desværre understøtter den ikke som standard AWS Aurora; men der er stadig en løsning, du kan bruge.

Du spørger måske dig selv, hvorfor skulle jeg besvære mig med ProxySQL, når AWS giver mig et endepunkt, som vil lave læse-skriveopdelingen for mig? Det er faktisk tilfældet, men det er bare r/w opdelingen. ProxySQL giver dig på den anden side mulighed for ikke kun at adskille læsninger fra skrivninger, men også at tage kontrol over din databasetrafik. ProxySQL kan ofte redde dine databaser fra at blive overbelastet ved blot at omskrive en enkelt forespørgsel.

ProxySQL 2.0.5 og AWS Aurora

Hvis du beslutter dig for at give ProxySQL en chance, er der et par trin, du skal tage. Først skal du bruge en EC2-instans til at installere ProxySQL på. Når du har instansen oppe at køre, kan du installere den nyeste ProxySQL. Vi vil anbefale at bruge repository til det. Du kan konfigurere det ved at følge trinene på dokumentationssiden:https://github.com/sysown/proxysql/wiki. Til Ubuntu 16.04 LTS, som vi brugte, skal du køre:

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

Så er det tid til at installere ProxySQL:

apt-get update

apt-get install proxysql

Så skal vi bekræfte, at vi har forbindelsen fra vores ProxySQL-instans til AWS Aurora-noder. Vi vil bruge direkte endepunkter til forbindelsen.

Vi kan nemt teste forbindelsen ved hjælp af telnet til det korrekte slutpunkt på port 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.

Den første ser godt ud. Vi fortsætter med den anden Aurora-knude:

[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.

Fungerer også godt. Hvis du ikke kan oprette forbindelse til Aurora-noder, skal du sikre dig, at alle sikkerhedsbits er justeret korrekt:tjek VPC-konfigurationen, se om ProxySQL-noden kan få adgang til Auroras VPC, tjek om sikkerhedsgrupper tillader trafikken at passere igennem. AWS netværkssikkerhedslag kan være vanskelig at konfigurere, hvis du ikke har erfaringen, men endelig burde du være i stand til at få det til at fungere.

Når forbindelsen er ordnet, bliver vi nødt til at oprette en bruger på Aurora. Vi vil bruge denne bruger til at overvåge Aurora noder i ProxySQL. Først skal vi muligvis installere MySQL-klienten på ProxySQL-noden:

[email protected]:~# apt install mysql-client-core-5.7

Så vil vi bruge klyngens slutpunkt til at oprette forbindelse til forfatteren og oprette bruger på den:

[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)

Når dette er gjort, kan vi logge ind på ProxySQL-admingrænsefladen (som standard på port 6032) for at definere monitorbrugeren og dens adgangskode.

[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 er det tid til at definere Aurora noder i ProxySQL:

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)

Som du kan se, bruger vi deres direkte endepunkter som værtsnavn. Når dette er gjort, vil vi bruge mysql_replication_hostgroup-tabel til at definere læser- og forfatterværtsgrupper. Vi bliver også nødt til at bestå den korrekte kontroltype - som standard søger ProxySQL efter 'read_only'-variablen, mens Aurora bruger 'innodb_read_only' til at skelne mellem forfatteren og læserne.

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)

Det er det, vi kan nu se, hvordan ProxySQL konfigurerede noderne i runtime-konfiguration:

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)

Som du kan se, er dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com forfatteren. Lad os prøve failover nu:

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)

Som du kan se, er writer (værtsgruppe 10) ændret til den anden node.

Konklusion

Dette er i bund og grund det - som du kan se, er opsætning af AWS Aurora-noder i ProxySQL en ret simpel proces.


  1. Sådan kopierer du store tabeldata til en anden tabel i SQL Server

  2. PostgreSQL:IKKE IN versus UNDTAGET ydelsesforskel (redigeret #2)

  3. Skinner 4 session.id lejlighedsvis nul

  4. Hvordan kan jeg undertrykke kolonneoverskriftsoutput for en enkelt SQL-sætning?