ProxySQL: Balanceamento de Carga entre Múltiplos Bancos de Dados

10 min de leitura Banco de Dados
ProxySQL: Balanceamento de Carga entre Múltiplos Bancos de Dados

ProxySQL é um acelerador de banco de dados e proxy SQL de alta performance que atua como uma camada intermediária entre suas aplicações e seus servidores de banco de dados. Ele permite a implementação de técnicas avançadas de gerenciamento de tráfego, incluindo balanceamento de carga, failover automático, separação de leituras e escritas (read/write splitting) e cache de consultas. Neste tutorial, abordaremos a configuração prática do ProxySQL para distribuir a carga de trabalho entre múltiplos nós de banco de dados, focando em cenários comuns em ambientes de VPS e infraestrutura cloud.

A escolha do ProxySQL é estratégica quando se busca otimizar o desempenho de bancos como MySQL, MariaDB ou PostgreSQL. Diferente de soluções tradicionais que dependem de configurações complexas no lado do cliente, o ProxySQL centraliza a lógica de roteamento, permitindo que sua aplicação se conecte a um único endpoint enquanto o proxy gerencia a distribuição das queries. Isso é particularmente útil em ambientes escaláveis onde a latência e o throughput são críticos.

1. Arquitetura do Cenário Proposto

Para fins didáticos, configuraremos um ambiente distribuído em três instâncias de VPS (Virtual Private Server), simulando uma topologia realista de produção:

  • Servidor ProxySQL (192.168.1.10): Onde o serviço ProxySQL será instalado e configurado.
  • Mestre MySQL (192.168.1.20): Instância primária responsável por escritas e leituras.
  • Replica MySQL (192.168.1.30): Instância secundária que replica dados do mestre via binlog, dedicada a leituras para aliviar a carga do servidor principal.

Todos os servidores devem ter acesso de rede entre si e as portas correspondentes (geralmente 3306 para MySQL) liberadas nos firewalls. É fundamental garantir que o usuário utilizado pelo ProxySQL tenha permissões suficientes para monitorar o status dos backends e executar consultas.

2. Instalação do ProxySQL

A instalação varia conforme o sistema operacional da sua VPS. Abaixo, apresentamos os comandos para as distribuições Linux mais comuns. Certifique-se de executar os comandos com privilégios de root ou usando sudo.

Para sistemas baseados em Debian/Ubuntu:

apt-get update
apt-get install proxysql -y

Para sistemas baseados em RHEL/CentOS/Rocky Linux:

yum install proxysql -y
# ou dnf install proxysql -y para versões mais recentes

Após a instalação, o serviço do ProxySQL será iniciado automaticamente. A configuração inicial é feita através de sua interface interna SQL, que escuta na porta 6032 por padrão. Você pode acessar essa interface usando o cliente mysql (ou mariadb):

mysql -u admin -padmin -h 127.0.0.1 -P 6032

As credenciais padrão são usuário admin e senha admin. É uma prática de segurança recomendada alterar essas credenciais imediatamente após o login, mas para este tutorial, manteremos as padrão para simplificar os comandos.

3. Configurando os Backends (MySQL)

O primeiro passo é informar ao ProxySQL sobre os servidores de banco de dados que ele deverá gerenciar. Utilizamos a tabela mysql_servers no schema interno do ProxySQL para definir os hosts, suas portas e seus pesos.

Inserir o servidor Mestre (Host Group 10):

INSERT INTO mysql_servers(hostname, port, hostgroup, weight) VALUES ('192.168.1.20', 3306, '10', 1);

Inserir o servidor Replica (Host Group 20):

INSERT INTO mysql_servers(hostname, port, hostgroup, weight) VALUES ('192.168.1.30', 3306, '20', 1);

Aqui, definimos dois hostgroups: o grupo 10 para o mestre e o grupo 20 para a réplica. O parâmetro weight (peso) é crucial para o balanceamento de carga. Um peso maior significa que o servidor receberá mais conexões ou consultas. Se ambos tiverem peso 1, o ProxySQL distribuirá as requisições igualmente entre eles.

