Fala galera. Neste post vou falar um pouco sobre o ProxySQL . O ProxySQL é um proxysql para que implementa o protocolo do MySQL o que lhe permite fazer coisas que outros proxies não fazem. Ele vem ganhando muita atenção nos últimos tempos e é capaz de integrar com vários produtos do ecossistema MySQL, como Replicação (master – slave), Percona XtraDB Cluster e Group Replication. Uma das funcionalidades mais úteis (que faz o produto se destacar perante os demais) é a habilidade de escalar escritas para os slaves , ele é capaz de identificar que tipo de query está sendo recebida (Escrita ou Leitura) e enviar a query para o master ou para o(s) slave(s). Isso tudo sem ter que alterar uma linha de código na aplicação.
Neste artigo vou abordar alguns pontos importantes para entendermos como o proxy funciona.
Instalação
A Instalação pode ser feita das seguintes maneiras:
- Baixando a os pacotes para a sua versão de sistema operacional (rpm / deb) do repositório oficial no github https://github.com/sysown/proxysql/releases :
sudo yum install https://github.com/sysown/proxysql/releases/download/v1.4.9/proxysql-1.4.9-1-centos7.x86_64.rpm
- Baixando a os pacotes para a sua versão de sistema operacional (rpm / deb) do site da Percona https://www.percona.com/downloads/proxysql/ :
sudo yum install https://github.com/sysown/proxysql/releases/download/v1.4.9/proxysql-1.4.9-1-centos7.x86_64.rpm
- Instalando o repositório da Percona para a sua versão de sistema operacional (preferido):
sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm sudo yum install proxysql
sudo yum install https://github.com/sysown/proxysql/releases/download/v1.4.9/proxysql-1.4.9-1-centos7.x86_64.rpm
Agora só precisamos iniciar o serviço
sudo service proxysql start
Interfaces
ProxySQL faz uma divisão da área de administração do proxy com a área em que as aplicações conectam e executam queries. A área de administração escuta na porta 6032 e a área para as aplicações escuta na 6033 (3306 ao contrário).
Camadas
Outra parte importante para entender como o proxy funciona são as camadas que ele utiliza, vou utilizar parte do diagrama oficial (disponível aqui) para explicar:
+-------------------------+ | 1. RUNTIME | +-------------------------+ /|\ | | | | | | \|/ +-------------------------+ | 2. MEMORY | +-------------------------+ /|\ | | | | | | \|/ +-------------------------+ | 3. DISK | +-------------------------+
ProxySQL sempre vai ler as informações da camada 1.Runtime que reside em memória.
Quando conectamos na porta 6032 sempre vamos estar conectados a camada 2.Memory, que como o nome diz, reside em memória.
E Por final, temos a camada 3.Disk, como as demais camadas residem em memória, precisamos de uma camada para persistir os dados em disco.
Qual o benefício deste layout? Ele nos permite realizar várias alterações e aplicar elas somente no momento em que terminamos todas elas, podemos fazer uma analogia a transações, aonde depois de executar várias queries, executamos um commit.
Quando o proxysql iniciar, ele lê os dados do disco para a memória e lê os dados da memória para runtime. Quando realizarmos uma alteração, vamos estar manipulando a memória, vamos daí executar um comando LOAD MYSQL [SERVERS | USERS | QUERY RULES] TO RUNTIME
para ler os dados da memória para runtime, e conseqüentemente, vamos executar um SAVE MYSQL [SERVERS | USERS | QUERY RULES] TO DISK
para salvar os dados da memória para o disco.
Hostgroups
ProxySQL agrupa servidores em algo chamado hostgroup. Em uma topologia em que temos um master e dois slaves, vamos criar o HostGroup(HG) 1 e especificar que o master faz parte dele, e vamos criar o HG2 e especificar que ambos os slaves fazem parte dele. A criação de HG é feita juntamente com a inserção de servidores na tabela mysql_servers
e não existe uma numeração fixa. Você pode atribuir a número/ID que quizer. Posteriormente, vamos configurar usuários e regras para queries que vão identificar se a query é uma leitura, ela deve ser direcionada para o HG 2 (leitura / aonde estão nossos slaves) e o proxysql vai enviar a query para um dos servidores presentes neste HG. Caso a query não seja uma leitura, ela vai ser direcionada para o HG de escrita.
Autenticação
ProxySQL possui funcionalidades como firewall por exemplo, em que você pode bloquear uma query de ser executada. Uma vez que o proxy identifica esta query, ele retorna uma mensagem de erro, sem mesmo ter enviado ela para algum hostgroup. Para que funcionalidades como esta sejam possíveis o proxy requer uma autenticação além da autenticação no servidor do MySQL. Para que um usuário do MySQL possa conectar via ProxySQL temos que criar o mesmo no proxy.
Fica aqui um link de uma apresentação que fiz a um tempo atrás referente a algumas features do ProxySQL – https://www.slideshare.net/MarceloAltmann/proxy-sql-para-mysql
Agora que você entendeu um pouco de como funciona o ProxySQL, já pode começar a utilizar / testar em suas aplicações.