Não quebre sua produção: Como o ProxySQL Mirror antecipa erros no MySQL 8.4

Com a chegada das versões LTS, upgrades para versões mais recentes se tornam cada vez mais comuns, visto que, em média, a cada dois anos teremos uma nova versão LTS. Com novas versões e novos comandos, o mais importante são os comandos obsoletos ou novas palavras reservadas, que causarão problemas se não forem verificados previamente.
Comumente, replicações fazem um pouco desse trabalho com os DDL e DML executados via replicação, mas e os selects e comandos que não são escritos no binlog? Como verificar?
Neste blog, iremos explicar como podemos testar diferentes tipos de queries antes de realizar a migração utilizando o ProxySQL mirror.

Ambiente / Premissas

Para esse blog a seguir, favor considerar as seguintes informações de servidor:

  • MySQL 8.0 no hostgroup_id=1 — produção, recebe e responde a aplicação.
  • MySQL 8.4 no hostgroup_id=2 — servidor rodando a nova versão, recebe os selects do tráfego via mirror.
  • ProxySQL ≥ 2.7 na frente da aplicação.
  • Réplica 8.4 sincronizada: replicação async do 8.0 para o 8.4.
  • Ressalva: configuração básica do ProxySQL (instalação, mysql_users, mysql_servers) não será coberta neste post.
Como o ProxySQL Mirror funciona

O ProxySQL permite via configuração na tabela mysql_query_rules duplicar uma query que será roteada para o hostgroup de produção para outro hostgroup. O cliente irá eceber apenas a resposta do hostgroup principal, nesse caso o valor cadastrado na coluna destination_hostgroup, a cópia é executada mas o ProxySQL não irá devolver o resultado da execução para o cliente.

Configurando a regra de mirror

Para configurar as regras de mirror no ProxySQL existem 2 colunas na tabela mysql_query_rules:
mirror_hostgroup: hostgroup que receberá a cópia da query.
mirror_flagOUT: |Opcional| Define a flagIN que a query mirrorada vai assumir ao reentrar na engine de mysql_query_rules — útil para aplicar rewrites ou regras específicas só no espelho.

No exemplo abaixo iremos apenas utilizar a coluna mirror_hostgroup:

Para verificar a execução em ambos nós, iremos utilizar o slow query log com as seguintes configurações:

Após executar o seguinte select via ProxySQL:

É possível verificar o mesmo select no slow query log de ambos servers:

MySQL 8.0:

MySQL 8.4:

No exemplo acima, conseguimos ver que o espelhamento está funcionando corretamente, porém, o que acontece se executarmos uma query que funcionará no MySQL 8.0, mas não funcionará no 8.4?

Iremos encontrar a query no slow query log do 8.0, mas não iremos encontrar a mesma no 8.4:

Podemos então verificar nas tabelas de status do ProxySQL se houve algum erro nessa query:

Conforme visto acima, é possível verificar que houve um erro de sintaxe devido à palavra parallel, que no MySQL 8.4 se tornou uma palavra reservada.

Ok, encontramos o erro e tenho conhecimento de uma possível solução. Neste caso, podemos utilizar a configuração mirror_flagOUT para testar como a solução se comportaria no MySQL 8.4, mantendo os testes de workload. Por exemplo:

 

#Note que a coluna mirror_flagOUT precisará de uma query rule em que a coluna flagIn combine, para que a regra com flagIn seja utilizada na query espelhada. No exemplo abaixo, a query espelhada será executada no destination_hostgroup 2 e, onde estiver a palavra parallel, será reescrita com parallel, para que possamos utilizar a palavra reservada no MySQL 8.4.

Feita a configuração, este é o resultado pós-execução do mesmo select no slow query log de ambos os serviços MySQL:

8.0:

8.4:

Como possível ver acima a regra alterou como esperada a escrita da palavra parallel, o que permitiu a execução da query no MySQL 8.4.

Conclusão

ProxySQL Mirror não substitui a utilização do pt-upgrade ou do util.checkForServerUpgrade() no MySQL Shell, mas cobre uma lacuna importante: o tráfego real, incluindo comandos que não são replicados pelo binlog. Em poucas linhas de configuração você ganha um canal de teste contínuo contra a versão alvo do upgrade, e descobre problemas como o caso acima utilizado a palavra agora reservada ‘parallel’ ou outras sintaxes deprecadas quebrando no 8.4 antes do dia da virada.

Combine mirror + análise de stats_mysql_errors + checkForServerUpgrade e você irá cobrir possíveis surpresas em um upgrade no MySQL: schema, queries de aplicação e tráfego operacional.

Fonte:

https://dev.mysql.com/doc/refman/9.7/en/keywords.html
https://proxysql.com/documentation/mirroring/
https://proxysql.com/documentation/main-runtime/mysql-tables#mysql_query_rules
https://proxysql.com/documentation/the-admin-schemas/stats/stats-mysql#stats_mysql_errors

COMPARTILHE:
Picture of Roberto de Bem

Roberto de Bem

Roberto de Bem é Database Engineer na Percona e entusiasta de Open Source. Sempre que possível, contribuo com pull requests, principalmente para projetos e produtos da Percona. Formado em Sistemas de Informação, trabalha com bancos de dados desde 2017, com foco em MySQL. Oracle Certified Professional – MySQL 8.0. Oracle ACE Apprentice.
Picture of Roberto de Bem

Roberto de Bem

Roberto de Bem é Database Engineer na Percona e entusiasta de Open Source. Sempre que possível, contribuo com pull requests, principalmente para projetos e produtos da Percona. Formado em Sistemas de Informação, trabalha com bancos de dados desde 2017, com foco em MySQL. Oracle Certified Professional – MySQL 8.0. Oracle ACE Apprentice.

PARTICIPE

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

POSTADO POR
Picture of Roberto de Bem

Roberto de Bem

Roberto de Bem é Database Engineer na Percona e entusiasta de Open Source. Sempre que possível, contribuo com pull requests, principalmente para projetos e produtos da Percona. Formado em Sistemas de Informação, trabalha com bancos de dados desde 2017, com foco em MySQL. Oracle Certified Professional – MySQL 8.0. Oracle ACE Apprentice.
PARCEIROS