sql >> Databasteknik >  >> RDS >> MariaDB

Databasbelastningsbalansering med ProxySQL &AWS Aurora

ProxySQL är en beprövad lösning som hjälper databasadministratörer att hantera kraven på hög tillgänglighet för sina databaser. Eftersom det är SQL-medvetet kan det också användas för att forma trafiken på väg mot databaser - du kan dirigera frågor till de specifika noderna, du kan skriva om frågor om det skulle behövas, du kan också strypa trafiken, implementera SQL-brandvägg, skapa en spegel av din trafik och skicka den till en separat värdgrupp.

ProxySQL 2.0.5 stöder inbyggt Galera Cluster, MySQL-replikering och MySQL-gruppreplikering. Tyvärr stöder den inte, som standard, AWS Aurora; men det finns fortfarande en lösning som du kan använda.

Du kanske frågar dig själv, varför ska jag störa mig på ProxySQL när AWS förser mig med en slutpunkt som gör läs-skrivdelningen åt mig? Det är verkligen fallet men det är bara r/w-delningen. ProxySQL, å andra sidan, ger dig en möjlighet att inte bara separera läsning från skrivning utan också att ta kontroll över din databastrafik. ProxySQL kan ofta rädda dina databaser från att överbelastas genom att bara skriva om en enda fråga.

ProxySQL 2.0.5 och AWS Aurora

Om du bestämmer dig för att ge ProxySQL ett försök, finns det ett par steg du måste ta. Först behöver du en EC2-instans att installera ProxySQL på. När du har instansen igång kan du installera den senaste ProxySQL. Vi rekommenderar att du använder repository för det. Du kan ställa in det genom att följa stegen på dokumentationssidan:https://github.com/sysown/proxysql/wiki. För Ubuntu 16.04 LTS, som vi använde, måste du köra:

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

Då är det dags att installera ProxySQL:

apt-get update

apt-get install proxysql

Då måste vi verifiera att vi har anslutningen från vår ProxySQL-instans till AWS Aurora-noder. Vi kommer att använda direkta slutpunkter för anslutningen.

Vi kan enkelt testa anslutningen med telnet till rätt 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örsta ser bra ut. Vi fortsätter med den andra Aurora-noden:

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

Fungerar också utmärkt. Om du inte kan ansluta till Aurora-noder måste du se till att alla säkerhetsbitar är korrekt justerade:kontrollera VPC-konfigurationen, se om ProxySQL-noden kan komma åt Auroras VPC, kontrollera om säkerhetsgrupper tillåter trafiken att passera. AWS nätverkssäkerhetslager kan vara svårt att konfigurera om du inte har erfarenheten men till slut bör du kunna få det att fungera.

När anslutningen är klar måste vi skapa en användare på Aurora. Vi kommer att använda den användaren för att övervaka Aurora-noder i ProxySQL. Först kan vi behöva installera MySQL-klienten på ProxySQL-noden:

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

Då använder vi klustrets slutpunkt för att ansluta till skribenten och skapa användare 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 detta är gjort kan vi logga in på ProxySQL admin-gränssnitt (som standard på port 6032) för att definiera monitoranvändaren och dess lösenord.

[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 är det dags att definiera 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 använder vi deras direkta slutpunkter som värdnamn. När detta är gjort kommer vi att använda mysql_replication_hostgroup-tabellen för att definiera läsar- och skribentvärdgrupper. Vi måste också klara rätt kontrolltyp - som standard letar ProxySQL efter variabeln "read_only" medan Aurora använder "innodb_read_only" för att skilja mellan skribenten och läsarna.

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 här är det, vi kan nu se hur ProxySQL konfigurerade noderna 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 är dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com författaren. Låt oss prova 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 har writer (värdgrupp 10) ändrats till den andra noden.

Slutsats

Detta är i grunden det - som du kan se är det en ganska enkel process att ställa in AWS Aurora-noder i ProxySQL.


  1. Enkel parametrering och triviala planer — del 3

  2. Hur konverterar man tid till tidszonen för iPhone-enheten?

  3. Tabell anges två gånger, både som mål för 'UPPDATERING' och som en separat källa för data i mysql

  4. Hur man väljer den senaste uppsättningen daterade poster från en mysql-tabell