Seções iMasters
MySQL

Balanceamento de carga no MySQL – Parte 1

Olá pessoal. Na coluna desta semana iniciarei uma série de artigos que vão mostrar como implementar algumas técnicas avançadas no MySQL. Desta vez mostrarei como implementar o balanceamento de carga entre servidores MySQL utilizando o software livre MySQL Proxy.

Geralmente eu escrevo sobre SQL Server aqui para o iMasters, porém em 2009 resolvi diversificar um pouco os assuntos. Esta é apenas uma das mudanças que pretendo colocar em prática aqui no espaço que tenho reservado para o iMasters. Devido a isso aconselho aos leitores fiquem ligados, por muita coisa legal ainda vem por aí.

A motivação para escrever uma coluna sobre o MySQL Proxy se apóia basicamente em dois fatores: 1) Eu achei bem interessante a idéia deste software e creio que ele proporcionará muitas oportunidades tanto para desenvolvedores como para DBAs; e 2) Infelizmente não encontrei materiais didáticos em português sobre este assunto. Sendo assim, resolvi escrever um artigo que mostrará um exemplo simples de configuração do MySQL Proxy no Linux em duas partes. Na primeira parte veremos a arquitetura do sistema e na segunda parte veremos como configurar o MySQL Proxy.

Antes de apresentar a arquitetura e começar a detalhar os passos necessários para a configuração do MySQL Proxy é preciso esclarecer alguns aspectos de como vai funcionar o balanceamento de carga. A idéia deste software é agir como um intermediário entre a aplicação e o banco de dados MySQL. Para facilitar o entendimento podemos ver uma visão geral do MySQL Proxy apresentada na Figura 1.

Figura 1. Visão geral do MySQL Proxy.Figura 1. Visão geral do MySQL Proxy.

O primeiro passo da Figura 1 é o envio de uma query do Cliente para o Servidor. Esta query pode ser qualquer instrução MySQL enviada por uma aplicação ou ferramenta que se conecta o banco de dados. A query é enviada para o servidor que contém o MySQL Proxy, que a receberá e poderá aplicar diversas transformações, como verificações para evitar a vulnerabilidade query injection, filtros, reescrita e redirecionamento de instruções dentre outras. Após as modificações a query é enviada para o servidor MySQL, como o passo 2 demonstra. O servidor então processa a instrução normalmente e devolve o resultado no passo 3. Neste ponto o MySQL Proxy pode modificar o resultado de maneira semelhante à modificação da query. Por fim o resultado é apresentado para o cliente no passo 4.

O MySQL Proxy age de forma transparente, ou seja, nem a aplicação cliente e nem o MySQL sabem que o MySQL Proxy está sendo utilizado. Esta característica facilita a utilização desta ferramenta e expande o leque de possibilidades tanto para o desenvolvedor como para quem administra o MySQL. Isso quer dizer que podemos montar muitas soluções com o MySQL Proxy além do balanceamento de carga. Tudo vai depender de como e do tipo de tratamento que desejamos aplicar às instruções enviadas para o banco de dados e ao retorno dos dados para o cliente.

Dentre as várias funções do MySQL Proxy podemos utilizá-lo para a implementação de um balanceamento de carga. A idéia deste balanceamento é que as instruções enviadas inicialmente para um servidor possam ser encaminhadas de alguma forma lógica para mais de um servidor sem que haja nenhuma modificação na aplicação e que a carga seja distribuída. A maneira pela qual a carga será distribuída e como este balanceamento será aplicado depende de vários fatores. Neste artigo mostrarei um exemplo simples de balanceamento de carga que utiliza o algoritmo Round Robin, isto é, a alternância entre os servidores envolvidos.

Antes de começar a explicar a implementação do MySQL Proxy é preciso dizer que ele ainda está em constante desenvolvimento e funciona apenas para o Linux. No final da segunda parte do artigo apresentarei alguns links que explicam em detalhes as funcionalidades atuais e o que está sendo planejado para as próximas versões.

Para entender o exemplo vamos observar o diagrama da Figura 2, que representa a utilização de um sistema por vários usuários. Este sistema se conecta ao servidor MySQL indicado pelo endereço I.P. 192.168.1.25. Neste cenário os clientes utilizam a aplicação normalmente se conectando no servidor Linux chamado Ubuntu02 cujo endereço I.P é 192.168.1.25. Este cenário não contém nenhum tipo de balanceamento de carga ou tolerância a falhas.

Figura 2. Ambiente sem balanceamento de carga.Figura 2. Ambiente sem balanceamento de carga.

