ProxySQL é uma solução comprovada que ajuda os administradores de banco de dados a lidar com os requisitos de alta disponibilidade de seus bancos de dados. Por ser compatível com SQL, ele também pode ser usado para moldar o tráfego em direção aos bancos de dados - você pode rotear consultas para os nós específicos, pode reescrever consultas se necessário, também pode limitar o tráfego, implementar firewall SQL, criar um espelho do seu tráfego e enviá-lo para um hostgroup separado.
O ProxySQL 2.0.5 suporta nativamente Galera Cluster, MySQL Replication e MySQL Group Replication. Infelizmente, por padrão, ele não oferece suporte ao AWS Aurora; mas ainda há uma solução alternativa que você pode usar.
Você pode estar se perguntando, por que devo me preocupar com o ProxySQL quando a AWS me fornece um endpoint que fará a divisão de leitura e gravação para mim? Esse é realmente o caso, mas é apenas a divisão r/w. O ProxySQL, por outro lado, oferece a oportunidade não apenas de separar leituras de gravações, mas também de controlar o tráfego do banco de dados. O ProxySQL geralmente pode evitar que seus bancos de dados sejam sobrecarregados apenas reescrevendo uma única consulta.
ProxySQL 2.0.5 e AWS Aurora
Se você decidir experimentar o ProxySQL, há algumas etapas a serem seguidas. Primeiro, você precisará de uma instância do EC2 para instalar o ProxySQL. Depois de ter a instância em funcionamento, você pode instalar o ProxySQL mais recente. Recomendamos usar o repositório para isso. Você pode configurá-lo seguindo as etapas na página de documentação:https://github.com/sysown/proxysql/wiki. Para o Ubuntu 16.04 LTS, que usamos, você deve executar:
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
Então é hora de instalar o ProxySQL:
apt-get update
apt-get install proxysql
Em seguida, precisamos verificar se temos a conectividade de nossa instância ProxySQL para nós do AWS Aurora. Usaremos endpoints diretos para a conectividade.
Podemos testar facilmente a conectividade usando telnet para o endpoint correto na 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.
O primeiro parece bom. Continuaremos com o segundo nó do 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.
Funciona muito bem também. Se você não conseguir se conectar aos nós do Aurora, precisará garantir que todos os bits de segurança estejam alinhados corretamente:verifique a configuração da VPC, veja se o nó ProxySQL pode acessar a VPC do Aurora, verifique se os grupos de segurança permitem a passagem do tráfego. A camada de segurança de rede da AWS pode ser complicada de configurar se você não tiver experiência, mas finalmente poderá fazê-la funcionar.
Com a conectividade resolvida, precisaremos criar um usuário no Aurora. Usaremos esse usuário para monitorar os nós do Aurora no ProxySQL. Primeiro, podemos ter que instalar o cliente MySQL no nó ProxySQL:
[email protected]:~# apt install mysql-client-core-5.7
Em seguida, usaremos o endpoint do cluster para conectar ao gravador e criar um usuário nele:
[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)
Com isso feito, podemos fazer login na interface de administração do ProxySQL (por padrão na porta 6032) para definir o usuário do monitor e sua senha.
[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)
Agora é hora de definir os nós do Aurora no 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)
Como você pode ver, usamos seus endpoints diretos como o nome do host. Feito isso, usaremos a tabela mysql_replication_hostgroup para definir grupos de hosts de leitores e gravadores. Também teremos que passar o tipo de verificação correto - por padrão, o ProxySQL procura a variável 'read_only' enquanto o Aurora usa 'innodb_read_only' para diferenciar entre o gravador e os leitores.
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)
É isso, agora podemos ver como o ProxySQL configurou os nós na configuração de tempo de execução:
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)
Como você pode ver, dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com é o escritor. Vamos tentar o failover agora:
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)
Como você pode ver, o escritor (hostgroup 10) mudou para o segundo nó.
Conclusão
É basicamente isso - como você pode ver, configurar os nós do AWS Aurora no ProxySQL é um processo bastante simples.