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

Bilanciamento del carico del database con ProxySQL e AWS Aurora

ProxySQL è una soluzione collaudata che aiuta gli amministratori di database a gestire i requisiti per un'elevata disponibilità dei loro database. Poiché è in grado di riconoscere SQL, può essere utilizzato anche per modellare il traffico diretto verso i database:puoi instradare le query a nodi particolari, puoi riscrivere le query se necessario, puoi anche limitare il traffico, implementare il firewall SQL, creare un mirror del tuo traffico e invialo a un gruppo host separato.

ProxySQL 2.0.5 supporta in modo nativo Galera Cluster, MySQL Replication e MySQL Group Replication. Sfortunatamente, per impostazione predefinita, non supporta AWS Aurora; ma c'è ancora una soluzione alternativa che puoi utilizzare.

Ti starai chiedendo, perché dovrei preoccuparmi di ProxySQL quando AWS mi fornisce un endpoint che eseguirà la divisione lettura-scrittura per me? Questo è davvero il caso, ma è solo la divisione r/w. ProxySQL, d'altra parte, ti dà l'opportunità non solo di separare le letture dalle scritture, ma anche di assumere il controllo del traffico del tuo database. ProxySQL spesso può salvare i tuoi database dal sovraccarico semplicemente riscrivendo una singola query.

ProxySQL 2.0.5 e AWS Aurora

Se decidessi di provare ProxySQL, ci sono un paio di passaggi che devi fare. Innanzitutto, avrai bisogno di un'istanza EC2 su cui installare ProxySQL. Una volta che l'istanza è attiva e funzionante, puoi installare l'ultimo ProxySQL. Consigliamo di utilizzare il repository per questo. Puoi configurarlo seguendo i passaggi nella pagina della documentazione:https://github.com/sysown/proxysql/wiki. Per Ubuntu 16.04 LTS, che abbiamo usato, devi eseguire:

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

Allora è il momento di installare ProxySQL:

apt-get update

apt-get install proxysql

Quindi dobbiamo verificare di avere la connettività dalla nostra istanza ProxySQL ai nodi AWS Aurora. Useremo endpoint diretti per la connettività.

Possiamo testare facilmente la connettività utilizzando telnet all'endpoint corretto sulla porta 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.

Il primo sembra buono. Procederemo con il secondo nodo 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.

Funziona anche alla grande. Se non riesci a connetterti ai nodi Aurora devi assicurarti che tutti i bit di sicurezza siano allineati correttamente:controlla la configurazione del VPC, verifica se il nodo ProxySQL può accedere al VPC di Aurora, controlla se i gruppi di sicurezza consentono il passaggio del traffico. Il livello di sicurezza della rete AWS può essere complicato da configurare se non hai l'esperienza, ma alla fine dovresti essere in grado di farlo funzionare.

Dopo aver risolto la connettività, dovremo creare un utente su Aurora. Useremo quell'utente per monitorare i nodi Aurora in ProxySQL. Innanzitutto, potremmo dover installare il client MySQL sul nodo ProxySQL:

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

Quindi utilizzeremo l'endpoint del cluster per connetterci allo scrittore e creare un utente su di esso:

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

Fatto ciò, possiamo accedere all'interfaccia di amministrazione di ProxySQL (di default sulla porta 6032) per definire l'utente del monitor e la sua password.

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

Ora è il momento di definire i nodi Aurora in 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)

Come puoi vedere, utilizziamo i loro endpoint diretti come nome host. Una volta fatto, utilizzeremo la tabella mysql_replication_hostgroup per definire i gruppi host di lettori e scrittori. Dovremo anche superare il tipo di controllo corretto:per impostazione predefinita, ProxySQL cerca la variabile "sola_lettura" mentre Aurora usa "solo_lettura_innodb" per distinguere tra scrittore e lettori.

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)

Ecco fatto, ora possiamo vedere come ProxySQL ha configurato i nodi nella configurazione di 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)

Come puoi vedere, dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com è l'autore. Proviamo ora il 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)

Come puoi vedere, lo scrittore (gruppo host 10) è passato al secondo nodo.

Conclusione

Fondamentalmente è tutto, come puoi vedere, la configurazione dei nodi AWS Aurora in ProxySQL è un processo praticamente semplice.