sql >> Databáze >  >> RDS >> MariaDB

Vyrovnávání zatížení databáze pomocí ProxySQL a AWS Aurora

ProxySQL je osvědčené řešení, které pomáhá správcům databází řešit požadavky na vysokou dostupnost jejich databází. Protože podporuje SQL, lze jej také použít pro tvarování provozu směřujícího k databázím - můžete směrovat dotazy do konkrétních uzlů, můžete přepisovat dotazy, pokud to bude potřeba, můžete také omezit provoz, implementovat SQL firewall, vytvořit zrcadlo vašeho provozu a pošlete jej do samostatné hostitelské skupiny.

ProxySQL 2.0.5 nativně podporuje Galera Cluster, MySQL Replication a MySQL Group Replication. Bohužel ve výchozím nastavení nepodporuje AWS Aurora; ale stále existuje řešení, které můžete použít.

Možná si říkáte, proč bych se měl obtěžovat s ProxySQL, když mi AWS poskytuje koncový bod, který za mě udělá rozdělení čtení a zápisu? To je skutečně případ, ale je to pouze rozdělení r/w. ProxySQL vám na druhé straně dává příležitost nejen oddělit čtení od zápisu, ale také převzít kontrolu nad provozem vaší databáze. ProxySQL často může zachránit vaše databáze před přetížením pouhým přepsáním jediného dotazu.

ProxySQL 2.0.5 a AWS Aurora

Pokud se rozhodnete vyzkoušet ProxySQL, musíte provést několik kroků. Nejprve budete potřebovat instanci EC2 k instalaci ProxySQL. Jakmile budete mít instanci spuštěnou a spuštěnou, můžete nainstalovat nejnovější ProxySQL. K tomu doporučujeme použít repozitář. Můžete jej nastavit podle kroků na stránce dokumentace:https://github.com/sysown/proxysql/wiki. Pro Ubuntu 16.04 LTS, který jsme použili, musíte spustit:

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

Pak je čas nainstalovat ProxySQL:

apt-get update

apt-get install proxysql

Potom musíme ověřit, že máme konektivitu z naší instance ProxySQL k uzlům AWS Aurora. Pro připojení použijeme přímé koncové body.

Můžeme snadno otestovat připojení pomocí telnetu ke správnému koncovému bodu na portu 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.

První vypadá dobře. Pokračujeme druhým uzlem Aurora:

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

Funguje také skvěle. Pokud se nemůžete připojit k uzlům Aurora, musíte se ujistit, že jsou všechny bezpečnostní bity správně zarovnány:zkontrolujte konfiguraci VPC, zjistěte, zda uzel ProxySQL může přistupovat k VPC Aurora, zkontrolujte, zda skupiny zabezpečení umožňují průchod provozu. Vrstva zabezpečení sítě AWS může být složitá na konfiguraci, pokud nemáte zkušenosti, ale nakonec byste měli být schopni ji zprovoznit.

Až bude připojení vyřešeno, budeme muset vytvořit uživatele na Auroře. Tohoto uživatele použijeme pro monitorování uzlů Aurora v ProxySQL. Nejprve možná budeme muset nainstalovat klienta MySQL na uzel ProxySQL:

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

Potom použijeme koncový bod clusteru k připojení k zapisovači a vytvoření uživatele na něm:

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

Jakmile to uděláme, můžeme se přihlásit do administrátorského rozhraní ProxySQL (ve výchozím nastavení na portu 6032) a definovat uživatele monitoru a jeho heslo.

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

Nyní je čas definovat uzly Aurora v 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)

Jak můžete vidět, jako název hostitele používáme jejich přímé koncové body. Jakmile to uděláme, použijeme tabulku mysql_replication_hostgroup k definování hostitelských skupin pro čtení a zápis. Budeme také muset projít správným typem kontroly – ve výchozím nastavení ProxySQL hledá proměnnou ‚read_only‘, zatímco Aurora používá ‚innodb_read_only‘ k rozlišení mezi zapisovatelem a čtenářem.

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)

To je ono, nyní můžeme vidět, jak ProxySQL nakonfigurovalo uzly v konfiguraci runtime:

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)

Jak vidíte, autorem je dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com. Zkusme nyní převzetí služeb při selhání:

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)

Jak můžete vidět, zapisovač (hostgroup 10) se změnil na druhý uzel.

Závěr

To je v podstatě vše - jak můžete vidět, nastavení uzlů AWS Aurora v ProxySQL je v podstatě jednoduchý proces.


  1. Jak nasadit databázi Chamilo MySQL pro vysokou dostupnost

  2. Spojení více tabulek vrátí hodnotu NULL

  3. Příklad klauzule Oracle Trigger WHEN

  4. Chyba při odstraňování databáze (Nelze rmdir '.test\', chyba:17)