Data

26 jan, 2009

Balanceamento de carga no MySQL – Parte 02

Publicidade

Olá, pessoal. Na coluna desta semana continuarei a mostrar como implementar o balanceamento de carga entre servidores MySQL utilizando o software livre chamado MySQL Proxy.

Antes de prosseguir, recomendo a todos os leitores conferirem a primeira parte deste artigo, onde mostrei como o ambiente funcionava antes da implementação do balanceamento de carga e como o ambiente vai funcionar após o balanceamento. Destaco que o balanceamento explicado neste artigo vai dividir as instruções enviadas para os servidores de forma alternada e, mesmo com o balanceamento, é preciso utilizar alguma outra técnica que permita a sincronização entre os bancos de dados.

A partir do diagrama mostrado no artigo anterior, precisamos fazer duas instalações novas: um MySQL no servidor 192.168.1.35 e o MySQL Proxy no servidor 192.168.1.15.

A instalação do MySQL no servidor 192.168.1.35 deve ser feita da mesma maneira que o servidor já existente, isto é, o MySQL no servidor 192.168.1.35 deve conter todas as opções e configurações do servidor 192.168.25, pois a idéia é que o balanceamento de carga funcione de forma transparente para a aplicação. Além disso também é preciso transferir todo o conteúdo do banco de dados para este novo servidor, incluindo o mesmo nome do banco de dados, os usuários, objetos e permissões. Em resumo, é preciso primeiro duplicar completamente o ambiente do servidor 192.168.1.35 para o servidor 192.168.1.25, tomando cuidado com as configurações.

Com os dois servidores MySQL configurados e idênticos, o que devemos fazer em seguida é instalar o MySQL Proxy no servidor 192.168.1.15. Este servidor não precisa conter um MySQL e, como ele vai apenas redirecionar o tráfego de rede fazendo o balanceamento de carga, ele também não precisa ser dedicado. Em geral podemos utilizar um computador que não seja topo de linha, pois o redirecionamento feito pelo MySQL Proxy é leve e não consome muitos recursos.

Para fazer a instalação do MySQL Proxy não tem muito segredo: basta escolher o sistema operacional e o tipo de instalação. Existem arquivos binários para o Windows, Linux e outros sistemas operacionais. Se o desenvolvedor desejar, ele pode fazer o download do código fonte e compilar o MySQL Proxy no seu ambiente. O link para o download do MySQL Proxy é o seguinte: http://dev.mysql.com/downloads/mysql-proxy/

Neste exemplo eu utilizei o código fonte e compilei o MySQL Proxy 0.6.1 no servidor 192.168.1.15, que possuía o sistema operacional linux Ubuntu. A compilação é simples e não requer nenhum pacote além do que geralmente encontramos no Ubuntu. Para aqueles que não estão acostumados a compilar programas no linux, eu recomendo dar uma olhada no artigo onde mostro como compilar o FreeTDS, uma biblioteca que permite o acesso ao SQL Server a partir do Linux.

Depois de compilar o MySQL Proxy, devemos iniciá-lo como um programa que será executado em background, ou seja, como um deamon. É interessante notar que quando iniciamos o MySQL Proxy temos a possibilidade de fornecer um arquivo com um código fonte em Lua, uma linguagem de programação um tanto quanto diferente.

O objetivo de se utilizar um programa em Lua com MySQL Proxy é permitir que possamos aplicar transformações no que está sendo enviado para o MySQL e também no que está sendo retornado. Por exemplo: vamos supor que um DBA detecte que a maioria dos programadores se esquece de utilizar vírgulas quando enviam o comando select. O DBA pode criar um programa em LUA que recebe o comando enviado para o MySQL e automaticamente insere as devidas vírgulas no comando, para que isso não gere um erro que será retornado ao desenvolvedor. Outro exemplo pode ser adicionar uma coluna a todo o resultado que é retornado pelo MySQL. Isso pode facilitar a implementação de colunas virtuais que não existem no modelo de dados mas são necessárias para a aplicação funcionar corretamente. Obviamente, a utilização deste tipo de tecnologia gera impacto em vários aspectos que envolvem desde o treinamento até o design do banco de dados.

Além disso, o MySQL Proxy permite utilizar estes “ganchos” de modificação de instruções e resultados para implementar outras finalidades. Por exemplo, é possível implementar um programa em Lua que monte um balanceamento de carga mais inteligente e que considere a carga de processos do MySQL ou a sua quantidade de recursos disponíveis antes de redirecionar as conexões. Isso permite a customização de políticas de redirecionamento para tornar o balanceamento de carga mais robusto e inteligente.