Após inserir os dados, é necessário salvá-los no disco e carregá-los para a memória em execução:

SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL SERVERS TO RUNTIME;

Você pode verificar se os servidores foram reconhecidos corretamente consultando a tabela runtime_mysql_servers:

SELECT * FROM runtime_mysql_servers;

4. Definindo Usuários e Senhas

O ProxySQL precisa saber como se conectar aos backends. Devemos configurar as credenciais de acesso no schema do ProxySQL, não diretamente nos bancos de dados individuais (embora os usuários existam lá).

INSERT INTO mysql_users(username, password, default_hostgroup) VALUES 'app_user', 'senha_forte_aqui', 10);

A flag default_hostgroup define para qual hostgroup as consultas serão enviadas se nenhuma regra de roteamento for aplicada. Neste caso, definimos o grupo 10 (Mestre) como padrão.

Não esqueça de persistir e carregar a configuração:

SAVE MYSQL USERS TO DISK;
LOAD MYSQL USERS TO RUNTIME;

5. Configurando o Roteamento (Read/Write Splitting)

Agora vem a parte central do balanceamento: decidir quais consultas vão para o mestre e quais vão para a réplica. O ProxySQL utiliza regras baseadas em expressões regulares SQL na tabela mysql_query_rules.

Por padrão, o ProxySQL tenta ser inteligente: ele envia consultas de leitura (SELECT) para servidores com status "ONLINE" no hostgroup de leituras. No entanto, para garantir a integridade dos dados em transações que envolvem escritas, devemos configurar regras explícitas.

Criar regra para forçar escritas ao Mestre (Hostgroup 10):

INSERT INTO mysql_query_rules(active, match_digest, destination_hostgroup, apply) VALUES (1, '^.*$', 10, 1);

Nesta regra:

  • active=1: A regra está habilitada.
  • match_digest='^.*$': Uma regex que corresponde a qualquer consulta SQL. No entanto, como as regras são avaliadas em ordem, esta regra atua como um "fallback" ou destino padrão para tudo que não for capturado por regras anteriores específicas.
  • destination_hostgroup=10: Envia para o mestre.
  • apply=1: Aplica a regra e interrompe a avaliação de outras regras subsequentes.

Para otimizar, é comum criar uma regra específica antes desta para redirecionar SELECTs simples para as réplicas. O ProxySQL possui um recurso nativo chamado read_only. Se configurarmos o hostgroup 20 como read-only, o ProxySQL automaticamente roteará SELECTs para lá, a menos que haja uma transação aberta.

Para ativar o roteamento automático de leituras, precisamos configurar o monitoramento e garantir que as réplicas estejam marcadas como disponíveis para leitura:

UPDATE mysql_servers SET hostgroup_id=20, status='ONLINE' WHERE hostname='192.168.1.30';
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL SERVERS TO RUNTIME;

O ProxySQL monitorará a latência e a disponibilidade dos servidores. Se uma réplica ficar offline, o proxy removerá automaticamente esse servidor do pool de balanceamento, garantindo alta disponibilidade.

6. Expondo o ProxySQL para Aplicações

Por padrão, o ProxySQL escuta na porta 6033 para conexões de clientes MySQL. Você pode alterar isso editando o arquivo de configuração /etc/proxysql.cnf, seção [mysql]:

mysql-threads=8
mysql-servers=100
mysql-iface=0.0.0.0
mysql-port=3306

Definir mysql-port=3306 permite que sua aplicação se conecte ao ProxySQL usando a porta padrão do MySQL, facilitando o gerenciamento de firewalls e configurações de DNS. Lembre-se de reiniciar o serviço após alterar o arquivo de configuração:

systemctl restart proxysql

Agora, suas aplicações devem apontar para o IP da VPS do ProxySQL (192.168.1.10) na porta 3306, usando as credenciais definidas no passo 4.