A partir do ambiente apresentado na Figura 2 vamos montar um balanceamento de carga que envolverá mais dois servidores: um que conterá o MySQL Proxy e outro que conterá outro servidor MySQL com o mesmo banco de dados que está sendo utilizado pela aplicação. Notem que poderíamos utilizar mais de dois servidores de bancos de dados de acordo com a necessidade. A idéia aqui é que o servidor que conterá o MySQL Proxy apenas faça o roteamento das conexões distribuindo igualmente a carga entre os dois servidores de bancos de dados de forma alternada. Desta maneira teremos o balanceamento de carga e também a tolerância a falhas, pois se um servidor não estiver disponível o MySQL Proxy automaticamente redirecionará as novas conexões para o servidor disponível. A Figura 3 apresenta o cenário com o balanceamento de carga e a tolerância a falhas.

Figura 3. Ambiente com balanceamento de carga e tolerância a falhasFigura 3. Ambiente com balanceamento de carga e tolerância a falhas

Do ponto de vista da aplicação a única mudança que deve ser feita é a mudança da conexão com o banco de dados: antes a conexão era feita para o servidor 192.168.1.25 e agora a conexão será para o servidor 192.168.1.15. Um detalhe importante é que o MySQL Proxy não requer que o MySQL seja instalado no mesmo servidor, ou seja, o servidor 192.168.1.15 não precisar ter o MySQL instalado.

Outro ponto muito importante é que o MySQL Proxy redirecionará as conexões de forma alternada, o que pode acarretar em falta de sincronia entre os dois servidores. Por exemplo, se um usuário A se conectar ao servidor Ubuntu02 e fizer uma instrução UPDATE nos dados de uma tabela este UPDATE não será redirecionado para o servidor Ubuntu03, deixando os bancos de dados fora de sincronia. Para resolver esta questão podemos implementar uma replicação ou mesmo um cluster entre os servidores Ubuntu02 e Ubuntu03, porém este será o assunto dos próximos artigos. Aqui veremos como configurar o MySQL Proxy para implementar o balanceamento de carga.

Outro ponto a ser considerado é o ponto de falha representado pelo servidor Ubuntu01. Se ele ficar off-line a aplicação não poderá se conectar a nenhum dos bancos de dados. Para isso existe como configurar um outro MySQL Proxy em um outro servidor de modo que ele detecte esta falha. Porém no exemplo não apresentarei como fazer isso, pois se trata de um tópico mais avançado. Além disso existem outras foras de trabalhar com tolerância a falhas no Linux que envolvem a configuração de endereços I.P virtuais diretamente no kernel. Apenas para referência, uma dessas aplicações que fazem a criação de endereços I.P. virtuais no Linux é o Ultra Monkey com os módulos do kernal IPVS.

Com isso terminamos a primeira parte do artigo que explicará como montar uma solução de balanceamento de carga no MySQL utilizando o MySQL Proxy. Na próxima coluna veremos como configurar o MySQL passo a passo e como testar as conexões.

Comente também

4 Comentários

Welinton Munhoz

Há tempos não via um artigo tão bom, valeu por abordar mais assuntos em 2009 incluindo o MySQL em seus artigos.
Não vejo a hora de ver a 2° parte onde creio eu que abordará a replicação do BD.

Abraços.

Fabio Rodrigues Sodre

Estou ancioso para ver a continuação deste artigo. Bem explicado! parabéns

Marcio dalago

Parabéns pelo artigo, muito bom.

Wagner Bianchi

Olá Mauro,

Achei bastante interessante o artigo e como sempre, mais um artigo muito bem escrito com boa condução do tema e didática.

Queria comentar este ponto, mencionado no artigo:

“Antes de começar a explicar a implementação do MySQL Proxy é preciso dizer que ele ainda está em constante desenvolvimento e funciona apenas para o Linux.”

O MySQL-Proxy está sendo muito difundido no mundo inteiro, entre usuários administradores de bancos de dados MySQL e por isso, a MySQL já soltou versões com suporte a vários sistema operacionais, dentre os quais:

Linux (including RedHat, Fedora, Debian, SuSE) and derivatives.

Mac OS X
FreeBSD
IBM AIX
Sun Solaris
Windows

As informações de plataformas suportadas ainda se encontram desatualizadas no manual. Podemos confirmar tal suporte após acessarmos a página de download do MySQL-Proxy, que apresenta versões do software desenvolvido em LUA para as muitas plataformas.

Belo Artigo Mauro!!

Parabéns!!

Qual a sua opinião?