Aqui cabe uma recomendação pessoal: usem o recurso de troca de instruções e modificação de resultados com cuidado. Para quem se interessou por este assunto há uma grande quantidade de exemplos em Lua no site do MySQL Proxy.

A utilização do MySQL Proxy como um servidor de balanceamento de carga de forma alternada é feita automaticamente pelo MySQL Proxy e não requer a programação em Lua. Para isso, basta iniciar o deamon e passar os endereços IP dos servidores com suas respectivas portas no parâmetro –proxy-backend-address, como a Figura 1 mostra.

Figura 1. Iniciamento o MySQL Proxy.Figura 1. Iniciamento o MySQL Proxy.

Após iniciar o MySQL Proxy, o número do processo (PID) no sistema operacional é retornado, que no exemplo da Figura 1 é 31296. A Figura 1 também mostra o comando ps -A | grep my, que traz a lista de processos do sistema operacional cujo nome começa com my, o que inclui o MySQL Proxy.

Pronto. A partir deste momento o balanceamento de carga já está funcionando. Podemos montar um exemplo para testar como está sendo feito o redirecionamento de conexões. No servidor 192.168.1.25 (Ubuntu02) podemos testar o balanceamento abrindo uma conexão local com MySQL Monitor e executar o comando show processlist antes e depois de uma nova conexão feita a partir do servidor 192.168.1.15 (Ubuntu01). O resultado das execuções dos comandos é mostrados na Figura 2.

Figura 2. Mostrando a lista de processos no servidor 192.168.1.25.Figura 2. Mostrando a lista de processos no servidor 192.168.1.25.

Na Figura 2 podemos notar que a conexão cujo ID interno do MySQL é 11 é local, ou seja, o próprio MySQL Monitor, e a conexão cujo ID é 13 foi encaminhada pelo MySQL Proxy.

Em seguida podemos fazer o mesmo teste no servidor 192.168.1.35 (Ubunut03), ou seja, abrir uma conexão local neste servidor e depois abrir uma conexão a partir do servidor 192.168.1.15 para testar o balanceamento. Isso é mostrado na Figura 3.

Figura 3. Mostrando a lista de processos no servidor 192.168.1.35.Figura 3. Mostrando a lista de processos no servidor 192.168.1.35.

Podemos ver na Figura 3 que existem dois processos internos no MySQL: o processo cujo ID interno é 5 é o processo local, ou seja, o MySQL monitor; o processo cujo ID é 6 foi encaminhado pelo MySQL Proxy.

Com isso testamos o balanceamento, pois a primeira conexão do servidor 192.168.1.5 foi encaminhada para o MySQL 192.168.1.25 e a segunda conexão foi encaminhada para o MySQL 192.168.1.35. Notem que os usuários podem se conectar diretamente nos servidores, pois o acesso direto não foi bloqueado. Porém é interesse bloquear o acesso direto, utilizando o iptables do Linux ou outro meio, pois com este bloqueio todos os usuários serão forçados a utilizar sempre o balanceamento de carga.

Neste exemplo que montamos o MySQL Proxy também redirecionará as conexão apenas para servidores que estiver on-line. Por exemplo: se o servidor 192.168.1.25 (Ubuntu02) falhar, o MySQL Proxy automaticamente redirecionará as novas conexões para o servidor que sobrou no balanceamento, que no exemplo é 192.168.1.35 (Ubuntu03). Isso implementa uma técnica simples de tolerância a falhas.

Também é possível utilizar uma recurso do MySQL Proxy chamado módulo admim para administrar quantos servidores MySQL estão envolvidos com o MySQL Proxy. Porém até a versão 0.6.1 ainda não era possível inserir e retirar servidores MySQL do balanceamento de carga sem parar o serviço completamente.

O MySQL Proxy ainda é um produto em desenvolvimento. Porém ele apresenta uma idéia muito boa e possui diversos recursos interessantes. Vale a pena considerar a sua utilização em determinados cenários quando se deseja implementar o balanceamento de carga entre servidores MySQL por meio de software.

Com isso terminamos a segunda parte do artigo que explica como montar uma solução de balanceamento de carga no MySQL utilizando o MySQL Proxy. Na próxima coluna continuaremos falando sobre o MySQL explicando como montar uma replicação entre servidores MySQL.

É isso aí, pessoal, um grande abraço e até a próxima!