7. Tuning e Otimização de Performance

A configuração básica funciona, mas para um ambiente de produção robusto, é necessário ajustar parâmetros internos do ProxySQL para lidar com altas cargas de concorrência.

Threads de Leitura/Gravação:

O número de threads que o ProxySQL usa para processar consultas afeta diretamente o throughput. Em VPS com múltiplos núcleos, aumentar esse valor pode melhorar significativamente a performance.

SET mysql-threads=16;

Pool de Conexões:

O ProxySQL mantém um pool de conexões ativas com os backends para evitar o overhead de estabelecer novas conexões TCP para cada query. Ajuste o tamanho do pool conforme a memória disponível e o número máximo de conexões permitidas pelo seu banco de dados (ex: max_connections no MySQL).

SET mysql-mysql_max_connections=200;

Monitoramento:

Verifique as métricas de performance em tempo real consultando a tabela stats_mysql_connection_pool:

SELECT hostgroup, srv_host, port, status, ConnUsed, ConnFree, ConnOK, ConnERR FROM stats_mysql_connection_pool;

Observe os campos ConnUsed (conexões em uso) e ConnFree (conexões ociosas no pool). Se ConnOK estiver baixo ou ConnERR alto, há problemas de conectividade com os backends.

8. Testando o Balanceamento

Para validar se o balanceamento está funcionando corretamente, execute uma série de consultas SELECT e verifique em qual servidor elas estão sendo executadas. Você pode usar a função SLEEP() para simular latência ou apenas contar o número de registros retornados.

No cliente MySQL conectado ao ProxySQL:

SELECT @@hostname, @@port;

Execute este comando várias vezes. Em uma configuração ideal com duas réplicas e peso igual, você deve ver alternância entre os hostnames das VPSs 192.168.1.20 e 192.168.1.30 para consultas de leitura.

Para testar o failover, desligue o servidor mestre:

systemctl stop mysql

O ProxySQL detectará a queda através do seu mecanismo de monitoramento (que verifica a resposta TCP e, opcionalmente, executa uma query de verificação). Após alguns segundos (configurável via monitor_connect_interval e monitor_ping_interval no arquivo de configuração), o servidor será marcado como OFFLINE-HG ou removido do pool. Se você tiver configurado regras para failover, o ProxySQL pode redirecionar as escritas para a réplica, tornando-a temporariamente mestre (configuração mais avançada que requer replicação bidirecional ou uso de ferramentas como MHA/Orchestrator).

9. Considerações Finais sobre Segurança

A segurança é primordial ao expor um proxy de banco de dados. Além de alterar as senhas padrão do admin:

  • Firewall: Restrinja o acesso à porta 6032 (admin) e 6033/3306 (cliente) apenas aos IPs das suas aplicações e administradores.
  • TLS/SSL: Configure certificados TLS no ProxySQL para criptografar o tráfego entre a aplicação e o proxy, e entre o proxy e os backends. Isso evita sniffing de senhas e dados sensíveis na rede interna.
  • Logs: Ative o log de queries lentas e auditoria para monitorar padrões de uso anômalos.

O ProxySQL é uma ferramenta poderosa que, quando bem configurada, transforma a infraestrutura de banco de dados em um componente escalável e resiliente. Ao integrar balanceamento de carga, separação de leituras/escritas e alta disponibilidade, você garante que sua aplicação não sofra com gargalos de I/O ou indisponibilidade durante picos de tráfego.

Lembre-se de testar rigorosamente qualquer mudança em um ambiente de staging antes de aplicar em produção. O tuning é um processo iterativo: monitore as métricas, ajuste os pesos e intervalos de monitoramento, e adapte a configuração à carga real do seu negócio.

Compartilhar: Link copiado!
Esse tutorial foi útil?

Comentários (0)

Seja o primeiro a comentar.

Deixe seu comentário

Seu comentário será analisado antes de ser publicado.

0/2000